摘要
顧名思義ELK+Kafka+Filebeat是由Elasticsearch,Logstash,Kibana,Kafka以及Filebeat幾大組件構成的一個基於web頁面的日志分析工具。
日志分析是運維工程師解決系統故障,發現問題的主要手段。日志包含多種類型,包括程序日志,系統日志以及安全日志等。通過對日志分析,預發故障的發生,又可以在故障發生時,尋找到蛛絲馬跡,快速定位故障點。及時解決。
一、組件介紹
1.1、Elasticsearch
是一個基於Lucene的搜索服務器。提供搜集、分析、存儲數據三大功能。它提供了一個分布式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用java開發的,並作為Apache許可條款下的開放源碼發布,是當前流行的企業級搜索引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便
1.2、Logstash
主要是用來日志的搜索、分析、過濾日志的工具。用於管理日志和事件的工具,你可以用它去收集日志、轉換日志、解析日志並將他們作為數據提供給其它模塊調用,例如搜索、存儲等
1.3、Kibana
是一個優秀的前端日志展示框架,它可以非常詳細的將日志轉化為各種圖標,為用戶提供強大的數據可視化支持,它能夠搜索、展示存儲在Elasticsearch中索引數據。使用它可以很方便的使用圖表、表格、地圖展示和分析數據
1.4、Kafka
數據緩沖隊列。作為消息隊列解耦了處理過程,同時提高了可擴展性。具有峰值處理能力,使用消息隊列能夠使關鍵組件頂住突發的訪問壓力,而不會因為突發的超負荷的請求而完全崩潰
- 發布和訂閱記錄流,類似於消息隊列或企業消息傳遞系統
- 以容錯持久的方式存儲記錄流
- 處理記錄發生的流
1.5、filebeat
隸屬於Beats,輕量級數據收集引擎。基於原先Logstash-forwarder的源碼改造出來。換句話說:Filebeat就是新版的Logstash-forwarder,也會是ELK Stack在Agent的第一選擇,目前Beats包含四種工具:
- Packetbeat(搜集網絡流量數據)
- Metricbeat(搜集系統、進程和文件系統級別的CPU和內存使用情況等數據)
- Filebeat(搜集文件系統)
- Winlogbeat(搜集Windows事件日志數據)
二、環境介紹
主機名 |
IP地址 |
系統版本 |
安裝軟件 |
master |
20.0.0.10 |
Centos7.4 |
Elasticsearch/zookeeper/kafka/Logstash/kibana |
node1 |
20.0.0.20 |
Elasticsearch/zookeeper/kafka |
|
node2 |
20.0.0.30 |
Elasticsearch/zookeeper/kafka |
|
node3 |
20.0.0.40 |
Filebeat |
三、版本說明
jdk:1.8 Elasticsearch: 6.5.4 Logstash: 6.5.4 Kibana: 6.5.4 Kafka: 2.11.1 Filebeat: 6.5.4 相應的版本最好下載對應的插件
四、搭建架構
相關地址:
官網地址:https://www.elastic.co
官網搭建:https://www.elastic.co/guide/index.html
五、實施部署
下載並上傳軟件包到對應機器上
5.1、Elasticsearch集群部署
5.1.1、基本配置(四台節點都要設置)
1 修改主機名 2 [root@server1 ~]# hostnamectl set-hostname master 3 [root@server2 ~]# hostnamectl set-hostname node1 4 [root@server3 ~]# hostnamectl set-hostname node2 5 [root@server4 ~]# hostnamectl set-hostname node3 6
7 關閉防火牆和核心防護 8 [root@master ~]# systemctl stop firewalld.service #master上演示 9 [root@master ~]# setenforce 0
10
11 添加映射 12 [root@master ~]# vi /etc/hosts #master上演示 13 20.0.0.10 master 14 20.0.0.20 node1 15 20.0.0.30 node2 16 20.0.0.40 node3
5.1.2、安裝配置jdk(下面的操作在master、node1和node2上配置,master上演示)
1 解壓縮 2 [root@master ~]# tar zxf jdk-8u91-linux-x64.tar.gz -C /usr/local/
3
4 改文件名 5 [root@master ~]# mv /usr/local/jdk1.8.0_91/ /usr/local/java 6
7 環境變量 8 [root@master ~]# echo ' 9 JAVA_HOME=/usr/local/java 10 PATH=$JAVA_HOME/bin:$PATH 11 export JAVA_HOME PATH 12 ' >> /etc/profile.d/java.sh
13
14 執行腳本 15 [root@master ~]# source /etc/profile.d/java.sh
16
17 查看java版本 18 [root@master ~]# java -version 19 java version "1.8.0_91"
20 Java(TM) SE Runtime Environment (build 1.8.0_91-b14) 21 Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
5.1.3、安裝配置ES
①創建運行ES的普通用戶
1 [root@master ~]# useradd elsearch 2 [root@master ~]# echo "123456" | passwd --stdin "elsearch"
②安裝配置ES
1 解壓縮 2 [root@master ~]# tar zxf elasticsearch-6.5.4.tar.gz -C /usr/local/
3 [root@master ~]# mv /usr/local/elasticsearch-6.5.4/ /usr/local/elasticsearch 4
5 修改配置文件 6 [root@master ~]# vim /usr/local/elasticsearch/config/elasticsearch.yml 7 cluster.name: elk 8 node.name: elk01 #node1為elk02,node2為elk03 9 node.master: true
10 node.data: true
11 path.data: /data/elasticsearch/data 12 path.logs: /data/elasticsearch/logs 13 bootstrap.memory_lock: false
14 bootstrap.system_call_filter: false
15 network.host: 0.0.0.0
16 http.port: 9200
17 discovery.zen.ping.unicast.hosts: ["20.0.0.10","20.0.0.20","20.0.0.30"] 18 discovery.zen.ping_timeout: 150s 19 discovery.zen.fd.ping_retries: 10
20 client.transport.ping_timeout: 60s 21 http.cors.enabled: true
22 http.cors.allow-origin: "*"
23
24 創建ES數據及日志存儲目錄 25 [root@master ~]# mkdir -p /data/elasticsearch/data 26 [root@master ~]# mkdir -p /data/elasticsearch/logs 27
28 修改安裝目錄及存儲目錄權限 29 [root@master ~]# chown -R elsearch:elsearch /data/elasticsearch 30 [root@master ~]# chown -R elsearch:elsearch /usr/local/elasticsearch
配置項解讀
1 cluster.name #集群名稱,各節點配成相同的集群名稱 2 node.name #節點名稱,各節點配置不同 3 node.master #指示某個節點是否符合成為主節點的條件 4 node.data #指示節點是否為數據節點。數據節點包含並管理索引的一部分 5 path.data #數據存儲目錄 6 path.logs #日志存儲目錄 7 bootstrap.memory_lock #內存鎖定,是否禁用交換 8 bootstrap.system_call_filter #系統調用過濾器 9 network.host #綁定節點IP 10 http.port #rest api端口 11 discovery.zen.ping.unicast.hosts #提供其他Elasticsearch服務節點的單點廣播發現功能 12 discovery.zen.ping_timeout #節點在發現過程中的等待時間 13 discovery.zen.fd.ping_retries #節點發現重試次數 14 http.cors.enabled #是否允許跨源REST請求,用於允許head插件訪問ES 15 http.cors.allow-origin #允許的源地址
③系統優化
1 修改內存參數 2 [root@master ~]# vim /etc/security/limits.conf 3 #末尾添加 4 * soft nofile 65536
5 * hard nofile 131072
6 * soft nproc 2048
7 * hard nproc 4096
8
9 增加最大內存映射數 10 [root@master ~]# echo "vm.max_map_count=262144" >> /etc/sysctl.conf 11 [root@master ~]# sysctl -p 12 vm.max_map_count = 262144
④啟動ES
1 切換到elsearch用戶 2 [root@master ~]# su - elsearch 3
4 啟動ES 5 [elsearch@master ~]$ cd /usr/local/elasticsearch/
6 [elsearch@master elasticsearch]$ nohup bin/elasticsearch &
7 [1] 41611
8 [elsearch@master elasticsearch]$ nohup: 忽略輸入並把輸出追加到"nohup.out"
9
10 查看進程 11 [elsearch@master elasticsearch]$ jobs 12 [1]+ 運行中 nohup bin/elasticsearch &
13
14 查看進程啟動情況 15 [elsearch@master elasticsearch]$ tailf nohup.out 16 ...... 17 [2020-12-10T16:32:24,284][INFO ][o.e.n.Node ] [elk01] started #顯示started啟動成功
⑤網頁訪問http://20.0.0.10:9200
⑥安裝配置head監控插件
1)安裝node
1 添加阿里雲源並重建yum源 2 [root@master elasticsearch]# wget -O /etc/yum.repos.d/CentOS-Base-epel.repo http://mirrors.aliyun.com/repo/Centos-7.repo
3 [root@master elasticsearch]# wget -P /etc/yum.repos.d http://mirrors.163.com/.help/CentOS7-Base-163.repo
4 [root@master elasticsearch]# yum clean all 5 [root@master elasticsearch]# yum makecache 6
7 安裝node 8 [root@master elasticsearch]# wget https://npm.taobao.org/mirrors/node/latest-v4.x/node-v4.4.7-linux-x64.tar.gz #下載
9 [root@master ~]# tar zxf node-v4.4.7-linux-x64.tar.gz -C /usr/local/ #解壓縮 10 [root@master ~]# mv /usr/local/node-v4.4.7-linux-x64/ /usr/local/node 11 [root@master ~]# echo ' 12 NODE_HOME=/usr/local/node 13 PATH=$NODE_HOME/bin:$PATH 14 export NODE_HOME PATH 15 ' >> /etc/profile.d/node.sh
16 [root@master ~]# source /etc/profile.d/node.sh
17 [root@master ~]# node --version #檢查版本 18 v4.4.7
2)下載head插件
1 [root@master ~]# wget https://github.com/mobz/elasticsearch-head/archive/naster.zip
2 [root@master ~]# unzip -d /usr/local/ master.zip
3)安裝grunt
1 [root@master ~]# cd /usr/local/elasticsearch-head-master/
2 [root@master elasticsearch-head-master]# npm install -g grunt-cli 3 [root@master elasticsearch-head-master]# grunt --version #查看版本 4 [root@master elasticsearch-head-master]# grunt --version 5 grunt-cli v1.3.2
4)修改head源碼
1 [root@master elasticsearch-head-master]# vi /usr/local/elasticsearch-head-master/Gruntfile.js 2 94 connect: { 3 95 server: { 4 96 options: { 5 97 port: 9100, 6 98 base: '.', 7 99 keepalive: true, 8 100 hostname:'*'
9 #注意要在true后面加“,”而hostname“*”后不需要 10
11 [root@master elasticsearch-head-master]# vi /usr/local/elasticsearch-head-master/_site/app.js 12 4385 init: function(parent) { 13 4386 this._super(); 14 4387 this.prefs = services.Preferences.instanc e(); 4388 this.base_uri = this.config.base_uri || t his.prefs.get("app-base_uri") || "http://20.0.0.10:9200"; 15 #原本是http://localhost:9200
5)下載head必要的文件
1 [root@master ~]# wget https://github.com/Medium/phantomjs/releases/download/v2.1.1/phantomjs-2.1.1-linux-x86_64.tar.bz2
2 [root@master ~]# yum -y install bzip2
3 [root@master ~]# tar jxf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /tmp
6)運行head
1 [root@master elasticsearch-head-master]# npm install --registry=https://registry.npm.taobao.org
2 [root@master elasticsearch-head-master]# nohup grunt server &
3 [1] 42584
4 [root@master elasticsearch-head-master]# nohup: 忽略輸入並把輸出追加到"nohup.out"
7)測試網頁訪問https://20.0.0.10:9100
5.2、Kibana部署
5.2.1、安裝配置Kibana(master上安裝)
①安裝
1 [root@master ~]# tar zxf kibana-6.5.4-linux-x86_64.tar.gz -C /usr/local/
②配置
1 [root@master ~]# echo ' 2 server.port: 5601
3 server.host: "20.0.0.10"
4 elasticsearch.url: "http://20.0.0.10:9200"
5 kibana.index: ".kibana"
6 ' >> /usr/local/kibana-6.5.4-linux-x86_64/config/kibana.yml
③啟動
1 [root@master ~]# cd /usr/local/kibana-6.5.4-linux-x86_64/
2 [root@master kibana-6.5.4-linux-x86_64]# nohup ./bin/kibana &
3 [2] 42730
4 [root@master kibana-6.5.4-linux-x86_64]# nohup: 忽略輸入並把輸出追加到"nohup.out"
5.3、Kafka部署
5.3.1、安裝配置jdk(master、node1和node2上操作,master上演示)
1 解壓縮 2 [root@master ~]# tar zxf jdk-8u91-linux-x64.tar.gz -C /usr/local/
3
4 改文件名 5 [root@master ~]# mv /usr/local/jdk1.8.0_91/ /usr/local/java 6
7 環境變量 8 [root@master ~]# echo ' 9 JAVA_HOME=/usr/local/java 10 PATH=$JAVA_HOME/bin:$PATH 11 export JAVA_HOME PATH 12 ' >> /etc/profile.d/java.sh
13
14 執行腳本 15 [root@master ~]# source /etc/profile.d/java.sh
16
17 查看java版本 18 [root@master ~]# java -version 19 java version "1.8.0_91"
20 Java(TM) SE Runtime Environment (build 1.8.0_91-b14) 21 Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
5.3.2、安裝配置ZK
Kafka運行依賴ZK,Kafka官網提供的tar包中,以及包含了ZK,這里不再額外下載ZK程序
①安裝
1 [root@master ~]# tar zxf kafka_2.11-1.1.1.tgz -C /usr/local/
②配置
1 [root@master ~]# sed -i 's/^[^#]/#&/' /usr/local/kafka_2.11-1.1.1/config/zookeeper.properties #所有未注釋內容前加# 2 [root@master ~]# echo ' 3 > dataDir=/opt/data/zookeeper/data 4 > dataLogDir=/opt/data/zookeeper/logs 5 > clientPort=2181
6 > tickTime=2000
7 > initLimit=20
8 > syncLimit=10
9 > server.1=20.0.0.10:2888:3888
10 > server.1=20.0.0.20:2888:3888
11 > server.1=20.0.0.30:2888:3888
12 > ' >>/usr/local/kafka_2.11-1.1.1/config/zookeeper.properties
③創建目錄
1 [root@master ~]# mkdir -p /opt/data/zookeeper/{data,logs}
④創建myid文件
1 [root@master ~]# echo 1 > /opt/data/zookeeper/data/myid #每台Kafka機器都要做成唯一ID
5.3.3、配置Kafka
①配置
1 [root@master ~]# sed -i 's/^[^#]/#&/' /usr/local/kafka_2.11-1.1.1/config/server.properties 2
3 echo ' 4 broker.id=1 #Kafka機器的每個ID和myid保持一樣 5 listeners=PLAINTEXT://20.0.0.10:9092 #監聽自己的IP地址
6 num.network.threads=3
7 num.io.threads=8
8 socket.send.buffer.bytes=102400
9 socket.receive.buffer.bytes=102400
10 socket.request.max.bytes=104857600
11 log.dirs=/opt/data/kafka/logs 12 num.partitions=6
13 num.recovery.threads.per.data.dir=1
14 offsets.topic.replication.factor=2
15 transaction.state.log.replication.factor=1
16 transaction.state.log.min.isr=1
17 log.retention.hours=168
18 log.segment.bytes=536870912
19 log.retention.check.interval.ms=300000
20 zookeeper.connect=20.0.0.10:2181,20.0.0.20:2181,20.0.0.30:2181
21 zookeeper.connection.timeout.ms=6000
22 group.initial.rebalance.delay.ms=0
23 ' >> /usr/local/kafka_2.11-1.1.1/config/server.properties
②創建log目錄
1 [root@master ~]# mkdir -p /opt/data/kafka/logs
③啟動、驗證ZK集群
1 啟動 2 [root@master kafka_2.11-1.1.1]# nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
3 [3] 43030
4 [root@master kafka_2.11-1.1.1]# nohup: 忽略輸入並把輸出追加到"nohup.out"
5
6 驗證,查看ZK配置 7 [root@master kafka_2.11-1.1.1]# echo conf | nc 127.0.0.1 2181
8 clientPort=2181
9 dataDir=/opt/data/zookeeper/data/version-2
10 dataLogDir=/opt/data/zookeeper/logs/version-2
11 tickTime=2000
12 maxClientCnxns=60
13 minSessionTimeout=4000
14 maxSessionTimeout=40000
15 serverId=0
16
17 查看ZK狀態 18 [root@master kafka_2.11-1.1.1]# echo stat | nc 127.0.0.1 2181
19 Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT 20 Clients: 21 /127.0.0.1:42614[0](queued=0,recved=1,sent=0) 22
23 Latency min/avg/max: 0/0/0
24 Received: 5
25 Sent: 4
26 Connections: 1
27 Outstanding: 0
28 Zxid: 0x0
29 Mode: standalone 30 Node count: 4
31
32 查看端口 33 [root@master kafka_2.11-1.1.1]# lsof -i:2181
34 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 35 java 43030 root 96u IPv6 85536 0t0 TCP *:eforward (LISTEN)
④啟動、驗證Kafka
1 啟動 2 [root@master kafka_2.11-1.1.1]# cd /usr/local/kafka_2.11-1.1.1/
3 [root@master kafka_2.11-1.1.1]# nohup bin/kafka-server-start.sh config/server.properties &
4 [4] 43413
5 [root@master kafka_2.11-1.1.1]# nohup: 忽略輸入並把輸出追加到"nohup.out"
6
7 驗證 8 在20.0.0.10上創建topic 9 [root@master kafka_2.11-1.1.1]# bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testtopic 10 Created topic "testtopic". 11 查詢20.0.0.10上的topic 12 [root@master kafka_2.11-1.1.1]# bin/kafka-topic.sh --zookeeper 20.0.0.10:2181 --list 13 testtopic 14 查詢20.0.0.20上的topic 15 [root@node1 kafka_2.11-1.1.1]# bin/kafka-topic.sh --zookeeper 20.0.0.20:2181 --list 16 testtopic 17 查詢20.0.0.30上的topic 18 [root@node2 kafka_2.11-1.1.1]# bin/kafka-topic.sh --zookeeper 20.0.0.30:2181 --list 19 testtopic
5.4、Logstash部署
5.4.1、安裝(master上安裝)
1 [root@master ~]# tar zxf logstash-6.5.4.tar.gz -C /usr/local/
5.4.2、配置
1 創建目錄 2 [root@master ~]# mkdir -p /usr/local/logstash-6.5.4/etc/conf.d 3
4 [root@master ~]# vi /usr/local/logstash-6.5.4/etc/conf.d/input.conf 5 input { 6 kafka { 7 type => "httpd_kafka"
8 codec => "json"
9 topics => "httpd"
10 decorate_events => true
11 bootstrap_servers => "20.0.0.10:9092, 20.0.0.20:9092, 20.0.0.30:9092"
12 } 13 } 14
15 [root@master ~]# vi /usr/local/logstash-6.5.4/etc/conf.d/output.conf 16 output { 17 if [type] == "httpd_kafka" { 18 elasticsearch { 19 hosts => ["20.0.0.10","20.0.0.20","20.0.0.30"] 20 index => 'logstash-httpd-%{+YYYY-MM-dd}'
21 } 22 } 23 }
5.4.3、啟動
1 [root@master logstash-6.5.4]# nohup bin/logstash -f etc/conf.d/ --config.reload.automatic &
2 [7] 46230
3 [root@master logstash-6.5.4]# nohup: 忽略輸入並把輸出追加到"nohup.out"
5.5、Filebeat部署
5.5.1、下載(node3上安裝)
1 [root@node3 ~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.4-linux-x86_64.tar.gz
5.5.2、解壓
1 [root@node3 ~]# tar zxf filebeat-6.5.4-linux-x86_64.tar.gz -C /usr/local/
2 [root@node3 ~]# cd /usr/local/
3 [root@node3 local]# mv filebeat-6.5.4-linux-x86_64/ filebeat 4 [root@node3 local]# cd filebeat/
5.5.3、修改配置
修改Filebeat配置,支持收集本地目錄日志,並輸出日志到Kafka集群中
1 [root@node3 filebeat]# cp filebeat.yml filebeat.yml.bak 2 [root@node3 filebeat]# vim filebeat.yml 3 filebeat.prospectors: 4 - input_type: log 5 paths: 6 - /var/log/httpd/access_log 7 json.keys_under_root: true
8 json.add_error_key: true
9 json.message_key: log 10
11 output.kafka: 12 hosts: [ "20.0.0.10:9092","20.0.0.20:9092","20.0.0.30:9092" ] 13 topic: 'httpd'
5.5.4、安裝httpd服務
1 [root@node3 filebeat]# yum -y install httpd 2 [root@node3 filebeat]# systemctl start httpd 3 [root@node3 filebeat]# netstat -anpt | grep httpd 4 tcp6 0 0 :::80 :::* LISTEN 57726/httpd 5 [root@node3 filebeat]# ll /var/log/httpd/
6 總用量 4
7 -rw-r--r--. 1 root root 0 12月 10 18:38 access_log 8 -rw-r--r--. 1 root root 925 12月 10 18:38 error_log
5.5.5、啟動
1 [root@node3 filebeat]# nohup ./filebeat -e -c filebeat.yml &
2 [1] 57774
3 [root@node3 filebeat]# nohup: 忽略輸入並把輸出追加到"nohup.out"
5.5.6、查看狀態
1 [root@node3 filebeat]# tailf nohup.out
5.5.7、查看master上logstash
[root@master kibana-6.5.4-linux-x86_64]# cd /usr/local/logstash-6.5.4/ [root@master logstash-6.5.4]# tailf nohup.out
5.5.8、網頁訪問http://20.0.0.40(多訪問幾次)
5.5.9、網頁訪問http://20.0.0.10:9100,查看是否有所有日志產生
5.5.10、網頁查看http://20.0.0.10:5601的Kibana界面,去看日志狀態
5.5.11、網頁訪問http://20.0.0.10:9100也可以看到訪問記錄
5.5.12、網頁訪問http://20.0.0.10:5601
六、總結
ELK+Kafka+filebeat日志分析系統是一款非常強大的日志分析工具,能夠幫助運維工程師更快更准確的定位到想要的日志,特別是kibana可視化工具,功能強大,使用起來非常人性化