在滴滴雲 DC2 雲伺服器上搭建 ELK 日誌採集系統
前段時間大學同學聚會,一個在讀的博士同學談到他們實驗室做實驗時,物理伺服器需要向老師申請且組內同學都共用那些機器。由於執行一些大資料和人工智慧的專案比較耗費資源,且對資源環境的隔離要求比較高,因而很多時候用機器還得排隊(畢竟學校經費和底層基礎設施沒有公司充裕),不是很方便。於是我就對他說到,為什麼不嘗試在公有云上面購買 VM 呢?便宜又好用,實驗室每個月經費買虛擬機器是綽綽有餘的,同時因為公有云可以按需使用,磁碟高可用且支援動態擴容,還能在某個時刻打快照,非常適合搭專案環境使用。
朋友目前的一個實驗任務是從海量分散式系統中收集作業系統、資料庫、訊息中介軟體及應用程式的日誌,並利用大資料演算法挖掘隱藏
想到可能還有更多的同學會遇到類似的問題、甚至可能是類似的任務,於是便寫了本篇部落格以幫助有此需要的同學,使之能夠在短時間內搭建一套行之有效的資料採集系統,方便快速上手使用。
快速瞭解 ELK 系統
ELK-Stack 是一套開源日誌採集套件,使用起來非常方便。先快速瞭解下每個服務是幹什麼的。
- Filebeat: 利用 Go 語言編寫的日誌檔案爬取工具,所佔系統的記憶體和 CPU 非常小。它能夠實時監控指定日誌目錄或檔案,不斷追蹤讀取這些檔案的變化,最後通過 TCP/IP 協議將日誌資料傳送到其它系統中進行處理。
- Logstash: 一個基於服務端的資料處理管道,由 JRuby 編寫且執行在 JVM 上,主要用於日誌解析、資料淨化和格式化(轉換成 JSON 格式)。
- Elasticsearch: 一個基於半結構化儲存的全文搜尋引擎,主要用於對海量日誌資料進行查詢、聚合統計等。資料查詢利用了帶有限狀態轉化機的倒排索引,能夠在秒級查詢到對應的目標。
- Kibana: 一個 Web UI 介面,能夠對採集到的日誌資料進行視覺化展示,通過豐富的圖表化展現和動態可互動的搜尋功能,讓海量的資料更容易被理解。
在虛擬機器上搭建日誌採集元件
巧婦難為無米之炊。首先,需要在滴滴雲上購買一臺 VM。作業系統任意選,這裡我選擇的是 Ubuntu 14.04。由於 ElasticSearch 需要儲存採集到的日誌資料,因而對儲存空間要求相對較高,我選擇了 100G 的磁碟;同時,因為 Logstash 會不停的解析和處理資料,所以 CPU 和記憶體需要適當大一點,這裡我選擇了 2 核 4G 記憶體的配置。現在讓我們開始 ELK 日誌系統搭建之旅。
首先安裝 JDK8
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
安裝完之後,執行如下命令:
update-alternatives --config java
可以看到 Java 的 HOME 目錄為 /usr/lib/jvm/java-8-oracle。接著,配置 Java 環境變數,執行如下命令:
vim ~/.bashrc
在檔案末尾貼上上以下幾行:
export JAVA_HOME=/usr/lib/jvm/java-8-oracl
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
為了使配置生效,還需要 source 一下:
source ~/.bashrc
最後,通過 java -version 檢視 JDK 版本資訊。若出現類似以下顯示,則表明安裝成功:
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
安裝 ELK 套件
首先,通過 wget 下載 deb 包,以下命令分別下載最新版(6.5.1)的 Filebeat、Logstash、Elasticsearch 和 Kibana:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.1-amd64.deb
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.5.1.deb
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.1.deb
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.1.deb
下載完成後,會存在以下四個 deb 包:
- elasticsearch-6.5.1.deb
- filebeat-6.5.1-amd64.deb
- kibana-6.5.1-amd64.deb
- logstash-6.5.1.deb
之後,就可以通過 dpkg -i xxx.deb 命令進行安裝了:
sudo dpkg -i filebeat-6.5.1-amd64.deb
sudo dpkg -i logstash-6.5.1.deb
sudo dpkg -i elasticsearch-6.5.1.deb
sudo dpkg -i kibana-6.5.1-amd64.deb
修改配置檔案,讓資料流打通
- 進入 /etc/filebeat 目錄,修改 filebeat.yml 檔案,設定要採集的日誌檔案路徑,和要傳送到的 Logstash IP 地址。由於是在同一臺 VM 上混部,所以 IP 可以設定為 127.0.0.1。若 Logstash 部署在另外一臺 VM 上,則需要配置那臺 VM 的 IP 地址。
- type: log
enabled: false
paths:
- /home/dc2-user/userAPP/logs/*.log
exclude_lines: ['^DBG']
include_lines: ['^ERR', '^WARN']
output.logstash:
hosts: ["127.0.0.1:5044"]
Filebeat 包中已經安裝了預設的索引模板(index template)。 如果你採用 filebeat.yml 檔案的預設配置,即 Filebeat 直連 ElasticSearch 時,會自動上傳索引模板(filebeat.template.json),該索引模板定義了索引名及如何對 Filebeat 上傳的資料建立索引。但是如何需要將日誌傳送到 Logstash 中,則不會自動上傳索引模板,必須手動上傳,因此需要執行如下命令:
curl -XPUT -H 'Content-Type: application/json' http://localhost:9200/_template/filebeat-6.5.1 [email protected]
- 在 /etc/logstash/conf.d 目錄下面建立 pipeline.yml,並輸入如下內容:
input {
beats {
port => "5044"
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:logtime} %{NUMBER:pid} %{NOTSPACE:logtype} %{NOTSPACE:logcomponent} %{GREEDYDATA:logmsg}" }
}
}
output {
elasticsearch {
hosts => [localhost:9200]
}
}
而且,需要進入到 /usr/share/logstash/bin 目錄,執行如下命令安裝 logstash-input-beats
外掛:
./logstash-plugin install logstash-input-beats
- 進入到 /etc/elasticsearch 目錄中,修改 elasticsearch.yml 檔案:
# ------------------- Network ------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 127.0.0.1
#
# Set a custom port for HTTP:#
http.port: 9200
#
# For more information, consult the network module documentation.
- 進入到 /etc/kibana 目錄,修改 kibana.yml 檔案。此處的 server.host 一定要配置成
0.0.0.0
:
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://localhost:9200"
kibana.index: ".kibana"
最後,啟動所有的服務,在 /usr/share/(elk)/bin 目錄中執行啟動檔案,啟動時注意使用者許可權的問題。同時記住要先啟 Elasticserch,再啟 Kibana,否則會報錯。待準備環境都就緒之後,就可以執行 Filebeat 爬取日誌資料了。此時登入到瀏覽器,可以通過 Kibana UI 介面檢索(視覺化)海量日誌內容,如果需要定製化介面或者將日誌資料拉出來用於其它用途,則可以呼叫 Elasticsearch 的 RESTful API 與之進行互動。
總結
隨著分散式系統的普及,如何在眾多物理伺服器上採集海量日誌並進行統一處理,然後利用大資料演算法挖掘日誌中有潛在價值的資訊,變得越來越重要。
本文只是在單臺 VM 上搭建了一套日誌採集環境,進行演示。如果需要在分散式系統中使用,也很簡單,只需將 Filebeat 獨立安裝在各個宿主機上就可以了。