1. 程式人生 > >ELK+Filebeat+Kafka+ZooKeeper 構建海量日誌分析平臺

ELK+Filebeat+Kafka+ZooKeeper 構建海量日誌分析平臺

width 上進 實驗環境 cal host 轉發 lis write oot

ELK+Filebeat+Kafka+ZooKeeper 構建海量日誌分析平臺

參考:http://www.tuicool.com/articles/R77fieA

我在做ELK日誌平臺開始之初選擇為ELK+Redis直接構建,在采集nginx日誌時一切正常,當我采集我司業務報文日誌類後,logstash會報大量的redis connect timeout。換成redis cluster後也是同樣的情況後,就考慮對消息中間件進行替換重新選型,經過各種刷文檔,決定選用kafka來替換redis。根據網上找的一篇參考文檔中的架構圖如下:

技術分享圖片

註:由於環境有限,在對該架構圖中的elasticsearch集群與logstash轉發層進行了合並在一臺服務器上。

架構解讀 : (整個架構從左到右,總共分為5層)(本文將第三層以下的進行了合並,無elasticsearch集群)

第一層、數據采集層

最左邊的是業務服務器集群,上面安裝了filebeat做日誌采集,同時把采集的日誌分別發送給兩個logstash服務。

第二層、數據處理層,數據緩存層

logstash服務把接受到的日誌經過格式處理,轉存到本地的kafka broker+zookeeper 集群中。

第三層、數據轉發層

這個單獨的Logstash節點會實時去kafka broker集群拉數據,轉發至ES DataNode。

第四層、數據持久化存儲

ES DataNode 會把收到的數據,寫磁盤,建索引庫。

第五層、數據檢索,數據展示

ES Master + Kibana 主要 協調 ES集群,處理數據檢索請求,數據展示。

一、環境準備

操作系統環境:(測試環境統一為centos7;正式線上環境:采集層、處理緩存層為centos6.5,轉發層、持久層、檢索展示層為centos7)(本文以實驗環境進行撰寫)

服務器角色分配:

主機IP

角色

所屬服務層

部署服務

192.168.11.11

日誌生產

采集層

filebeat

192.168.11.12

日誌緩存

數據處理層、緩存層

Zookeeper+kafka+logstash

192.168.11.13

192.168.11.14

日誌展示

持久、檢索、展示層

Logstash+elasticsearch+kibana

軟件包版本:

jdk-8u112-linux-x64

filebeat-5.2.0-linux-x86_64

logstash-5.2.0

kafka_2.11-0.10.1.1

kibana-5.2.0-linux-x86_64

elasticsearch-5.2.0

zookeeper-3.4.9

二、部署安裝

(一)、部署logstash+elasticsearch+kibana(持久、檢索、展示層)

1、jdk解壓部署

[webapp@localhost ~]$ tar -xzf jdk-8u112-linux-x64.tar.gz -C /data/webapp/

2、配置jdk環境變量

[webapp@localhost ~]$ cat .bash_profile

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

# User specific environment and startup programs

export JAVA_HOME=/data/webapp/jdk1.8.0_112

PATH=$JAVA_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin

export PATH

3、系統調優

[webapp@localhost ~]$ vim /etc/sysctl.conf

fs.file-max=65536

vm.max_map_count = 262144

[webapp@localhost ~]$ vim /etc/security/limits.conf

* soft nofile 65535

* hard nofile 131072

* soft nproc 2048

* hard nproc 4096

4、解壓部署logstash+elasticsearch+kibana

[webapp@localhost ~]$ unzip -d /data/webapp/ elasticsearch-5.2.0.zip

[webapp@localhost ~]$ tar -xzf logstash-5.2.0.tar.gz -C /data/webapp/

[webapp@localhost ~]$ tar -xzf kibana-5.2.0-linux-x86_64.tar.gz -C /data/webapp/

4.1、配置logstash的配置文件

[webapp@localhost ~]$ cd /data/webapp/logstash-5.2.0/config/

[webapp@localhost config]$ vim logstash_to_es.conf

input {

kafka {

bootstrap_servers => "192.168.11.12:9092,192.168.11.13:9092"

topics => ["ecplogs"]

}

}

output {

elasticsearch {

hosts => ["192.168.11.14:9200"]

index => "ecp-log-%{+YYYY.MM.dd}"

flush_size => 20000

idle_flush_time => 10

template_overwrite => true

}

}

註:["ecplogs"]此字段是kafka的消息主題,後邊在部署kafka後需要創建

4.2、配置logstash的啟動腳本

[webapp@localhost config]$ cd ../bin/

[webapp@localhost bin]$ vim start-logstash.sh

#!/bin/bash

export JAVA_HOME=/data/webapp/jdk1.8.0_112

export JRE_HOME=/data/webapp/jdk1.8.0_112/jre

export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$JAVA_HOME/bin:$PATH

/data/webapp/logstash-5.2.0/bin/logstash -f /data/webapp/logstash-5.2.0/config/logstash_to_es.conf > /dev/null &

4.3、配置elasticsearch的配置文件

[webapp@localhost ~]$ cd /data/webapp/elasticsearch-5.2.0/config/

[webapp@localhost config]$ vim elasticsearch.yml

node.name:elk1

path.data:/data/webapp/elk_data

path.logs:/data/webapp/elk_data

network.host: 192.168.11.14

http.port: 9200

4.4、配置JVM(正式環境不需要,測試環境內存較小需要更改,將2g改為512M)

[webapp@localhost config]$ vim jvm.options

-Xms512m

-Xmx512m

4.5、配置Kibana的配置文件

[webapp@localhost ~]$ cd /data/webapp/kibana-5.2.0-linux-x86_64/config/

[webapp@localhost config]$ vim kibana.yml

server.port: 5601

server.host: "192.168.11.14"

elasticsearch.url: "http://192.168.11.14:9200"

(二)、部署Zookeeper+kafka+logstash(雙機集群緩存處理層,正式環境建議三臺)

1、部署zookeeper集群

[webapp@localhost ~]$ tar -xzf zookeeper-3.4.9.tar.gz -C /data/webapp/

[webapp@localhost ~]$ cd /data/webapp/zookeeper-3.4.9/conf/

[webapp@localhost conf]$ cp zoo_sample.cfg zoo.cfg

[webapp@localhost conf]$ vim zoo.cfg

dataDir=/data/webapp/zookeeper-3.4.9/zookeeper

server.1=192.168.11.12:12888:13888

server.2=192.168.11.13:12888:13888

[webapp@localhost conf]$ echo 1 > /data/webapp/zookeeper-3.4.9/zookeeper/myid

註:在另外一臺配置文件相同,只需要將myid重置為2

[webapp@localhost conf]$ echo 2 > /data/webapp/zookeeper-3.4.9/zookeeper/myid

2、啟動zookeeper服務(在兩臺服務器中都啟動)

[webapp@localhost zookeeper-3.4.9]$ bin/zkServer.sh start

2.1、查看兩臺zookeeper集群狀態

[webapp@localhost zookeeper-3.4.9]$ bin/zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /data/webapp/zookeeper-3.4.9/bin/../conf/zoo.cfg

Mode: follower

[webapp@localhost zookeeper-3.4.9]$ bin/zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /data/webapp/zookeeper-3.4.9/bin/../conf/zoo.cfg

Mode: leader

3、配置kafka集群

[webapp@localhost ~]$ tar -xzf kafka_2.11-0.10.1.1.tgz -C /data/webapp/

[webapp@localhost ~]$ cd /data/webapp/kafka_2.11-0.10.1.1/config/

[webapp@localhost config]$ vim server.properties

broker.id=1

port = 9092

host.name = 192.168.11.12

log.dirs=/data/webapp/kafka-logs

log.retention.hours=1

zookeeper.connect=192.168.11.12:2181,192.168.11.13:2181

default.replication.factor=2

註:兩臺集群配置只需要將broker.id、host.name進行修改,其它一致。

[webapp@localhost config]$ vim server.properties

broker.id=2

host.name = 192.168.11.13

4、啟動kafka集群(在兩臺服務器中都啟動)

[webapp@localhost kafka_2.11-0.10.1.1]$ bin/kafka-server-start.sh -daemon config/server.properties

4.1、創建消息主題

[webapp@localhost kafka_2.11-0.10.1.1]$ bin/kafka-topics.sh --create --zookeeper 192.168.11.11:2181 --replication-factor 1 --partitions 2 --topic ecplogs

4.2、測試消息生產與消費

在主機192.168.11.13上進行消息消費

[webapp@localhost kafka_2.11-0.10.1.1]$ /data/webapp/kafka_2.11-0.10.1.1/bin/kafka-console-consumer.sh --zookeeper 192.168.11.11:2181 --topic ecplogs --from-beginning

在主機192.168.11.12上進行消息生產:

[webapp@localhost kafka_2.11-0.10.1.1]$ bin/kafka-console-producer.sh --broker-list 192.168.11.11:9092 --topic ecplogs

在此終端中輸入數據,會在192.168.11.13終端上進行顯示出來。那麽kafka功能正常。

5、配置logstash

5.1配置logstash的配置文件

[webapp@localhost ~]$ tar -xzf logstash-5.2.0.tar.gz -C /data/webapp/

[webapp@localhost ~]$ cd /data/webapp/logstash-5.2.0/config/

[webapp@localhost config]$ vim logstash_in_filebeat.conf

input {

beats {

port => 5044

}

}

output {

kafka {

bootstrap_servers => "192.168.11.12:9092,192.168.11.13:9092"

topic_id => "ecplogs"

}

}

5.2配置Logstash啟動腳本(如4.2

(三)、部署filebeat(日誌采集)

1、解壓部署

[webapp@localhost ~]$ tar -xzf filebeat-5.2.0-linux-x86_64.tar.gz -C /data/webapp/

2、配置filebeat配置文件

[webapp@localhost ~]$ cd /data/webapp/filebeat-5.2.0-linux-x86_64/

[webapp@localhost filebeat-5.2.0-linux-x86_64]$ vim filebeat.yml

filebeat.prospectors:

- input_type: log

paths:

- /data/logs/ecplog.log

multiline.pattern: ^請

multiline.negate: true

multiline.match: after

output.logstash:

hosts: ["192.168.11.13:5044"]

註解:該配置文件格式參照yml型,multiline.x配置項為多行合並規則,如無,可以不用配置

3、啟動filebeat

[webapp@localhost filebeat-5.2.0-linux-x86_64]$ nohup ./filebeat -c filebeat.yml > /dev/null &

(四)各環節服務器啟動與數據追蹤

1、啟動192.168.11.12/13服務器上的logstash

[webapp@localhost ~]$ /data/webapp/logstash-5.2.0/bin/start-logstash.sh

2、在192.168.11.12/13終端上進行日誌消費測試

[webapp@localhost kafka_2.11-0.10.1.1]$ /data/webapp/kafka_2.11-0.10.1.1/bin/kafka-console-consumer.sh --zookeeper 192.168.11.11:2181 --topic ecplogs --from-beginning

註:如果配置正常,該兩終端中會都會源源不斷的輸出/data/logs/ecplog.log的日誌數據。

3、啟動192.168.11.14服務器上的logstash+es+kibana

4、測試es數據索引

[webapp@localhost ~]$ curl "http://192.168.11.14:9200/ecplogs-2017.02.09"

註:如果配置正常,curl出來的是有數據的,而非404類

5、通過web展示,訪問http://192.168.11.14:5601

6、Kibanad頁面配置(略)

ELK+Filebeat+Kafka+ZooKeeper 構建海量日誌分析平臺