在企業級開源日誌管理平臺ELK VS GRAYLOG一文中,我簡單闡述了日誌管理平臺對技術人員的重要性,並把ELK Stack和Graylog進行了標記。本篇做爲「企業級開源日誌管理平臺」的延伸,基於我在生產環境中的使用經驗,向讀者介紹ELK Stack的安裝與配置。不足之處,還望指正。node
架構
Beats工具收集各節的日誌,以list數據結構存儲在Redis中,Logstash從Redis消費這些數據並在條件匹配及規則過濾後,輸出到Elasticsearch,最終經過kibana展現給用戶。nginx
環境介紹
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
- 修改最大文件描述符
- 修改最大線程數
注意:經過RPM包或YUM形式安裝,Elasticsearch會自動優化這些參數,若是採用tar包的形式安裝,除了手動修改這些配置,還須要建立啓動Elasticsearch程序的系統用戶,Elasticsearch不容許以root身份運行。docker
安裝
安裝順序:
1. Elasticsearch
2. Kibana
3. Logstash
4. Beatsshell
安裝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文件也支持環境變量,引用環境變量的方法${…},例如:bootstrap
jvm.options文件包含如下格式:
行分割;
空行被忽略;
以#開頭表示註釋;
以-開頭的行被視爲獨立於JVM版本,此項配置會影響全部版本的JVM;
數字開頭,後面跟一個:和一個-號的行,只會影響匹配此數字的JVM版本,例如:8:-Xmx2g,只會影響JDK8;
數字開頭跟一個-號再跟一個數字再跟一個:,定義兩個版本之間,且包含這兩個版本,例如8-9:-Xmx2g,影響JDK8,JDK9。
注意:在配置中,應保證JVM堆棧min和max的值相同,Xms表示總堆棧空間的初始值,XmX表示總堆棧空間的最大值。vim
配置文件中,我將bootstrap.memory_lock的值設爲了true,啓動時遇到了如下錯誤:Elasticsearch process memory locking failed
解決此問題,還須要修改三個地方:
1. /etc/sysconfig/elasticsearch後端
替換4g爲總內存的一半(Elasticsearch官方建議是主機總內存的一半)
2. /etc/security/limits.confapi
須要將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包含的功能太多了,這裏只介紹了些經常使用功能,足以應付平常所需,更多功能,還需深刻探索。