搭建ELK+Kafka+filebeat日志分析系統


摘要

顧名思義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可視化工具,功能強大,使用起來非常人性化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM