ELK 實作分散式log採集系統

LUFOR129
Nov 6, 2020

這禮拜恰好修的一門叫做企業電腦網路的課,正要報告ELK。恰好上個禮拜台積電IT來我們學校徵才,給出了一張GG IT 進入會用到的工具一覽圖,那碩士期間這些應該就是我們碩班的必修了。

台積IT技術圖 , 未來我就把這些工具一點一點的寫成文章吧!

那今天先來講圖片中間的ELK,這篇會講解ELK的安裝、配置文件、使用方法。

ELK 組成

ELK 是由三個工具組成,Elasticsearch (E) 、Logstash (L) 、Kibana (K) 組成的Log 過濾、儲存、分析、視覺化系統,另外我們還需要一個叫Beat的工具來擔任Log的採集工具。

  • ElasticSearch 是整體系統的核心部分,是一個非關聯式資料庫以JSON格式儲存資料,擁有一個非常厲害的索引功能,默認為9200 port
  • Logstash是一個過濾器(不過其實本身也可以作為採集器),會把所有採集到的Log傳遞到logstash中。logstash可以依照規則將Log分割並傳遞到ElasticSearch (文章之後用ES表示),默認是5044 port。
  • Kibana 是圖形化展示工具,將儲存在ES內的資料用各式各樣圖表呈現出來,默認是5601 port。
  • Beats 是Log採集工具,負責將本台電腦的Log檔取出傳遞到logstash做過濾,或是直接傳遞到ES儲存器起來。

整體流程如下:

為何用ELK

那為什麼會需要ELK來採集Log呢? 過去系統不優嗎? 來看看過去怎麼做,假如我今天想要採集Nginx的成功access的 log,那通常會放在 /var/log/nginx/access.log 。如果我們想要查詢baidu是否有來爬我們網站,那麼可以通過簡單的 grep 來達成。

但是用在現今的大型系統會發現三個問題,一個是一旦流量過大會使log檔爆量,當log檔爆量後會自動壓縮成 gz 檔這使得查找困難。另一個是在現代的分散式系統,所有的log檔散布在各個分散式機台中,當我們需要查找特定Log時會很費力。最後是爬取出來都是文字資料,要轉成老闆看得懂的圖表還要自己寫,很不方便。

知道ELK的好處後我們來說說如何安裝吧!

一、ELK 的安裝

其實ELK安裝都大同小異,就是去官方網站下載。

進入官網你可以選擇使用deb安裝或是直接下載linux_x86_64壓縮包解壓縮。把ES、logstash、Kibana、beats都安裝下來,要注意的是beats分成很多種beats,如果想要採集log檔那麼應該選擇filebeat,因為log本質就是file。

在安裝ES之前,ES是基於JRE來撰寫的所以要確保系統內有JAVA並加入了系統變數,安裝JAVA。

# 檢查有沒有java
java -version

# 安裝java
sudo apt install default-jre

# 安裝JDK
sudo apt install default-jdk

# 確認JDK
javac -version

具體安裝方式我寫完後發現篇幅太長了,所以我就放在這裡給大家看吧

二、 ELK+Filebeat 配置文件

我們舉一個實際的分散式系統的例子,今天我有兩台伺服器一台是在140.127開頭(高雄大學的),一台是140.115開頭(中央大學的)。我想將中央大學與高雄大學的log檔都抓進中央大學的logstash並保存在中央大學的ES中。詳細流程如下:

1. Filebeat

首先先來看filebeat的配置文件,如果你是用deb安裝那應該可以在 /etc/filebeat/filebeat.yml 上看到他,如果你是用解壓縮方式那文件應該在解壓縮後資料夾底下,修改yml。

記得開啟enable,還有你的paths是爬取log的目標支援使用通配符,比如你想匹配所有nginx 下的access log檔,你可以寫 /var/log/nginx/access.* 。然後tags是為了在傳送到logstash後這個log檔是從哪裡來的。

接著是output,output默認是直接輸出到ES中,不過我們這裡要改成output到中央的logstash中(默認5044 port),因此將ES output都註解掉並在logstash中改為output host

完成後就開始執行吧,執行指令如果你是deb安裝那就 /usr/share/filebeat/filebeat -e -c /etc/filebeat/filebeat.yml ,如果你用解壓縮方式,那麼filebeat執行檔與yml配置檔都在同一個資料夾內,直行即可 <beat_dir>/filebeat -e -c <beat_dir>/filebeat.yml

2. logstash

logstash就是過濾beats進來的東西,過濾規則遵循grok清理規則,具體是如何清理的可以看這一篇:

修改 /etc/logstash/logstash-sample.conf ,如果你是解壓縮方式安裝則在 <logstash_dir>/config/logstash-sample.conflogstash-sample.conf 包含了logstash的input、filter、output。

舉個例子,假如今天beat爬取log檔為 Alice|HELLO WORLD|33 ,我想經過清理將Alice放在name欄位、HELLO WORLD放在talk欄位、33放在age欄位。

依據grok規則在name欄位接受.*的正則表達,其他也相同。最後會得到 {name:"ALICE",talk:"HELLO WORLD",age:"33"}

接著我們要輸出到ES (默認為9200 port),ES本質是一個資料庫,因此我們需要建立table,只是要注意的是,ES的TABLE被稱作index。我們需要對index取名字如下就是filebeat-2020.11.6-demo1,作為資料庫的表。

接著要將logstash打開,如果你是用解壓縮的方式安裝,開啟logstash的方式就是 <logstash_dir>/bin/logstash -f <logstash>/config/logstash-sample.conf ,如果你是用deb安裝則指令為 /usr/share/logstash/bin/logstash -f /etc/logstash/logstash-sample.conf

3. ElasticSearch 與Kibana

ElasticSearch與Kibana沒什麼配置文件,如果Kibana需要遠端開啟可以參考安裝說明中的調整server.host。ES、Kibana如果你是用deb安裝則開啟方式就是 service elasticsearch start 、 service kibana start 。如果你是解壓縮安裝則 <ES_dir>/bin/elasticsearch 、 <Kibana_dir>/bin/kibana

你可以用 localhost:5601 來開啟kibana,或是如果你有調整service.host那就使用那個IP host的5601來開啟kibana吧。

三、 Kibana視覺化

如果以上配置文件與安裝都成功,現在對目標log append一些資料應該能夠在kibana上發現了。不果你一進去肯定是發現什麼都看不到的,那是因為你尚未將ES內的index匯入進kibana。方法如下,進入stack management:

這麼一來就可以在Discover看到傳入的清理過的log檔了。記住要調整右上角的時間區間喔。

接下來是圖表,打開Visualize,隨便選一張圖,在bucket的aggregration選擇terms作為聚合方式。

大致上ELK的過程就算是完成了。

--

--