記錄日誌系統ELKB 5.6.4的搭建過程

前言

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這幾個哥們的分工如下:

  1. Elasticsearch:分佈式搜索和分析引擎,具有高可伸縮、高可靠和易管理等特點。基於 Apache Lucene 構建,能對大容量的數據進行接近實時的存儲、搜索和分析操作。通常被用作某些應用的基礎搜索引擎,使其具有複雜的搜索功能;

  2. Logstash:數據收集額外處理和數據引擎。它支持動態的從各種數據源蒐集數據,並對數據進行過濾、分析、豐富、統一格式等操作,然後存儲到用戶指定的位置;

  3. Kibana:數據分析和可視化平臺。通常與 Elasticsearch 配合使用,對其中數據進行搜索、分析和以統計圖表的方式展示;

  4. Filebeat:ELK 協議棧的新成員,在需要採集日誌數據的 server 上安裝 Filebeat,並指定日誌目錄或日誌文件後,Filebeat 就能讀取數據,迅速發送到 Logstash 進行解析,亦或直接發送到 Elasticsearch 進行集中式存儲和分析。


設計架構

image.png

本文的設計結構就是這樣,其中紅色的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-00110.162.80.171阿里雲Centos 7.4 2核4G(JAVA1.8.0)Logstash
chen-elk-00110.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能看到這樣的情景就證明已經成功啓動了:

image.png


安裝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 &


啓動之後,如圖:

image.png


在瀏覽器裏輸入“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即可,如圖:

image.png

image.png


用戶可以使用TLS雙向認證加密 Filebeat 和 Logstash 的連接,保證Filebeat只向可信的Logstash發送加密的數據(如果你的logstash和filebeat是內網通信,而且你認可當前內網的安全度,這一步可以省略)。同樣的,Logstash也只接收可信的 Filebeat 發送的數據。這個功能默認是關閉的,要開啓的話需要先#vim /etc/pki/tls/openssl.cnf,如圖:

image.png


找到[ 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即可,如圖:

image.png


安裝完畢之後,#vim /etc/logstash/logstash.yml,編輯成如下的樣子:

image.png


然後在/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,如圖:image.png


故障解決

ELK幾個部件現在都已經啓動了,並且互相telnet端口都是通的,在elasticsearch的服務器上使用#curl -XGET 'http://elasticsearch內網IP:9200/filebeat-*/_search?pretty' 卻出現這樣的情況:

image.png


而使用#tailf /var/log/filebeat/filebeat 去查看filebeat的日誌是這樣的:image.png


再看看logstash-plain.log,裏面的情況是這樣的:image.png


從此可見,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”,如圖:

image.png


配置kibana

在瀏覽器輸入“kibana服務器外網IP:5601”打開kibana的web界面,把“idenx pattern”的地方改成filebeat-*,然後點擊“create”,如圖:

image.png

然後就得到了細節的web界面,如圖:

image.png


點擊左側框的“Discover”,就會看到夢寐以求的日誌web 界面,如圖:

1.png


看一下紅色框的內容裏面有時間,有host主機,有source來源,還有具體的日誌信息,我們再去func-auc-001這個日誌源主機上查詢一下日誌:

image.png


兩個日誌是一樣的,可見實現了預期的日誌展示的目標!


最後一步,就是把kibana與nginx聯繫起來(也可以把kibana做阿里雲負載均衡的後端服務器),這樣通過nginx/負載均衡來訪問kibana的界面,對kibana來說更安全。配置端口監聽如圖,再把kibana服務器掛在負載均衡後面即可。

image.png




參考資料: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 

參考資料:https://discuss.elastic.co/search?q=ERR%20Failed%20to%20publish%20events%20caused%20by%3A%20read%20tcp 

參考資料:http://jaminzhang.github.io/elk/ELK-config-and-use-Filebeat/ (這個博主很好,但是就是博客無法留言,這點比較坑)



最後的最後,如果您覺得本文對您升職加薪有幫助,那麼請不吝贊助之手,刷一下下面的二維碼,贊助本人繼續寫更多的博文!

wKioL1l16m3BMYDKAACPHEqd55Q687.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章