大型系統分佈日誌採集系統ELK+Kafka
本博客參考了以下博客:
- https://cloud.tencent.com/developer/article/1376678
- https://www.cnblogs.com/JetpropelledSnake/p/9893566.html
- https://www.cnblogs.com/JetpropelledSnake/p/9893550.html
- https://segmentfault.com/a/1190000020134018
概述
傳統系統日誌收集問題
在傳統項目中,如果在生產環境中,有多臺不同的服務器集羣,如果生產環境需要通過日誌定位項目的Bug的話,需要在每臺節點上使用傳統的命令方式查詢,這樣效率非常低下。
通常,日誌被分散儲存在不同的設備上。如果你管理數十臺上百臺服務器,你還在使用以此登錄每臺機器的傳統方法查閱日誌。這樣不僅繁瑣而且效率低下。當務之急是我們如果集中化的管理日誌,例如:開源的syslog,將所有服務器上的日誌收集彙總。
集中化管理日誌後,日誌的統計和檢索又成爲一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux命令能實現檢索和統計,但是對於要求更好的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心。
命令方式
tail -n 300 myes.log | grep 'node-1'
tail -100f myes.log
分佈式日誌收集ELK原理
- 每臺服務器集羣節點安裝Logstash日誌收集系統插件
- 每臺服務器節點將日誌輸入到Logstash中
- Logstash將該日誌格式化爲json格式,根據每天創建不同的索引,輸出到ElasticSearch中
- 瀏覽器使用Kibana查詢日誌信息
ELK工作原理介紹圖:
ELK+Kafka整體架構
基於以上ELK架構的基礎,結合Kafka隊列,實現了ELK+Kafka集羣,整體架構如下:
# 1. 兩臺es組成es集羣;( 以下對elasticsearch簡稱es )
# 2. 中間三臺服務器就是我的kafka(zookeeper)集羣啦; 上面寫的 消費者/生產者 這是kafka(zookeeper)中的概念;
# 3. 最後面的就是一大堆的生產服務器啦,上面使用的是logstash,當然除了logstash也可以使用其他的工具來收集你的應用程序的日誌,例如:Flume,Scribe,Rsyslog,Scripts……
# 雙ES備份集羣: CentOS1+CentOS2
# Kafka+LogStash集羣:CentOS3+CentOS4+CentOS5
# ES-Header+Kibina+LogStash/Beats採集:CentOS6+CentOS7
服務器列表
主機名 | IP地址 | 系統信息 | 角色 | 安裝的軟件 |
---|---|---|---|---|
CentOS7-S-EN1 | 192.168.20.161 | CentOS Linux release 7.4.1708 (Core) | ES集羣 | jdk1.8、elasticsearch7.6.2 |
CentOS7-S-EN2 | 192.168.20.162 | CentOS Linux release 7.4.1708 (Core) | ES集羣 | jdk1.8、elasticsearch7.6.2、elasticsearch-head、logstash7.6.2、kibana7.6.2 |
CentOS7-S-EN3 | 192.168.20.163 | CentOS Linux release 7.4.1708 (Core) | Kafka+Zookeeper集羣 | jdk1.8、kafka2.13、logstash7.6.2 |
CentOS7-S-EN4 | 192.168.20.164 | CentOS Linux release 7.4.1708 (Core) | Kafka+Zookeeper集羣 | jdk1.8、kafka2.13、logstash7.6.2 |
CentOS7-S-EN5 | 192.168.20.165 | CentOS Linux release 7.4.1708 (Core) | Kafka+Zookeeper集羣 | jdk1.8、kafka2.13、logstash7.6.2 |
CentOS7-S-EN6 | 192.168.20.166 | CentOS Linux release 7.4.1708 (Core) | 日誌採集 | jdk1.8、logstash7.6.2 、tomcat8.5 |
CentOS7-S-EN7 | 192.168.20.167 | CentOS Linux release 7.4.1708 (Core) | 日誌採集 | jdk1.8、 logstash7.6.2 、tomcat8.5 |
使用軟件:
# Elasticsearch 7.6.2
# Kibana 7.6.2
# Logstash 7.6.2
# elasticsearch-head(從github直接clone)
# node-v6.0.0-linux-x64.tar.gz (記住文件夾路徑,需要增加到bash_profile中)
# kafka_2.13-2.4.1.tgz(該版本已經包含ZooKeeper服務)
部署步驟:
# 準備環境
# ES集羣安裝配置;
# Logstash客戶端配置(直接寫入數據到ES集羣,寫入系統messages日誌);
# Kafka(zookeeper)集羣配置;(Logstash寫入數據到Kafka消息系統);
準備環境
- 七臺centos7服務器(最少三臺)
- java環境
- Selinux關閉
- 本次環境搭建用到的JDK & ELK+Kafka安裝文件下載地址:
鏈接:https://pan.baidu.com/s/15RQpJmCKROVRxM5X00Q5kw
提取碼:vmfo
ES集羣安裝配置
elasticsearch的系統和jvm要求參考:https://www.elastic.co/cn/support/matrix
Elasticsearch默認使用自帶的jvm,但是如果本地安裝配置了jvm,則會自動使用本地的jvm,本地的jvm版本不能太低,可以向下兼容1.8
安裝參考博客:https://segmentfault.com/a/1190000020134018
https://www.elastic.co/guide/cn/elasticsearch/guide/current/running-elasticsearch.html
ES安裝
下載ES
- 可在服務器上通過wget直接下載
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-linux-x86_64.tar.gz
- 可以通過瀏覽器下載後傳到服務器上,下載地址:
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-linux-x86_64.tar.gz
安裝
服務器需要2G的內存
,其中1G內存會被elasticsearch鎖定,1G用來運行系統,內存過小的時候會導致虛擬機內存溢出elasticsearch起不起來- elasticsearch-head安裝
因爲ES主要通過restful api對外提供服務,所以一般安裝ES時順帶安裝elasticsearch-head,它提供了web控制檯。
elasticsearch-head通過源碼的方式託管在git上,所以需要安裝下git,直接yum安裝即可 yum install git
同時elasticsearch-head是一個nodejs應用,所以還需要具有node, 需要安裝phantomjs。(安裝教程可以參考這篇博客)
- 上傳到服務器後解壓,如下圖:
- Elasticsearch 7.6.1 目錄結構如下:
bin :腳本文件,包括 ES 啓動 & 安裝插件等等
config : elasticsearch.yml(ES 配置文件)、jvm.options(JVM 配置文件)、日誌配置文件等等
JDK : 內置的 JDK,JAVA_VERSION="12.0.1"
lib : 類庫
logs : 日誌文件
modules : ES 所有模塊,包括 X-pack 等
plugins : ES 已經安裝的插件。默認沒有插件
data : ES 啓動的時候,會有該目錄,用來存儲文檔數據。該目錄可以設置
配置參數
- elasticsearch配置
- 主節點配置
vim config/elasticsearch.yml
# 集羣名稱,可修改
cluster.name: ES-cluster
# 本機的主機名
node.name: es-node-1
#
# 如果目錄不存在,需要先創建
# 數據目錄路徑
path.data: /usr/local/software/elasticsearch/elasticsearch-7.6.2/es/data
# 日誌文件路徑
path.logs: /usr/local/software/elasticsearch/elasticsearch-7.6.2/es/logs/elasticsearch/logs/
# 支持遠程訪問
network.host: 0.0.0.0
# 設置其它節點和該節點交互的ip地址,如果不設置它會自動判斷,值必須是個真實的ip地址。
network.publish_host: 192.168.20.161
# 集羣主機列表
discovery.seed_hosts: ["192.168.20.161", "192.168.20.162"]
# restful api訪問接口,可更改
http.port: 9200
# 集羣內的主機(主機名,不一定全部都要寫)
cluster.initial_master_nodes: ["es-node-1", "es-node-2"]
# 節點是否被選舉爲 master
node.master: true
# 內存不向 swap 交互
bootstrap.memory_lock: true
# 是否開啓跨域訪問
http.cors.enabled: true
#開啓跨域訪問後的地址限制,*表示無限制
http.cors.allow-origin: "*"
- 設置elasticsearch內存
調整config下的jvm.options文件vim config/jvm.options
#最小佔用內存,默認爲1g,這裏我採用默認配置,可自行根據需要修改
-Xms1g
#最大佔用內存,默認爲1g,這裏我採用默認配置,可自行根據需要修改
-Xmx1g
- 從節點配置
vim config/elasticsearch.yml
# 集羣名稱,可修改
cluster.name: ES-cluster
# 本機的主機名
node.name: es-node-2
#
# 如果目錄不存在,需要先創建
# 數據目錄路徑
path.data: /usr/local/software/elasticsearch/elasticsearch-7.6.2/es/data
# 日誌文件路徑
path.logs: /usr/local/software/elasticsearch/elasticsearch-7.6.2/es/logs/elasticsearch/logs/
# 支持遠程訪問
network.host: 0.0.0.0
# 設置其它節點和該節點交互的ip地址,如果不設置它會自動判斷,值必須是個真實的ip地址。
network.publish_host: 192.168.20.162
# 集羣主機列表
discovery.seed_hosts: ["192.168.20.161", "192.168.20.162"]
# restful api訪問接口,可更改
http.port: 9200
# 集羣內的主機(主機名,不一定全部都要寫)
cluster.initial_master_nodes: ["es-node-1", "es-node-2"]
# 節點是否被選舉爲 master
node.master: false
# 內存不向 swap 交互
bootstrap.memory_lock: true
# 是否開啓跨域訪問
http.cors.enabled: true
#開啓跨域訪問後的地址限制,*表示無限制
http.cors.allow-origin: "*"
- 設置elasticsearch內存
調整config下的jvm.options文件vim config/jvm.options
#最小佔用內存,默認爲1g,這裏我採用默認配置,可自行根據需要修改
-Xms1g
#最大佔用內存,默認爲1g,這裏我採用默認配置,可自行根據需要修改
-Xmx1g
elasticsearch用戶擁有的內存權限太小,至少需要262144錯誤
參考博客:https://www.cnblogs.com/yidiandhappy/p/7714489.html
解決:
切換到root用戶
su root
執行命令:
sysctl -w vm.max_map_count=262144
查看結果:
sysctl -a|grep vm.max_map_count
顯示:
vm.max_map_count = 262144
啓動
elasticsearch不允許root用戶直接去啓動,否則會報以下錯誤
- 設置es用戶
新增es用戶
groupadd es
useradd es -g es
我這裏的es可以改成自己創建的用戶。
設置用戶密碼
passwd es
切換用戶
su es
-
root用戶下給新建的用戶elasticsearch目錄賦權
chown -R es:es /usr/local/software/elasticsearch/elasticsearch-7.6.2
-
內存交互錯誤解決方案:https://blog.csdn.net/zhanyu1/article/details/88927194
記得重啓系統 -
啓動Elasticsearch
執行命令:./bin/elasticsearch
啓動成功:
-
測試是否啓動成功
執行命令:curl 'http://localhost:9200/?pretty'
測試結果:
ES集羣
參考博客:https://www.jianshu.com/p/b9613b5dc26f
- 一個簡單的 ElasticSearch 就搭建好了,如果要部署一個ES集羣,那麼只需要在所有主機上部署好 Java 環境,以及在所有主機上的 /etc/hosts 解析主機,如下:
[root@seichung ] vim /etc/hosts
192.168.20.161 es-node-1
192.168.20.162 es-node-2
- es-node-2安裝
- 創建安裝目錄
mkdir elasticsearch
- 進入創建的目錄
cd elasticsearch
, 完整的目錄地址:/usr/local/software/elasticsearch
- 執行scp命令將161服務器上的elasticsearch解壓文件傳輸到162上:
scp -r [email protected]:/usr/local/software/elasticsearch/elasticsearch-7.6.2 ./
把192.168.20.161上的/usr/local/software/elasticsearch/elasticsearch-7.6.2文件copy到當前目錄中,具體修改點擊跳轉 - 更改用戶名,
vim config/elasticsearch.yml
,如下圖:
- 新增es用戶並賦權,點擊跳轉
- 分配用戶內存大小權限,點擊跳轉
- 啓動
- 如果沒有關閉防火牆,需要開放9200端口
firewall-cmd --zone=public --add-port=9200/tcp --permanent
開放9200端口
firewall-cmd --zone=public --remove-port=9200/tcp --permanent
關閉9200端口
firewall-cmd --reload
配置立即生效
firewall-cmd --zone=public --list-ports
查看防火牆所有開放的端口
防火牆常用命令:
啓動: systemctl start firewalld
查看狀態: systemctl status firewalld
停止: systemctl disable firewalld
禁用: systemctl stop firewalld
執行開機禁用防火牆自啓命令 : systemctl disable firewalld.service
防火牆隨系統開啓啓動 : systemctl enable firewalld.service
-
從節點啓動的時候如果報錯:java.lang.IllegalStateException: failure when sending a validation request to node
解決方案:
原因:從節點無法加入主節點
解決辦法:刪除data文件夾
rm -rf es/data
-
查看集羣是否搭建成功:
-
瀏覽器通過地址查看集羣節點信息:
http://192.168.20.161:9200/_cat/nodes?v
可以看到主節點是es-node-1 -
通過瀏覽器查看集羣健康:
http://192.168.20.161:9200/_cluster/health?pretty
-
通過命令直接查看:
curl -X GET "localhost:9200/_cat/health?v"
ES-head插件安裝
具體步驟參考博客:https://blog.csdn.net/Mr_Mocha/article/details/89175469
注意:
- nodejs版本是v6.0.0
- 安裝的時候如果速度比較慢,可以換成淘寶鏡像,具體步驟參考:https://blog.csdn.net/xuesheng1610748/article/details/98182768
- 啓動命令 :
nohup grunt server &
- 搭建完成後,我的head插件裝在162上,效果如下:
http://192.168.20.162:9100/
Logstach工作原理
Logstach介紹
Logstash是一個完全開源的工具,它可以對你的日誌進行收集、過濾、分析,支持大量的數據獲取防範,並將其存儲供以後使用(如搜索)。說到搜索,logstash帶有一個web界面,搜索和展示所有日誌。一般工作方式爲c/s架構,client端安裝在需要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操作再一併發往elasticsearch上去。
核心流程:Logstash事件處理有三個階段:inputs --> filters --> outputs。是一個接收,處理,轉發日誌的工具。支持系統日誌,webserver日誌,錯誤日誌,應用日誌,總之包括所有可以拋出來的日誌類型。
Logstash環境安裝
安裝並測試連接ES集羣
- 上傳logstash安裝包
- 解壓
tar -zxvf logstash-7.6.2.tar.gz
- 在config目錄下logstash-sample.conf 文件 copy 一份,重命名爲 logstash-testEs.conf,命令如下:
copy config/logstash-sample.conf logstash-testEs.conf
用vi編輯配置elasticsearch地址:vi config/logstash-testEs.conf
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
stdin {}
}
output {
elasticsearch {
hosts => ["http://192.168.20.161:9200", "http://192.168.20.162"]
index => "%{+YYYY.MM.dd}"
user => "es"
password => "123456"
}
}
- 配置jvm
vi config/jvm.options
-Xms256m
-Xmx256m
- 測試配置文件是否有語法問題:
/usr/local/software/logstash-7.6.2/bin/logstash -f /usr/local/software/logstash-7.6.2/config/logstash-testEs.conf -t --verbose
- 啓動並測試logstash
./bin/logstash -f ./config/logstash-testEs.conf
測試結果已經寫入集羣
日誌文件通過Logstash向Es集羣寫數據
測試,暫未通過Kafka隊列傳遞
- 新建
logstash_for_system_messages.conf
文件
touch logstash_for_system_messages.conf
- 編輯logstash_for_system_messages.conf文件:
vi logstash_for_system_messages.conf
input {
file{
path => "/var/log/messages" #這是日誌文件的絕對路徑
start_position=>"beginning" #這個表示從 messages 的第一行讀取,即文件開始處
}
}
output { #輸出到 es
elasticsearch { #這裏將按照這個索引格式來創建索引
hosts=>["192.168.20.161:9200","192.168.20.162:9200"]
index=>"system-messages-%{+YYYY-MM}"
}
}
記得把後面的註釋刪掉
-
測試ogstash_for_system_messages.conf文件
./bin/logstash -f ./config/logstash_for_system_messages.conf -t
-
啓動測試
# 注意,系統日誌需要權限,命令行前面使用 sudo
#[root@localhost logstash-7.6.2]$ sudo ./bin/logstash -f ./config/logstash_for_system_messages.conf
- 啓動成功後編輯目標日誌文件測試
常見問題參考:https://blog.csdn.net/sqandczm/article/details/89420108
系統日誌我們已經成功的收集,並且已經寫入到es集羣中.
上面的演示是logstash直接將日誌寫入到es集羣中的,這種場合我覺得如果量不是很大的話直接像上面已將將輸出output定義到es集羣即可.
如果量大的話需要加上消息隊列Kafka來緩解es集羣的壓力,下面就在三臺server上面安裝kafka集羣。
Kafka集羣安裝配置
下載
kafka_2.13-2.4.1 (該版本已經包含ZooKeeper服務)
從官網獲取裝包,https://kafka.apache.org/downloads
配置Zookeeper集羣
配置Zookeeper集羣,修改配置文件
在config目錄執行命令: vim zookeeper.properties
具體配置如下:
dataDir=/usr/local/software/kafka_2.13-2.4.1/zookeeperDir
# the port at which the clients will connect
clientPort=2181
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=1024
# 作爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
tickTime=2000
initLimit=20
syncLimit=10
server.1=192.168.20.163:2888:3888
server.2=192.168.20.164:2888:3888
server.3=192.168.20.165:2888:3888
# Disable the adminserver by default to avoid port conflicts.
# Set the port to something non-conflicting if choosing to enable this
admin.enableServer=false
# admin.serverPort=8080
# 說明:
tickTime : 這個時間是作爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
2888 端口:表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;
3888 端口:表示的是萬一集羣中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader ,而這個端口就是用來執行選舉時服務器相互通信的端口。
創建Zookeeper所需的目錄
進入Kafka目錄內
創建目錄zookeeperDir mkdir zookeeperDir
進入zookeeperDir目錄 cd zookeeperDir
在zookeeperDir目錄下創建myid文件,裏面的內容爲數字,用於標識主機,如果這個文件沒有的話,zookeeper是沒法啓動的
在zookeeperDir目錄下創建myid文件 touch myid
寫入zookeeper的唯一序號 echo 1 > myid
需要與配置文件彙總中的序號一致
以上就是zookeeper集羣的配置,下面等我配置好kafka之後直接複製到其他兩個節點即可
Kafka配置
修改內容如下:
# 唯一,填數字,本文中分別爲 1 / 2 / 3
broker.id = 1
# 這個 broker 監聽的端口
prot = 9092
# 唯一,填本機服務器 IP
host.name = 192.168.20.163
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
/socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
# 該目錄可以不用提前創建,在啓動時自己會創建
log.dirs = /usr/local/software/kafka_2.13-2.4.1/logs
# 這個就是 zookeeper 集羣的 ip 及端口
zookeeper.connect = 192.168.2.22 : 2181 , 192.168.2.23 : 2181 , 192.168.2.24 :2181
# 需要配置較大 分片影響讀寫速度
num.partitions = 16
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
# 時間按需求保留過期時間 避免磁盤滿
log.retention.hours = 168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
沒有註釋的都是默認配置
將kafka(zookeeper)的程序目錄全部拷貝至其他兩個節點
scp -r kafka_2.13-2.4.1 [email protected]:/usr/local/software
scp -r kafka_2.13-2.4.1 [email protected]:/usr/local/software
修改兩個節點的配置,注意這裏除了以下兩點不同外,都是相同的配置
# zookeeper 的配置
mkdir zookeeperDir
echo "x" > zookeeperDir/myid # “x”這裏是2或者3,前面已經使用過1了
# kafka 的配置
broker.id = x # “x”這裏是2或者3,前面已經使用過1了
host.name = 192.168.20.163 # ip改爲20.164或者20.165
修改完畢配置之後我們就可以啓動了,這裏先要啓動zookeeper集羣,才能啓動kafka
我們按照順序來,kafka1 –> kafka2 –>kafka3
#zookeeper啓動命令
./bin/zookeeper-server-start.sh ./config/zookeeper.properties &
#zookeeper停止命令
./bin/zookeeper-server-stop.sh
注意,如果zookeeper有問題 nohup的日誌文件會非常大,把磁盤佔滿,這個zookeeper服務可以通過自己些服務腳本來管理服務的啓動與關閉。
後面兩臺執行相同操作,在啓動過程當中會出現以下報錯信息
[2020-04-12 08:36:05,540] WARN Unexpected exception, tries=0, remaining init limit=39997, connecting to /192.168.20.164:2888 (org.apache.zookeeper.server.quorum.Learner)
java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.zookeeper.server.quorum.Learner.sockConnect(Learner.java:233)
at org.apache.zookeeper.server.quorum.Learner.connectToLeader(Learner.java:262)
at org.apache.zookeeper.server.quorum.Follower.followLeader(Follower.java:77)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1253)
由於zookeeper集羣在啓動的時候,每個結點都試圖去連接集羣中的其它結點,先啓動的肯定連不上後面還沒啓動的,所以上面日誌前面部分的異常是可以忽略的。通過後面部分可以看到,集羣在選出一個Leader後,最後穩定了。
其他節點也可能會出現類似的情況,屬於正常。
Zookeeper服務檢查
在Kafka三臺Server上執行如下命令netstat -nlpt | grep -E "2181|2888|3888"
顯示如下端口和信息,說明Zookeeper運行正常
可以看出,如果哪臺是Leader,那麼它就擁有2888這個端口
啓動Kafka服務
這時候zookeeper集羣已經啓動起來了,下面啓動kafka,也是依次按照順序啓動,kafka1 –> kafka2 –>kafka3
# 進入kafka目錄
cd /usr/local/software/kafka_2.13-2.4.1
# 啓動kafka服務:
./bin/kafka-server-start.sh ./config/server.properties &
# 停止kafka服務:
./bin/kafka-server-stop.sh
此時三臺上面的zookeeper及kafka都已經啓動完畢,下面來測試一下
建立一個主題(在Kafka Server 192.168.20.163)
# 注意:factor大小不能超過broker的個數
./bin/kafka-topics.sh --create --zookeeper 192.168.20.163:2181 --replication-factor 3 --partitions 1 --topic test1test2test
查看已經創建的topics(Kafka Server :192.168.20.163)
./bin/kafka-topics.sh --list --zookeeper 192.168.20.163:2181
查看test1test2test這個主題的詳情(Kafka Server :192.168.20.163)
./bin/kafka-console-producer.sh --broker-list 192.168.20.136:9092 --topic test1test2test
#主題名稱:test1test2test
#Partition:只有一個,從0開始
#leader :id爲4的broker
#Replicas 副本存在於broker id爲2,3,4的上面
#Isr:活躍狀態的broker
以上是Kafka生產者和消費者的測試,基於Kafka的Zookeeper集羣就成功了。
下面我們將ES Server:192.168.20.137上面的logstash的輸出改到kafka上面,將數據寫入到kafka中
137服務器上創建LogStash結合Kafka使用的.conf文件,注意文件目錄
編輯輸入到Kafka的.conf文件 vim logstash_for_kafka.conf
#這裏的輸入還是定義的是從日誌文件輸入
input {
file {
type => "system-message"
path => "/usr/local/software/tomcat8.5/logs/catalina.out"
start_position => "beginning"
}
}
output {
#這是標準輸出到終端,可以用於調試看有沒有輸出,注意輸出的方向可以有多個
stdout { codec => rubydebug }
#輸出到kafka
kafka {
#他們就是生產者
bootstrap_servers => "192.168.20.163:9092, 192.168.20.164:9092, 192.168.20.165:9092"
#這個將作爲主題的名稱,將會自動創建
topic_id => "system-secure"
#壓縮類型
compression_type => "snappy"
}
}
測試輸入到Kafka的配置文件 ./bin/logstash -f ./config/logstash_for_kafka.conf -t
使用該配置文件啓動LogStash
注意採集系統日誌需要權限,命令行前面必須加sudo, root用戶可以不用
./bin/logstash -f ./config/logstash_for_kafka.conf
驗證數據是否寫入到kafka,這裏我們檢查是否生成了一個叫system-secure的主題
./bin/kafka-topics.sh --describe --zookeeper 192.168.20.163:2181 --topic system-secure
對於logstash輸出的我們也可以提前先定義主題,然後啓動logstash 直接往定義好的主題寫數據就行啦,命令如下:
./bin/kafka-topics.sh --create --zookeeper 192.168.20.163:2181 --replication-factor 3 --partitions 3 --topic TOPIC_NAME
好了,我們將logstash收集到的數據寫入到了kafka中了
Kafka集羣安裝配置-kafka to ES
那如何將數據從kafka中讀取然後給ES集羣呢?
那下面我們在kafka集羣上安裝Logstash,可以通過上面的方法,先配置一臺的logstash,然後通過scp命令通過網絡拷貝,安裝路徑是/usr/local/software/logstash-7.6.2
三臺上面的logstash的配置如下,作用是將kafka集羣的數據讀取然後轉交給es集羣,這裏爲了測試我讓他新建一個索引文件,注意這裏的輸入日誌是secure,主題名稱是system-secure
-
如上所說,在三臺Kafka集羣的Server上分別安裝LogStash,並在如下目錄新建
logstash_kafka2ES.conf
-
配置logstash_kafka2ES.conf,logstash的config目錄下執行命令
vim logstash_kafka2ES.conf
-
在三臺Kafka Server上按順序分別啓動LogStash,啓動命令三臺是通用的
./bin/logstash -f ./config/logstash_kafka2ES.conf
-
測試通過Kafka隊列傳遞消息到ES集羣
在ES Server:192.168.20.167上寫入測試內容,利用secure這個文件來測試
可以看到消息已經分散的寫入ES及集羣中
ES Server 192.168.20.161
ES Server 192.168.20.162
Kibana安裝
該節參考博客:https://www.cnblogs.com/JetpropelledSnake/p/9893566.html
- 下載
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.6.2-linux-x86_64.tar.gz
- 編輯配置文件
vim kibana.yml
確保下列配置正確
server.port: 5601
# 本機ip
server.host: "192.168.20.162"
# elasticsearch集羣地址
elasticsearch.hosts: ["http://192.168.20.162:9200", "http://192.168.20.161:9200"]
上述配置完成後,就可以啓動了 ./bin/kibana
注意:1.Kibana默認不能用root用戶啓動,需要切到es用戶,沒有權限需要給es用戶賦權
訪問下http://192.168.20.162:5601
第一次訪問的時候,會要求設置Index Pattern,因爲我們在logstash-es.conf中設置爲logstash-%{+YYYY-MM},所以設置爲logstash-*就可以了。
# 這裏有可能會遇到要求你創建Index的情況,請參考官網的指導文件和該博客導入json文件即可
# 官網指導文件 https://www.elastic.co/guide/en/kibana/6.x/tutorial-load-dataset.html
# 如何批量導入數據到Kibana,https://www.cnblogs.com/hai-ping/p/6068946.html
Discover是主要的查詢交互界面,如下所示:
有時候在訪問discover的時候,提示no results found,如下所示:
這通常是由於默認的查詢時間範圍太短的原因,可以通過右上角的TimeRange來設置查詢的時間範圍。
到這裏,ELK+k的環境搭建與基本配置就完成了。
更多的配置與優化參見各官方文檔。
根據ES集羣中存入的數據,在Kibana中建立Index
建立好index後,就可以在Discover這裏查詢介入的數據了
ES集羣採用的查詢語言是DSL語言,該語言採用json的格式組織查詢語句。
Kibana可以多樣化展示ES集羣中介入的數據,github上有很多定製好的格式,針對常見生產環境可以直接配置,十分方便。
最終測試
歷經三晝夜,終於搞定了┐(´∀`)┌
安裝好的虛擬機服務器重啓一遍的步驟
- 191服務器上需要執行的命令如下:
# 1. 啓動elasticsearch
# 進入elasticsearch目錄
cd /usr/local/software/elasticsearch/elasticsearch-7.6.2
# 切換到es用戶
su es
# 啓動
./bin/elasticsearch &
# 通過瀏覽器訪問下面的地址查看是否啓動成功:
http://192.168.20.161:9200/_cluster/health?pretty
- 192服務器上需要執行了命令步驟
# 1. 啓動elasticsearch
# 進入elasticsearch目錄
cd /usr/local/software/elasticsearch/elasticsearch-7.6.2
# 切換到es用戶
su es
# 啓動
./bin/elasticsearch &
# 通過瀏覽器訪問下面的地址查看是否啓動成功:
http://192.168.20.161:9200/_cluster/health?pretty
# 2. 啓動 elasticsearch-head-master
# 進入elasticsearch-head-master目錄
cd /usr/local/software/elasticsearch/elasticsearch-head-master
# 切換成root用戶回車並輸入root密碼
su root
# 啓動 elasticsearch-head-master
nohup grunt server &
# 通過瀏覽器訪問下面的地址查看是否啓動成功:
http://192.168.20.162:9100/
3. 啓動kibana
# 進入kibana目錄
cd /usr/local/software/kibana-7.6.2-linux-x86_64
# 切換到es用戶,kibana不能用root啓動
su es
# 啓動
./bin/kibana
# 通過瀏覽器訪問下面的地址查看是否啓動成功:
http://192.168.20.162:5601/
- 193、194、195服務器上需要執行了命令步驟
# 1.啓動zookeeper
# 進入kafka目錄
cd /usr/local/software/kafka_2.13-2.4.1
# 啓動(zookeeper需要 193->194->195 上的三個按照順序啓動)
./bin/zookeeper-server-start.sh ./config/zookeeper.properties &
# 2.啓動kafka
# kafka目錄啓動kafka服務(kafka需要 193->194->195 上的三個按照順序啓動)
./bin/kafka-server-start.sh ./config/server.properties &
# 3.啓動logstash
# 進入logstash目錄
cd /usr/local/software/logstash-7.6.2
# 啓動logstash(三個都要啓動)
./bin/logstash -f ./config/logstash_kafka2ES.conf &
- 196、197服務器上需要執行的命令步驟
# 1.啓動logstash
# 進入logstash目錄
cd /usr/local/software/logstash-7.6.2
# 啓動logstash_for_kafka
./bin/logstash -f ./config/logstash_for_kafka.conf &
- 手動測試166/167tomcat日誌數據
# 手動想Catalina.out文件輸入測試數據
# 進入目標目錄
cd /usr/local/software/tomcat8.5/logs
echo "166服務器測試日誌----------" >> catalina.out
echo "167服務器測試日誌*********" >> catalina.out
# 寫入測試數據