溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Filebeat5+Kafka+ELK Docker是怎么搭建日志系統(tǒng)

發(fā)布時間:2021-12-08 15:28:51 來源:億速云 閱讀:155 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細講解有關Filebeat5+Kafka+ELK Docker是怎么搭建日志系統(tǒng),文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。


準備工作

  • 所有的安裝、配置或者說明文檔都以官方為準,比如 docker.io, elastic.co, kafka.apache.org 等。
    百度出來的古老文章如果解決不了問題,后果自裁。

  • 備好三臺不同ip的虛機(下文用A B C說明),做集群嘛,標配!

  • 做好心理預期,谷歌科學搜索不能少,妖怪問題會層出不窮,千萬不能被嚇到!

名稱版本號
Filebeat5.0.0-alpha1
Kafka0.9.0.1
Zookeeper3.4.8
Elasticsearch2.4.0
Logstash2.4.0
Kibana4.6.0

為什么使用Docker

純粹是處于個人愛好,各種技術只要跟 Docker 搭邊就傾愛它的 Docker 鏡像版本。本文除了filebeat agent是二進制版本直接安裝在應用機上,與docker無關,其他都是基于docker 鏡像版本的集群安裝。

為什么使用Kafka

分布式基于發(fā)布訂閱的消息系統(tǒng)Kafka,它可以將業(yè)務應用端(client)和日志分析服務端(server)很好的黏合起來,并起到了緩沖作用,并提供了很多優(yōu)秀特性比如異步,解耦,持久化,順序化等。而且Kafka可以與很多開源組件Storm、Spark等集成,對于日后的擴展這一層會有很大的幫助。

為什么選擇Filebeat5

本來開始確實是首選Flume,要做兩件事:①上傳client端的日志文件到Kafka; ②消費Kafka的隊列消息存入ElasticSearch。
坑爹的是,當時最新發(fā)布的Flume版本是1.6.0, 而它支持的es版本最高只到1.7.5, 不支持2.x版本,中間對es做了各種的降級和甚至還得配合jdk8云云, 最后放棄。
選擇就剩了 logstash-forwarder 和 filebeat, 而后者其實就是前者的升級版+替代品,所以直接選用filebeat無疑了。
妖怪又粗線了, filebeat當時的最新穩(wěn)定版是1.3.0, 而它是不支持output到kafka的。也就是第①件事就被卡住了,幸好Beats5的alpha1測試版發(fā)布了,雖然不穩(wěn)定,但是測試下來還未發(fā)現(xiàn)日志丟失的情況,先用著吧。
話音未落,alpha2又發(fā)布了...
https://www.elastic.co/guide/en/beats/libbeat/master/release-notes-5.0.0-alpha2.html

第②件事就通過Logstash來實現(xiàn)了(因為docker鏡像就是elk一體的 hihahiha)

開整

問完十萬個為什么之后,終于可以開整了(其實前面的#為什么#也是我的血淚史...)

一、Zookeeper 的安裝

直接介紹一個不錯的docker鏡像,pull下來直接使用

docker pull jeygeethan/zookeeper-cluster

集群三個點上分別啟動命令,虛擬卷大家自定義

docker run --name docker-zk -d --restart=always \
--net="host" \
-p 2181:2181 \
-p 2888:2888 \
-p 3888:3888 \
-v ~/dockerdata/zookeeper/lib:/var/lib/zookeeper \
-v ~/dockerdata/zookeeper/log:/var/log/zookeeper \
-v /etc/localtime:/etc/localtime:ro \
jeygeethan/zookeeper-cluster 192.168.0.1,192.168.0.2,192.168.0.3 1 {1/2/3: 三個節(jié)點分別設置}

三個節(jié)點都啟動成功后,進入節(jié)點A

運行 docker exec -it docker-zk bash

默認就會進入/usr/share/zookeeper 目錄,

運行 bin/zkCli.sh

進入了zk的客戶端命令行,

創(chuàng)建節(jié)點 create /nicholas "nicholas"
查看節(jié)點 get /nicholas 顯示創(chuàng)建成功,
    在虛機B、C上執(zhí)行get操作檢查下新的節(jié)點是否已同步,可見則成功。


### 二、Kafka 的安裝
同樣 pull 鏡像先

docker pull jeygeethan/kafka-cluster

同樣三個節(jié)點上分別啟動,注意,我這里kafka和zk使用的是相同的三臺虛機。

docker run --name docker-kafka -d -p 9092:9092
-e KAFKA_HOST=192.168.0.1
-e KAFKA_PORT=9092
-e ZOOKEEPER_CONNECT=192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181
-e KAFKA_ID=0 {0/1/2: 三個節(jié)點分別設置,從0開始}
-v ~/dockerdata/kafka/logs:/tmp/kafka-logs
jeygeethan/kafka-cluster

同時進入虛機A,和虛機B

進入docker
 docker exec -it docker-kafka bash
轉換目錄
 cd /opt/kafka_2.11-0.9.0.1/bin
創(chuàng)建Topic
 ./kafka-topics.sh --create --topic TP_NIC --partitions 4 --replication-factor 2
        --zookeeper 192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181
查看Topic
 ./kafka-topics.sh --describe --topic TP_NIC
         --zookeeper 192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181
在broker0(虛機A)上生產(chǎn)消息
 ./kafka-console-producer.sh --topic=TP_NIC \
         --broker-list=192.168.0.1:9092,192.168.0.2:9092,192.168.0.3:9092
在broker1(虛機B)上消費消息
 ./kafka-console-consumer.sh --topic=TP_NIC \
         --zookeeper 192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181

到此,虛機A和B已經(jīng)都關聯(lián)上了TP_NIC, 在 A 命令行上,隨意輸入各類字符, 在 B 上可以看到同樣的字符即說明消費成功了.

三、ELK 的安裝

pull 鏡像 2.4 版本 最新的5已經(jīng)有了

docker pull sebp/elk:es240_l240_k460

修改即將要映射的虛擬卷的目錄權限, 注意這里的991,992,993分別對應ELK的三個獨立用戶,如果你看下docker file的build腳本就明白了,為了讓docker運行成功,我們先把權限配上。

chown -R 991:991 ~/dockerdata/es && chown -R 992:992 ~/dockerdata/logstash && chown -R 993:993 ~/dockerdata/kibana

進入對應的目錄,我們先把配置給設定好。
注:這些配置文件是從docker里面cp出來的,如源文件沒有,請先docker run啟動原鏡像然后docker cp拷貝。

  • Elasticsearch 配置

vi ~/dockerdata/es/config/elasticsearch.yml
編輯內容如下
cluster.name: mm-cluster
node.name: mm-node-01
node.master: false
node.data: true
#restrict outside access
network.host: 192.168.0.11
transport.tcp.port: 9300
http.port: 9200
path.data: /etc/elasticsearch/data
path.work: /etc/elasticsearch/work
path.logs: /etc/elasticsearch/logs
path.plugins: /etc/elasticsearch/plugins
bootstrap.mlockall: true
discovery.zen.ping.multicat.enabled: false
discovery.zen.fd.ping_timeout: 100s
#discovery.zen.fd.ping_retries: 6
#discovery.zen.fd.ping_interval: 30s
discovery.zen.ping.timeout: 100s
discovery.zen.minimum_master_nodes: 1
discovery.zen.ping.unicast.hosts: ["192.168.0.11", "192.168.0.12", "192.168.0.13"]
gateway.recover_after_nodes: 2
#action.auto_create_index: false
index.number_of_replicas: 0
index.number_of_shards: 2
  • Kibana 配置

vi ~/dockerdata/kibana/config/kibana.yml
檢查 elasticsearch.url: "http://localhost:9200" 對應上了即可
  • Logstash 配置

新增Kafka的input配置文件:
vi ~/dockerdata/logstash/config/03-kafka-input.conf
------------------------------------------
input {
   kafka {
       zk_connect => "192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181 "
       #group_id => ""
       topic_id => "syslog"
       codec => "plain"
       reset_beginning => false
       consumer_threads => 5
       decorate_events => true
       add_field => { "[@metadata][type]" => "syslog" }
   }
}
修改日志解析過濾配置文件:
vi ~/dockerdata/logstash/config/10-syslog.conf
------------------------------------------
filter {
 if [@metadata][type] in ["syslog","accesslog"] {
   ruby {
     code => "event['mlogsendts'] = event['@timestamp']"
   }
   mutate {
     add_field => ["mlogsendts_string", "%{@timestamp}"]
   }
   json {
     source => "message"
     add_field => {
       "mlogmsg" => "%{message}"
     }
     remove_field => [ "message"]
   }
   grok {
     patterns_dir => ["/opt/logstash/patterns"]
     match => { "mlogmsg" => "[%{MMLOGTS:mlogts}]\s[%{MMLOGWORDEXT:mlogcell}]\s[%{MMLOGWORDEXT:mlognode}]\s[%{MMLOGWORDEXT:mlogthread}]\s[%{MMLOGWORD:mloglevel}]\s[%{MMLOGWORDEXT:mlogclass}]\s%{GREEDYDATA}" }
   }
   grok {
     match => { "source" => "%{GREEDYDATA}/%{GREEDYDATA:mlogfilename}.log" }
   }
   syslog_pri { }
   date {
     match => [ "mlogts", "yyyy-MM-dd HH:mm:ss.SSS" ]
     timezone => "Asia/Shanghai"
     target => "@timestamp"
   }
 }
}
這里最復雜的其實是兩件事,
① 用日志中的時間戳替換系統(tǒng)@timstamp(參見配置)
②grok表達式將日志中的變量分段解析(找在線grok校驗工具可以驗證自己的正則,很費勁!?。。?br/>grok表達式默認支持各種格式的正則格式變量,大家自行官網(wǎng)搜索,這里我是自定義的一些正則變量,存放在:
vi ~/dockerdata/logstash/patterns/mmlog
.
patterns下面的文件logstash默認會自動掃描的,所以文件名隨便定義,只要正則對了就可以了。
內容為:
MMLOGTS \d{4}-\d{2}-\d{2}\s\d{2}\:\d{2}\:\d{2}.\d{3}
MMLOGWORD \w
MMLOGWORDEXT [^]]+
MMLOGTHREAD \w
(\w)\:\w-\w
MMLOGCLASS [\w.]+\:
\w\s

下面就可以啟動docker了,對于ELK中的Elasticsearch 和 Logstash都需要是集群三個點的,而Kibana只是展示數(shù)據(jù),單點即可。所以啟動腳本分別為:

  • Kibana單點虛機,ELK三者全部開啟,E+L的堆大小配置是基于該虛機是2c4g(相對低配置)

    docker run --privileged=true -i -d -p 5601:5601 -p 9200:9200 -p 9300:9300 -p 5044:5044 -p 5000:5000 \
    --net="host" \
    -v ~/dockerdata/es/config/:/etc/elasticsearch/:rw \
    -v ~/dockerdata/es/plugins/:/etc/elasticsearch/plugins/:rw \
    -v ~/dockerdata/es/data/:/etc/elasticsearch/data/:rw \
    -v ~/dockerdata/es/work/:/etc/elasticsearch/work/:rw \
    -v ~/dockerdata/es/logs/:/var/log/elasticsearch/:rw \
    -v ~/dockerdata/logstash/config/:/etc/logstash/conf.d/:rw \
    -v ~/dockerdata/logstash/patterns/:/opt/logstash/patterns/:rw \
    -v ~/dockerdata/logstash/logs/:/var/log/logstash/:rw \
    -v ~/dockerdata/kibana/config/:/opt/kibana/config/:rw \
    -v ~/dockerdata/kibana/logs/:/var/log/kibana/:rw \
    -v /etc/localtime:/etc/localtime:ro \
    -e ES_JAVA_OPTS="-Duser.timezone=Asia/Shanghai" \
    -e ES_HEAP_SIZE="2g" \
    -e LS_HEAP_SIZE="1g" \
    -e ELASTICSEARCH_START=1 -e LOGSTASH_START=1 -e KIBANA_START=1 \
    --name docker-elk sebp/elk:es240_l240_k460 \
    && docker logs -f docker-elk
  • 其余兩個點的啟動關閉Kibana(KIBANA_START=0), 虛機配置是4c8g(相對高配置)

    docker run --privileged=true -i -d -p 5601:5601 -p 9200:9200 -p 9300:9300 -p 5044:5044 -p 5000:5000 \
    --net="host" \
    -v ~/dockerdata/es/config/:/etc/elasticsearch/:rw \
    -v ~/dockerdata/es/plugins/:/etc/elasticsearch/plugins/:rw \
    -v ~/dockerdata/es/data/:/etc/elasticsearch/data/:rw \
    -v ~/dockerdata/es/work/:/etc/elasticsearch/work/:rw \
    -v ~/dockerdata/es/logs/:/var/log/elasticsearch/:rw \
    -v ~/dockerdata/logstash/config/:/etc/logstash/conf.d/:rw \
    -v ~/dockerdata/logstash/patterns/:/opt/logstash/patterns/:rw \
    -v ~/dockerdata/logstash/logs/:/var/log/logstash/:rw \
    -v ~/dockerdata/kibana/config/:/opt/kibana/config/:rw \
    -v ~/dockerdata/kibana/logs/:/var/log/kibana/:rw \
    -v /etc/localtime:/etc/localtime:ro \
    -e ES_JAVA_OPTS="-Duser.timezone=Asia/Shanghai" \
    -e ES_HEAP_SIZE="4g" \
    -e LS_HEAP_SIZE="2g" \
    -e ELASTICSEARCH_START=1 -e LOGSTASH_START=1 -e KIBANA_START=0 \
    --name docker-elk sebp/elk:es240_l240_k460 \
    && docker logs -f docker-elk

打開下面網(wǎng)址校驗安裝成功與否:
Kibana Web : http://<your-host>:5601
Elasticsearch Json : http://<your-host>:9200/
ES的插件安裝請自己進入docker然后下載, 比較好用的有 head, hq 等

四、Filebeat5 的安裝

這個最簡單了,官網(wǎng)上下載 filebeat-5.0.0-rc1-linux-x86_64.tar.gz 解壓安裝;

vi /usr/local/src/filebeat5/filebeat.yml
編輯內容如下:
################### Filebeat Configuration Example #########################
############################# Filebeat ######################################
filebeat.prospectors:
# Each - is a prospector. Below are the prospector specific configurations
- input_type: log
 paths: ["/usr/local/src/logs/${appname}-${cellname}-${nodename}/sys-.log"]
 encoding: utf-8
 exclude_files: ['.
\d{4}-\d{2}-\d{2}..log']
 document_type: syslog
 fields:
   mlogapp: ${appname}
 fields_under_root: true
 scan_frequency: 1s
 ignore_older: 30m
# must set ignore_older to be greater than close_inactive.
 close_inactive: 5m
 close_removed: true
 clean_removed: true
 multiline:
   pattern: ^[[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}[[:blank:]][[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}.[[:digit:]]{3}]
   negate: true
   match: after
   max_lines: 500
output.kafka:
 # initial brokers for reading cluster metadata
 hosts: ["192.168.0.1:9092", "192.168.0.2:9092", "192.168.0.3:9092"]
 # message topic selection + partitioning
 topic: '%{[type]}'
 partition.round_robin:
   reachable_only: false
 required_acks: 1
 compression: gzip
 max_message_bytes: 1000000
############################# Logging #########################################
logging.level: info
logging.to_files: true
logging.to_syslog: false
logging.files:
 path: /usr/local/logs/filebeat
 name: filebeat.log
 keepfiles: 7
.
.
.
----------------------
*
啟動Filebeat5:**
export appname="uss-web" && export cellname="cell01" && export nodename="node01" \
&& cd /usr/local/src/filebeat/ \
&& nohup ./filebeat -e > /usr/local/src/logs/filebeat/nohup.out 2>&1 &

關于Filebeat5+Kafka+ELK Docker是怎么搭建日志系統(tǒng)就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI