前言
ELK是最近比較流行的免費的日誌系統解決方案,注意,ELK不是一個軟件名,而是一個結局方案的縮寫,即Elasticsearch+Logstash+Kibana(ELK Stack)。這哥幾個都是java系的產品,但是衆所周知,java的東西很吃內存和CPU,Logstash在當作爲收集日誌的Agent時,就顯得太過臃腫了。聽說直播平臺“鬥魚”團隊很爲logstash佔用資源的情況很而苦惱,後來爲了解決這個問題,他們自己寫了一個agent。不過後來官方在logstash-forwarder的基礎上推出了beat系列,裏面包括四個兄弟,分別是:Packetbeat(蒐集網絡流量數據);Topbeat(蒐集系統、進程和文件系統級別的 CPU 和內存使用情況等數據);Filebeat(蒐集文件數據);Winlogbeat(蒐集 Windows 事件日誌數據)。而Filebeat也就這樣加入了“日誌收集分析”的團隊裏,所以雖然大家還是習慣性的叫ELK,其實準確的說法已經是ELKB了。
ELKB這幾個哥們的分工如下:
Elasticsearch:分佈式搜索和分析引擎,具有高可伸縮、高可靠和易管理等特點。基於 Apache Lucene 構建,能對大容量的數據進行接近實時的存儲、搜索和分析操作。通常被用作某些應用的基礎搜索引擎,使其具有複雜的搜索功能;
Logstash:數據收集額外處理和數據引擎。它支持動態的從各種數據源蒐集數據,並對數據進行過濾、分析、豐富、統一格式等操作,然後存儲到用戶指定的位置;
Kibana:數據分析和可視化平臺。通常與 Elasticsearch 配合使用,對其中數據進行搜索、分析和以統計圖表的方式展示;
Filebeat:ELK 協議棧的新成員,在需要採集日誌數據的 server 上安裝 Filebeat,並指定日誌目錄或日誌文件後,Filebeat 就能讀取數據,迅速發送到 Logstash 進行解析,亦或直接發送到 Elasticsearch 進行集中式存儲和分析。
設計架構
本文的設計結構就是這樣,其中紅色的redis/RebbitMQ部分可以省略(我這個例子裏暫省略),讓日誌直接傳遞到logstash,如果日誌量較大,最好還是添加上redis,同時再橫向擴容Elasticsearch,搞成一個集羣。
對於這幾個模塊服務器多說幾句:
1)Logstash要選擇計算能力強的,CPU和內存比較豐滿的;
2)Elasticsearch要選擇磁盤容量大的,同時CPU和內存也比較豐滿的;
實驗軟件版本
Elasticsearch 5.6.4
Logstash 5.6.4
Kibana 5.6.4
Filebeat 5.6.4
Java 1.8+,安裝方法:http://blog.51cto.com/chenx1242/2043924
由於ELKB這幾個東西都是牆外的,牆內的下載可能會比較費勁。所以我稍後會把所有ELKB的5.6.4程序都放在51CTO的存儲空間裏,需要的朋友可以去下載,還是那話,雖然ELK升級頻率很快,但是5.6.4已經足夠穩定了。
實驗服務器情況
服務器名稱 | 服務器IP | 服務器情況 | 服務器用途 |
func-auc-001 | 10.117.32.243 | 阿里雲Centos 6.5 2核2G | 這個auc是我公司的一個內部java模塊,會產生日誌。將filebeat安裝在這個機器上; |
chen-logstash-001 | 10.162.80.171 | 阿里雲Centos 7.4 2核4G(JAVA1.8.0) | Logstash |
chen-elk-001 | 10.162.80.192 | 阿里雲Centos 7.4 2核8G(JAVA1.8.0) | Elasticsearch+Kibana |
nginx直接使用阿里雲負載均衡取代 |
安裝Elasticsearch 5.6.4(以下所有操作都是root下進行的)
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.4.rpm rpm -ivh elasticsearch-5.6.4.rpm
然後編輯/etc/elasticsearch/elasticsearch.yml,不然的話logstash無法與之相連:
#cluster.name: my-application #如果是集羣的es就把這個打開,Elasticsearch 啓動時會根據配置文件中設置的集羣名字(cluster.name)自動查找並加入集羣,端口是9300 network.host: 0.0.0.0 #取消註釋,並且改成0.0.0.0 http.port: 9200 #取消註釋
保存之後,啓動並且添加開機啓動:
systemctl start elasticsearch systemctl enable elasticsearch
使用#curl localhost:9200能看到這樣的情景就證明已經成功啓動了:
安裝kibana 5.6.4(以下所有操作都是root下進行的)
curl -L -O https://artifacts.elastic.co/downloads/kibana/kibana-5.6.4-linux-x86_64.tar.gz tar xzvf kibana-5.6.4-linux-x86_64.tar.gz cd kibana-5.6.4-linux-x86_64/ vim config/kibana.yml
把kibana.yml裏的“server.host: localhost”改成“server.host: 0.0.0.0”,然後保存退出,在kibana的bin文件夾裏執行#./kibana即可。如果要後臺啓動就是#nohup /kibana安裝路徑/bin/kibana & 。
啓動之後,如圖:
在瀏覽器裏輸入“kibana服務器外網IP:5601”,就會看到web界面。
安裝Logstash 5.6.4(以下所有操作都是root下進行的)
curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.6.4.rpm rpm -ivh logstash-5.6.4.rpm
如果安裝的時候爆錯:/usr/share/logstash/vendor/jruby/bin/jruby: line 388: /usr/bin/java: No such file or directory。那麼就先#which java查看一下java的文件,然後做一個軟連接過去,然後重裝logstash即可,如圖:
用戶可以使用TLS雙向認證加密 Filebeat 和 Logstash 的連接,保證Filebeat只向可信的Logstash發送加密的數據(如果你的logstash和filebeat是內網通信,而且你認可當前內網的安全度,這一步可以省略)。同樣的,Logstash也只接收可信的 Filebeat 發送的數據。這個功能默認是關閉的,要開啓的話需要先#vim /etc/pki/tls/openssl.cnf,如圖:
找到[ v3_ca ]的字段,在底下添加“subjectAltName = IP:logstash的內網IP”字段,保存退出來到/etc/pki/tls/,執行
openssl req -x509 -days 365 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
來生成一個期限爲365天的IP SAN證書對,如果想生成一個十年的證書,就把365改成3650即可,如圖:
安裝完畢之後,#vim /etc/logstash/logstash.yml,編輯成如下的樣子:
然後在/etc/logstash/下手動建立一個目錄conf.d,在conf.d裏新建一個logstash.conf的文件,如下:
$ cat /usr/local/logstash/config/conf.d/logstash.conf #在輸入部分,配置Logstash通信端口以及添加SSL證書,從而進行安全通信。 input { beats { port => 5044 ssl => true ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt" ssl_key => "/etc/pki/tls/private/logstash-forwarder.key" } } #在過濾器部分,我們將使用Grok來解析這些日誌,然後將其發送到Elasticsearch。以下grok過濾器將查找“syslog”標記的日誌,並嘗試解析它們,以生成結構化索引。 filter { if [type] == "syslog" { grok { match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" } add_field => [ "received_at", "%{@timestamp}" ] add_field => [ "received_from", "%{host}" ] } syslog_pri { } date { match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } } } #輸出部分,我們將定義要存儲的日誌位置 output { elasticsearch { hosts => [ "10.162.80.192:9200" ] #這個地址是elasticsearch的內網地址 index => "auclogstash-%{+YYYY.MM.dd}" #設定這個是索引 user => elastic #這個是爲了將來裝x-pack準備的 password => changeme #同上 } stdout { codec => rubydebug } }
然後就是啓動並且添加開機自啓動
systemctl start logstash systemctl enable logstash
安裝filebeat(以下所有操作都是root下進行的)
在模塊服務器上安裝filebeat的方法如下:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.6.4-x86_64.rpm rpm -ivh filebeat-5.6.4-x86_64.rpm
之前在logstash上生成了一個IP SAN證書,現在需要把這個證書傳遞給filebeat的機器裏,使用scp語句如下:
scp -pr [email protected]:/etc/pki/tls/certs/logstash-forwarder.crt /etc/ssl/certs/ #10.162.80.171就是logstash的內網IP
輸入logstash的密碼,並且密鑰文件複製完畢之後,需要修改filebeat.yml,於是#vim /etc/filebeat/filebeat.yml:
[root@func-auc-001 log]# grep -iv '#' /etc/filebeat/filebeat.yml | grep -iv '^$' filebeat.prospectors: - input_type: log paths: - /mnt/hswx/auc/logs/*.log #這個是那個auc模塊的路徑 - /第二個日誌路徑/*.log #如果有第二個文件路徑的話 tail_files: true #從文件末尾開始讀取 document_type: "newnginx-api" #logstash那裏已經設定了index,如果要使用了document_type,那麼在logstash的index就要這麼寫:"%{type}-%{+YYYY.MM.dd}" # 以下是規避數據熱點的優化參數: spool_size: 1024 # 積累1024條消息才上報 idle_timeout: "5s" # 空閒5s上報 output.logstash: hosts: ["10.162.80.171:5044"] #這個地方要寫logstash的內網地址 ssl.certificate_authorities: ["/etc/ssl/certs/logstash-forwarder.crt"] #這裏就是剛剛複製的那個密鑰文件路徑 #注意上面是ssl而不是tls,1.0版本纔是tls,如果這個寫錯了,啓動的時候會出現“read: connection reset by peer”的錯誤
注意!Filebeat的配置文件採用YAML格式,這意味着縮進非常重要!請務必使用與這些說明相同數量的空格。
保存之後,使用#/etc/init.d/filebeat start啓動filebeat,如圖:
故障解決
ELK幾個部件現在都已經啓動了,並且互相telnet端口都是通的,在elasticsearch的服務器上使用#curl -XGET 'http://elasticsearch內網IP:9200/filebeat-*/_search?pretty' 卻出現這樣的情況:
而使用#tailf /var/log/filebeat/filebeat 去查看filebeat的日誌是這樣的:
再看看logstash-plain.log,裏面的情況是這樣的:
從此可見,filebeat與logstash的聯繫是error狀態,那麼停止filebeat的進程,改用#/etc/init.d/filebeat start -c /etc/filebeat/filebeat.yml,重新在elasticsearch的服務器上使用#curl -XGET 'http://elasticsearch內網IP:9200/filebeat-*/_search?pretty'發現已經成功讀到了我們之前配置的目錄“/mng/hswx/auc/log”,如圖:
配置kibana
在瀏覽器輸入“kibana服務器外網IP:5601”打開kibana的web界面,把“idenx pattern”的地方改成filebeat-*,然後點擊“create”,如圖:
然後就得到了細節的web界面,如圖:
點擊左側框的“Discover”,就會看到夢寐以求的日誌web 界面,如圖:
看一下紅色框的內容裏面有時間,有host主機,有source來源,還有具體的日誌信息,我們再去func-auc-001這個日誌源主機上查詢一下日誌:
兩個日誌是一樣的,可見實現了預期的日誌展示的目標!
最後一步,就是把kibana與nginx聯繫起來(也可以把kibana做阿里雲負載均衡的後端服務器),這樣通過nginx/負載均衡來訪問kibana的界面,對kibana來說更安全。配置端口監聽如圖,再把kibana服務器掛在負載均衡後面即可。
參考資料:https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html
參考資料:https://www.ibm.com/developerworks/cn/opensource/os-cn-elk/
參考資料:http://www.jinsk.vip/2017/05/24/elksetup/
參考資料:https://renwole.com/archives/661
參考資料:https://www.zybuluo.com/dume2007/note/665868
參考資料:https://www.elastic.co/guide/en/beats/libbeat/5.6/getting-started.html
參考資料:http://jaminzhang.github.io/elk/ELK-config-and-use-Filebeat/ (這個博主很好,但是就是博客無法留言,這點比較坑)
最後的最後,如果您覺得本文對您升職加薪有幫助,那麼請不吝贊助之手,刷一下下面的二維碼,贊助本人繼續寫更多的博文!