filebeat+kafka+logstash部署及配置
工作上有個搭建ELK平臺的需求,設計方案的時候,日誌採集部分計劃使用filebeat+kafka+logstash的架構。終端使用filebeat進行日誌的簡單採集,再通過kafka集羣送給logstash過濾和加工,再最後輸出給ElasticSearch。
一、搭建環境及軟件版本
服務器
IP地址 | 操作系統 |
---|---|
192.168.241.11 | CentOs7-1804 |
192.168.241.12 | CentOs7-1611 |
192.168.241.13 | CentOs7-1804 |
JAVA JDK版本:1.8.0_151
Filebeat版本:6.5.2
Kafka版本:2.12-2.1.0
Logstash版本:6.5.2
二、安裝Kafka集羣
請參閱《Kafka集羣及Kafka-Manager部署》
三、Filebeat安裝及配置
1、Filebeat下載及安裝
官網下載地址爲:https://www.elastic.co/downloads/beats/filebeat
本文采用的是rpm安裝方式,下載到的安裝包爲:filebeat-6.5.2-x86_64.rpm。
將安裝包拷貝到服務器的/tmp目錄,執行如下命令完成安裝。
rpm -ivh /tmp/filebeat-6.5.2-x86_64.rpm
2、Filebeat配置
安裝完成後,filebeat主程序目錄爲/usr/share/filebeat,配置文件目錄爲/etc/filebeat,日誌目錄爲/var/log/filebeat。這些目錄通過查看/usr/lib/systemd/system/filebeat.service文件就可以知道。我們要關注的是/etc/filebeat/filebeat.yml文件,我們需要修改其中的input和output配置。本文只根據項目的實際需要簡單講解幾個配置項,所有的配置示例在/etc/filebeat/filebeat.reference.yml文件中,需要了解的話可結合這個文件和百度。
input配置(輸入配置):
filebeat的輸入配置在filebeat.inputs節點下。type爲log,表明這是從文件獲取輸入。我們需要將log類型下的enabled的值置爲true,在paths中編輯需要獲取輸入的文件,文件可以是多個,也可以使用通配符。如下圖:
output配置(輸出配置):
我們需要將讀取到的日誌輸出到Kafka集羣中,而配製文件中默認沒有Kafka集羣的輸出配置,因此需要在其中增加(關於Kafka集羣的輸出配置示例,可以在/etc/filebeat/filebeat.reference.yml文件中查看)。我們增加的Kafka集羣配置如下圖所示:
從上圖可以看到,首先要增加output.kafka節點,在此節點下配置enabled、hosts、topic這三個配置項。
更多配置詳情,請參考百度和官方文檔https://www.elastic.co/guide/en/beats/filebeat/current/index.html
四、Logstash安裝及配置
1、Logstash下載及安裝
官方下載地址爲:https://www.elastic.co/downloads/logstash
本文采用的是rpm安裝方式,下載到的安裝包爲:logstash-6.5.2.rpm。
將安裝包拷貝到服務器的/tmp目錄,執行如下命令完成安裝。
rpm -ivh /tmp/logstash-6.5.2.rpm
2、Logstash配置
安裝完成後,logstash主程序目錄爲/usr/share/logstash,配置文件目錄爲/etc/logstash,日誌目錄爲/var/log/logstash。
Logstash的基礎配置文件是/etc/logstash/logstash.yml,但是這個文件我們不用動,我們只需要將自己的輸入輸出配置寫到以“.conf”結尾的文件裏,把這文件放入/etc/logstash/conf.d目錄下,logstash就會讀取我們的配置。我編寫了一個文件kafka.conf,放到/etc/logstash/conf.d,內容如下:
#輸入配置,一個input{}裏可以配置多個輸入源
input {
#kafka輸入源配置
kafka {
#kafka集羣地址
bootstrap_servers => ["192.168.241.11:9092,192.168.241.12:9092,192.168.241.13:9092"]
#從kafka中哪個topic讀取數據,這裏的topic名要與filebeat中使用的topic保持一致
topics => ["filebeat-logstash"]
#這是kafka中的消費組者ID,默認值是“logstash”。kafka將消息發到每個消費者組中,同一個組中的消費者收到的數據不重複。例如有兩個消費者組G1、G2,G1中有成員A、B,G2中有成員C、D。kafka從輸入中收到了10條消息,會將這10條消息同時發送給G1和G2,A和B各會收到這10條消息中的一部分,他們收到消息的並集就是這10條消息,C和D同理。
group_id => "filebeat-logstash"
#kafka消費者組中每個消費者的ID,默認值是“logstash”
client_id => "logstashnode1"
#logstash的消費線程,一般一個線程對應kafka中的一個partition(分區),同一組logstash的consumer_threads之和應該不大於一個topic的partition,超過了就是資源的浪費,一般的建議是相等。
consumer_threads => 1
#由於beat傳輸數據給kafka集羣的時候,會附加很多tag,默認情況下,logstash就會將這串tag也認爲是message的一部分。這樣不利於後期的數據處理。所有需要添加codec處理。得到原本的message數據。
codec => json
}
}
#輸出配置,這裏表示輸出到文件
output {
file {
path => "/tmp/logstash.output"
}
}
配置的詳細解釋請參考註釋,更多配置詳情,請參考百度和官方文檔https://www.elastic.co/guide/en/logstash/current/index.html
五、啓動服務及驗證
根據上文完成部署後,分別啓動kafka集羣,filebeat,logstash,在filebeat所在服務器上,往/tmp/input.test文件中輸入內容,就會在logstash所在服務器的/tmp/logstash.output文件裏產生輸出。詳細驗證過程這裏就不贅述了。