2019你該掌握的開源日志管理平台ELK STACK


 

轉載於https://www.vtlab.io/?p=217

企業級開源日志管理平台ELK VS GRAYLOG一文中,我簡單闡述了日志管理平台對技術人員的重要性,並把ELK Stack和Graylog進行了標記。本篇作為“企業級開源日志管理平台”的延伸,基於我在生產環境中的使用經驗,向讀者介紹ELK Stack的安裝與配置。不足之處,還望指正。

架構

Beats工具收集各節的日志,以list數據結構存儲在Redis中,Logstash從Redis消費這些數據並在條件匹配及規則過濾后,輸出到Elasticsearch,最終通過kibana展示給用戶。
architecture

環境介紹

Elastic Stack的產品被設計成需要一起使用,並且版本同步發布,以簡化安裝和升級過程。本次安裝,采用最新的6.5通用版。完整堆棧包括:
1. Beats 6.5
2. Elasticsearch 6.5
3. Elasticsearch Hadoop 6.5(不在本次介紹范圍)
4. Kibana 6.5
5. Logstash 6.5
操作系統CentOS7.5,JDK需要8及以上版本。
官方介紹的安裝途徑包括:tar包安裝、rpm包安裝、docker安裝、yum倉庫安裝,我使用RPM包安裝。

系統設置

Elasticsearch默認監聽127.0.0.1,這顯然無法跨主機交互。當我們對網絡相關配置進行修改后,Elasticsearch由開發模式切換為生產模式,會在啟動時進行一系列安全檢查,以防出現配置不當導致的問題。
這些檢查主要包括:
1. max_map_count:Elasticsearch默認使用混合的NioFs( 注:非阻塞文件系統)和MMapFs( 注:內存映射文件系統)存儲索引。請確保你配置的最大映射數量,以便有足夠的虛擬內存可用於mmapped文件。此值設置不當,啟動Elasticsearch時日志會輸出以下錯誤:
[1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

解決方法:

# vim /etc/sysctl.conf
vm.max_map_count=262144
# sysctl -p
Shell
  1. 修改最大文件描述符
# vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
Shell
  1. 修改最大線程數
# vim /etc/security/limits.conf
* soft nproc 4096
* hard nproc 4096
Shell

注意:通過RPM包或YUM形式安裝,Elasticsearch會自動優化這些參數,如果采用tar包的形式安裝,除了手動修改這些配置,還需要創建啟動Elasticsearch程序的系統用戶,Elasticsearch不允許以root身份運行。

安裝

安裝順序:
1. Elasticsearch
2. Kibana
3. Logstash
4. Beats

安裝Elasticsearch

  1. 導入Elasticsearch PGP key,使用Elasticsearch簽名密鑰(PGP key D88E42B4,可從https://pgp.mit.edu獲得)和fingerprint對所有包進行簽名:
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
Shell
  1. 下載安裝RPM包
# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.rpm
# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.rpm.sha512
# sha512sum -c elasticsearch-6.5.4.rpm.sha512 #比較RPM包的SHA和應輸出的已發布校驗和,輸出 elasticsearch-6.5.4.rpm: OK
# rpm --install elasticsearch-6.5.4.rpm
Shell
  1. 配置文件
    Elasticsearch包含三個配置文件:
    elasticsearch.yml:配置Elasticsearch
    jvm.options:設置Elasticsearch堆棧大小,對JVM進行優化
    log4j2.properties:定義Elasticsearch日志
    這些文件的默認位置取決於安裝方式。tar包形式的配置文件目錄$ES_HOME/config,RPM包默認位置/etc/elasticsearch/。
    elasticsearch.yml文件采用yaml格式,以修改路徑為例:
path: data: /var/lib/elasticsearch logs: /var/log/elasticsearch or path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch 
YAML

elasticsearch.yml文件也支持環境變量,引用環境變量的方法${…},例如:

node.name: ${HOSTNAME} network.host: ${ES_NETWORK_HOST} 
YAML

jvm.options文件包含以下格式:
行分割;
空行被忽略;
以#開頭表示注釋;
以-開頭的行被視為獨立於JVM版本,此項配置會影響所有版本的JVM;
數字開頭,后面跟一個:和一個-號的行,只會影響匹配此數字的JVM版本,例如:8:-Xmx2g,只會影響JDK8;
數字開頭跟一個-號再跟一個數字再跟一個:,定義兩個版本之間,且包含這兩個版本,例如8-9:-Xmx2g,影響JDK8,JDK9。
注意:在配置中,應保證JVM堆棧min和max的值相同,Xms表示總堆棧空間的初始值,XmX表示總堆棧空間的最大值。

# cat /etc/elasticsearch/elasticsearch.yml cluster.name: vtlab #集群名稱,只有cluster.name相同時,節點才能加入集群。請設置為具有描述性的名字。不建議在不同環境中使用相同的集群名。 node.name: vtlab01 #節點描述名稱,默認情況下,Elasticsearch將使用隨機生成的UUID的前7個字符作為節點id。設為服務器的主機名 node.name: ${HOSTNAME} node.attr.rack: r1 #指定節點的部落屬性,機架位置,比集群范圍更大。 path.data: /var/lib/elasticsearch #Elasticsearch的數據文件存放目錄 如果是默認位置,在將Elasticsearch升級到新版本時,很可能會把數據刪除。 path.logs: /var/log/elasticsearch #日志目錄 bootstrap.memory_lock: true #啟動后鎖定內存,禁用swap交換,提高ES性能。伴隨這個參數還需要調整其他配置,后面討論。 network.host: 0.0.0.0 #指定監聽的地址 http.port: 9200 #監聽的WEB端口 discovery.zen.ping.unicast.hosts: #默認網絡配置中,Elasticsearch將綁定到回環地址,並掃描9300-9305端口,試圖連接同一台服務器上的其他節點,可以自動發現並加入集群。 - 10.0.0.46:9300 #此端口為TCP傳輸端口,用於集群內節點發現、節點間信息傳輸、ES Java API也是通過此端口傳輸數據,transport.tcp.port定義。9200為HTTP端口。 - 10.0.0.28:9300 - 10.0.0.29:9300 - host1.vtlab.io discovery.zen.minimum_master_nodes: 2 #為防止數據丟失,discovery.zen.minimum_master_nodes設置至關重要,主節點的最小選舉數。避免腦裂,應將此值設為(master_eligible_nodes / 2) + 1,換言之,如果有3個節點,(3/2)+1 or 2 #以下選項僅在完全重啟集群時生效 #本地網關模塊在整個群集重新啟動時存儲群集狀態和分片數據。 #以下靜態設置必須在每個主節點上設置,控制新選擇的主節點在試圖恢復集群狀態和集群數據之前應該等待多長時間: gateway.expected_nodes: 0 #集群中預期的(數據或主)節點數量。一旦加入集群的節點數量達到預期,本地碎片的恢復就會開始。默認值為0 gateway.expected_master_nodes: 0 #集群中預期的主節點數量。一旦加入集群的主節點數量達到預期,本地碎片的恢復就會開始。默認值為0 gateway.expected_data_nodes: 0 #集群中預期的數據節點數量。一旦預期的數據節點數量加入集群,本地碎片的恢復就會開始。默認值為0 gateway.recover_after_time: 5 #如果沒有達到預期的節點數量,則恢復過程將等待配置的時間量,然后再嘗試恢復。如果配置了一個expected_nodes設置,則默認值為5m。 gateway.recover_after_nodes: 1 #只要有這么多數據或主節點加入集群,就可以恢復。 gateway.recover_after_master_nodes: 1 #只要有這么多主節點加入集群,就可以恢復。 gateway.recover_after_data_nodes: 1 #只要有這么多數據節點加入集群,就可以恢復。 action.destructive_requires_name: true #禁用通過api以通配符刪除所有索引。刪除索引時需要指定被刪除的索引名稱。 
YAML

配置文件中,我將bootstrap.memory_lock的值設為了true,啟動時遇到了以下錯誤:
Elasticsearch process memory locking failed
解決此問題,還需要修改三個地方:
1. /etc/sysconfig/elasticsearch

ES_JAVA_OPTS="-Xms4g -Xmx4g" 
MAX_LOCKED_MEMORY=unlimited
Shell

替換4g為總內存的一半(Elasticsearch官方建議是主機總內存的一半)
2. /etc/security/limits.conf

elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
Shell

需要將elasticsearch替換為運行Elasticsearch程序的用戶
3. /usr/lib/systemd/system/elasticsearch.service
取消服務腳本文件/usr/lib/systemd/system/elasticsearch.service中對LimitMEMLOCK=infinity的注釋

LimitMEMLOCK=infinity
Shell

然后運行systemctl daemon-reload命令

# systemctl daemon-reload
Shell
  1. 啟動節點
# systemctl enable elasticsearch
# systemctl start elasticsearch
Shell

Elasticsearch安裝完畢,接下來安裝Kibana。

安裝Kibana

同樣使用RPM的形式安裝
1. 安裝公鑰

# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
Shell
  1. 下載rpm包
# wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.4-x86_64.rpm
# sha512sum kibana-6.5.4-x86_64.rpm 
# rpm --install kibana-6.5.4-x86_64.rpm
Shell
  1. 配置文件
    Kibana啟動時從/etc/kibana/kibana.yml文件里讀取配置信息,配置文件內容如下:
# Default: 5601。定義Kibana后端服務啟動時監聽的端口。 server.port: 5601 # Default: "localhost"。后端服務監聽的地址,需要修改為網卡地址 server.host: "localhost" # 如果前面有代理,可以指定安裝Kibana的路徑。 # 使用server.rewriteBasePath設置告訴Kibana是否應從其收到的請求中刪除basePath,並防止在啟動時發生棄用警告。 # 此設置不能以斜杠(/)結尾。 server.basePath: "" # Default: false # 指定Kibana是否應重寫以server.basePath為前綴的請求,或者要求它們由反向代理重寫。 # 在Kibana 6.3之前,此設置實際上始終為false,在Kibana 7.0中默認為true server.rewriteBasePath: false # Default: 1048576 # 請求服務的最大有效負載,單位字節 server.maxPayloadBytes: 1048576 # Default: "your-hostname"。Kibana服務器的名稱,用於顯示目的。 server.name: "your-hostname" # 用於查詢的Elasticsearch實例的URL elasticsearch.url: "http://localhost:9200" # Default: true # 值為true時,Kibana使用server.host設置中指定的主機名。值為false時,Kibana使用連接到此Kibana實例的主機的主機名 elasticsearch.preserveHost: true # Default: ".kibana" # Kibana使用此索引名存儲Elasticsearch中已保存的搜索、可視化和儀表板。 # 如果索引尚不存在,Kibana會創建一個新索引。 kibana.index: ".kibana" # 要加載的默認應用程序。 kibana.defaultAppId: "home" # 如果Elasticsearch設置了認證,Kibana通過這兩個選項進行Elasticsearch的驗證。 elasticsearch.username: "user" elasticsearch.password: "pass" # Default: "false" # 從Kibana服務器到瀏覽器的傳出請求啟用SSL,當設置為True時,server.ssl.certificate and server.ssl.key必須設置 server.ssl.enabled: false server.ssl.certificate: /path/to/your/server.crt server.ssl.key: /path/to/your/server.key # 可選設置,提供PEM格式SSL證書和密鑰文件的路徑。 # 這些文件用於驗證Kibana到Elasticsearch的身份,並需要在Elasticsearch中的xpack.ssl.verification_mode設置為certificate或full elasticsearch.ssl.certificate: /path/to/your/client.crt elasticsearch.ssl.key: /path/to/your/client.key # 可選設置,使您可以為Elasticsearch實例的證書頒發機構指定PEM文件的路徑列表。 elasticsearch.ssl.certificateAuthorities: [ "/path/to/your/CA.pem" ] # 控制Elasticsearch提供的證書驗證。有效值為none,certificate和full。完整執行主機名驗證,證書不執行 elasticsearch.ssl.verificationMode: full # Defau:elasticsearch.requestTimeout 設置的值,等待Elasticsearch響應ping的時間,單位ms。 elasticsearch.pingTimeout: 1500 # Default:30000ms # 等待來自后端或Elasticsearch的響應時間,必須是正整數。單位ms。 elasticsearch.requestTimeout: 30000 # Default: [ 'authorization' ] # 要發送到Elasticsearch的Kibana客戶端標頭列表。要不發送客戶端標頭,請將此值設置為[](空列表)。 elasticsearch.requestHeadersWhitelist: [ authorization ] # Default: {} # 要發送到Elasticsearch的標頭名稱和值。無論elasticsearch.requestHeadersWhitelist配置如何,客戶端標頭都不能覆蓋任何自定義標頭。 elasticsearch.customHeaders: {} # Default: 30000 # 對Elasticsearch等待碎片響應的時間(以毫秒為單位)。設置為0禁用 elasticsearch.shardTimeout: 30000 # Default: 5000 # 在重試之前在Kibana啟動時等待Elasticsearch的時間(以毫秒為單位) elasticsearch.startupTimeout: 5000 # Default false記錄發送到Elasticsearch的查詢。需要將logging # 記錄發送到Elasticsearch的查詢。需要將logging.verbose設置為true。 # 這對於查看當前沒有檢查器的應用程序生成的查詢DSL非常有用,例如Timelion和Monitoring。 elasticsearch.logQueries: false # PID文件路徑 pid.file: /var/run/kibana.pid # Default: stdout # 日志輸出文件路徑 logging.dest: stdout # Default: false # 此值設為true時,禁止記錄日志 logging.silent: false # Default: false # 當設置為true時,僅記錄error日志 logging.quiet: false # Default: false # 將此值設置為true以記錄所有事件,包括系統使用信息和所有請求。 logging.verbose: false # Default: 5000 # 設置以毫秒為單位的間隔來采樣系統和處理性能指標。最小值是100。 ops.interval: 5000 
YAML
  1. 啟動
# systemctl enable kibana
# systemctl start kibana
Shell

安裝Logstash

  1. 下載
# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.5.4.rpm
# rpm --install logstash-6.5.4.rpm
Shell

安裝Filebeat

Filebeat客戶端是一個輕量級,資源消耗較低的工具,它從服務器的文件中收集日志,並將這些日志轉發到Logstash進行處理。
1. 下載filebeat

# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.4-x86_64.rpm
# rpm -vi filebeat-6.5.4-x86_64.rpm
Shell
  1. 配置文件
vim /etc/filebeat/filebeat.yml
# 定義獲取日志的路徑,可以是目錄或文件: filebeat.inputs: - type: log enabled: true paths: - /var/log/messages tags: [syslog] - type: log enabled: true paths: - /data/logs/nginx/vtlab/*.log tags: [nginx_access] # 配置輸出 output.redis: enable: true #默認true,是否開啟傳輸 hosts: ["10.0.0.26:6379"] #redis服務的IP、端口 db: 1 #選擇redis哪個庫 timeout: 5 #連接redis超時時間,默認5s key: filter_index #數據被傳輸到redis list的名稱 #password: password #連接redis的密碼,如果redis配置文件中沒有設置,則此處不需要填寫 
YAML
  1. 啟動Filebeat
# systemctl enable filebeat.service
# systemctl start filebeat.service
Shell

ELK各組件安裝完成,開始日志收集相關的配置。

Logstash pipeline

Logstash管道包含兩個必要元素Inputs和Outputs,以及一個可選元素Filter。Inputs接收、消費元數據,Filter根據設定過濾數據,Outputs將數據輸出到指定程序,我這里定義的是輸出到Elasticsearch。
我配置了Filebeat輸出message日志和www.vtlab.io 的訪問日志,現在創建Logstash管道接收這些數據。

# vim first-pipeline.conf # 定義Input input { redis { host => "10.0.0.26" type => "redis-input" data_type => "list" db => 1 key => "filter_index" port => 6379 #password => "password" } } # 定義Filter filter{ if "syslog" in [tags] { grok { match => {"message" => "%{SYSLOGBASE2}"} remove_field => "beat.version" remove_field => "beat.name" } } if "nginx_access" in [tags] { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } remove_field => "beat.version" remove_field => "beat.name" } geoip { source => "clientip" # fields => ["city_name", "country_code2", "country_name", "latitude", "longitude", "region_name"] # remove_field => ["[geoip][latitude]", "[geoip][longitude]"] } } } # 定義output output{ if "syslog" in [tags] { elasticsearch { hosts => [ "10.0.0.28:9200","10.0.0.29:9200","10.0.0.46:9200" ] index => "message-%{+YYYY.MM.dd}" } } if "nginx_access" in [tags] { elasticsearch { hosts => [ "10.0.0.28:9200","10.0.0.29:9200","10.0.0.46:9200" ] index => "logstash-nginx-%{+YYYY.MM.dd}" } } } 
YAML

配置文件中,我定義了兩個patterns:”message” => “%{SYSLOGBASE2}”與”message” => “%{COMBINEDAPACHELOG}”,一個匹配系統messages日志,一個匹配Nginx訪問日志,其他日志類型,就需要不同的Patterns了。ELK提供了很多默認的Patterns,也可以自定義。

定義Patterns

一個簡單的方法,通過以下兩個步驟實現:
1. 打開Grokdebug discover頁面,輸入日志內容到文本框,點擊discover按鈕,如下圖:
patterns
2. 打開Grokdebug頁面,按圖中步驟操作,輸出內容就是Patterns。
patterns

啟動Logstash

  1. 啟動前,檢驗first-pipeline.conf配置文件的語法是否正確:
# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/first-pipeline.conf --config.test_and_exit
Configuration OK
[INFO ] 2019-01-07 17:23:32.527 [LogStash::Runner] runner - Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
Shell

輸出中包含以上內容,說明配置文件正確。
2. 啟動指定pipeline:
–config.reload.automatic:開啟自動加載配置,這樣在每次修改配置文件時會自動加載配置文件

# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/first-pipeline.conf --config.reload.automatic
Shell

Kibana UI

日志流已經通過Filebeat、Redis、Logstash進入了Elasticsearch,我們通過Kibana對Elasticsearch做一些可視化的管理,方便查看日志。

創建索引

登錄Kibana頁面,在瀏覽器中輸入 http://10.0.0.21:5601 (10.0.0.21為部署Kibana主機的IP地址,5601是Kibana監聽的端口),如圖:
Kibana
點擊“Management”–>“Index Patterns”–>“Create index pattern”,在Index pattern框中填寫Index name,也就是我們通過Logstash輸出到Elasticsearch時的索引名”message-*”和”logstash-nginx-*”,點擊Next step,在“Time Filter field name”中選擇“@timestamp”,最后點擊“Create index pattern”完成索引創建。
經過以上的步驟,就可以在Kibana的discover中依照索引查看日志了。

通過GeoIP展示用戶分布

我在Logstash的filter插件部分進行了GeoIP相關的配置,現在我演示下將用戶的分布按照地圖展示出來。Kibana的圖形化可謂豐富多姿,其他的就交給讀者自己探索了。
1. 點擊左側導航欄“Dashboard”–>“Create new dashboard”
2. 點擊頁面中間的“add”標簽,如果之前在Visualize中創建過地圖,可以通過搜索名字添加,沒有的話,需要先在Visualize中創建
3. 點擊“Add new Visualization”,選擇Maps下的“Coordinate Map”
4. 選擇我們需要創建地圖的索引“logstash-nginx”
5. 點擊“Geo Coordinates”,選擇“Geohash”
6. 點擊“Options”調整顏色及圖例說明位置
7. 點擊頁面右上角的“Save”按鈕,創建完成
user_map

安全

細心的讀者朋友可能已經發現了,登錄kibana的時候,頁面並沒有驗證功能,任何能訪問Kibana地址的人,都能查詢日志,這對我們來說是不可接受的。
改進方法:
1. X-Pack:Kibana本身不提供認證機制,需要通過X-Pack插件來實現。X-Pack是付費插件,可以申請License獲取一年期的免費試用。
2. Nginx:通過htpasswd創建用戶及密碼,進行Kibana認證。

結尾

ELK Stack包含的功能太多了,這里只介紹了些常用功能,足以應付日常所需,更多功能,還需深入探索。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM