參考: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頁面配置(略)