2019你該掌握的開源日誌管理平臺ELK STACK

 

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

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

架構

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

環境介紹

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包安裝。git

系統設置

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]

解決方法:redis

# 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身份運行。docker

安裝

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

安裝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文件也支持環境變量,引用環境變量的方法${…},例如:bootstrap

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表示總堆棧空間的最大值。vim

# 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.confapi

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包含的功能太多了,這裏只介紹了些經常使用功能,足以應付平常所需,更多功能,還需深刻探索。

相關文章
相關標籤/搜索