在企業級開源日志管理平台ELK VS GRAYLOG一文中,我簡單闡述了日志管理平台對技術人員的重要性,並把ELK Stack和Graylog進行了標記。本篇作為“企業級開源日志管理平台”的延伸,基於我在生產環境中的使用經驗,向讀者介紹ELK Stack的安裝與配置。不足之處,還望指正。
架構
Beats工具收集各節的日志,以list數據結構存儲在Redis中,Logstash從Redis消費這些數據並在條件匹配及規則過濾后,輸出到Elasticsearch,最終通過kibana展示給用戶。
環境介紹
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]
解決方法:
- 修改最大文件描述符
- 修改最大線程數
注意:通過RPM包或YUM形式安裝,Elasticsearch會自動優化這些參數,如果采用tar包的形式安裝,除了手動修改這些配置,還需要創建啟動Elasticsearch程序的系統用戶,Elasticsearch不允許以root身份運行。
安裝
安裝順序:
1. Elasticsearch
2. Kibana
3. Logstash
4. Beats
安裝Elasticsearch
- 導入Elasticsearch PGP key,使用Elasticsearch簽名密鑰(PGP key D88E42B4,可從https://pgp.mit.edu獲得)和fingerprint對所有包進行簽名:
- 下載安裝RPM包
- 配置文件
Elasticsearch包含三個配置文件:
elasticsearch.yml:配置Elasticsearch
jvm.options:設置Elasticsearch堆棧大小,對JVM進行優化
log4j2.properties:定義Elasticsearch日志
這些文件的默認位置取決於安裝方式。tar包形式的配置文件目錄$ES_HOME/config,RPM包默認位置/etc/elasticsearch/。
elasticsearch.yml文件采用yaml格式,以修改路徑為例:
elasticsearch.yml文件也支持環境變量,引用環境變量的方法${…},例如:
jvm.options文件包含以下格式:
行分割;
空行被忽略;
以#開頭表示注釋;
以-開頭的行被視為獨立於JVM版本,此項配置會影響所有版本的JVM;
數字開頭,后面跟一個:和一個-號的行,只會影響匹配此數字的JVM版本,例如:8:-Xmx2g,只會影響JDK8;
數字開頭跟一個-號再跟一個數字再跟一個:,定義兩個版本之間,且包含這兩個版本,例如8-9:-Xmx2g,影響JDK8,JDK9。
注意:在配置中,應保證JVM堆棧min和max的值相同,Xms表示總堆棧空間的初始值,XmX表示總堆棧空間的最大值。
配置文件中,我將bootstrap.memory_lock的值設為了true,啟動時遇到了以下錯誤:Elasticsearch process memory locking failed
解決此問題,還需要修改三個地方:
1. /etc/sysconfig/elasticsearch
替換4g為總內存的一半(Elasticsearch官方建議是主機總內存的一半)
2. /etc/security/limits.conf
需要將elasticsearch替換為運行Elasticsearch程序的用戶
3. /usr/lib/systemd/system/elasticsearch.service
取消服務腳本文件/usr/lib/systemd/system/elasticsearch.service中對LimitMEMLOCK=infinity的注釋
然后運行systemctl daemon-reload命令
- 啟動節點
Elasticsearch安裝完畢,接下來安裝Kibana。
安裝Kibana
同樣使用RPM的形式安裝
1. 安裝公鑰
- 下載rpm包
- 配置文件
Kibana啟動時從/etc/kibana/kibana.yml文件里讀取配置信息,配置文件內容如下:
- 啟動
安裝Logstash
- 下載
安裝Filebeat
Filebeat客戶端是一個輕量級,資源消耗較低的工具,它從服務器的文件中收集日志,並將這些日志轉發到Logstash進行處理。
1. 下載filebeat
- 配置文件
- 啟動Filebeat
ELK各組件安裝完成,開始日志收集相關的配置。
Logstash pipeline
Logstash管道包含兩個必要元素Inputs和Outputs,以及一個可選元素Filter。Inputs接收、消費元數據,Filter根據設定過濾數據,Outputs將數據輸出到指定程序,我這里定義的是輸出到Elasticsearch。
我配置了Filebeat輸出message日志和www.vtlab.io 的訪問日志,現在創建Logstash管道接收這些數據。
配置文件中,我定義了兩個patterns:”message” => “%{SYSLOGBASE2}”與”message” => “%{COMBINEDAPACHELOG}”,一個匹配系統messages日志,一個匹配Nginx訪問日志,其他日志類型,就需要不同的Patterns了。ELK提供了很多默認的Patterns,也可以自定義。
定義Patterns
一個簡單的方法,通過以下兩個步驟實現:
1. 打開Grokdebug discover頁面,輸入日志內容到文本框,點擊discover按鈕,如下圖:
2. 打開Grokdebug頁面,按圖中步驟操作,輸出內容就是Patterns。
啟動Logstash
- 啟動前,檢驗first-pipeline.conf配置文件的語法是否正確:
輸出中包含以上內容,說明配置文件正確。
2. 啟動指定pipeline:
–config.reload.automatic:開啟自動加載配置,這樣在每次修改配置文件時會自動加載配置文件
Kibana UI
日志流已經通過Filebeat、Redis、Logstash進入了Elasticsearch,我們通過Kibana對Elasticsearch做一些可視化的管理,方便查看日志。
創建索引
登錄Kibana頁面,在瀏覽器中輸入 http://10.0.0.21:5601 (10.0.0.21為部署Kibana主機的IP地址,5601是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”按鈕,創建完成
安全
細心的讀者朋友可能已經發現了,登錄kibana的時候,頁面並沒有驗證功能,任何能訪問Kibana地址的人,都能查詢日志,這對我們來說是不可接受的。
改進方法:
1. X-Pack:Kibana本身不提供認證機制,需要通過X-Pack插件來實現。X-Pack是付費插件,可以申請License獲取一年期的免費試用。
2. Nginx:通過htpasswd創建用戶及密碼,進行Kibana認證。
結尾
ELK Stack包含的功能太多了,這里只介紹了些常用功能,足以應付日常所需,更多功能,還需深入探索。