幾種常見的 Kafka 集群監(jiān)控工具
本文選自電子工業(yè)出版社的新書《kafka進階》,推薦一下。
一個功能健全的kafka集群可以處理相當(dāng)大的數(shù)據(jù)量,由于消息系統(tǒng)是很多大型應(yīng)用的基石,因此broker集群在性能上的缺陷,都會引起整個應(yīng)用棧的各種問題。
Kafka的度量指標(biāo)主要有以下三類:
1.Kafka服務(wù)器(Kafka)指標(biāo)
2.生產(chǎn)者指標(biāo)
3.消費者指標(biāo)
另外,由于Kafka的狀態(tài)靠Zookeeper來維護,對于Zookeeper性能的監(jiān)控也成為了整個Kafka監(jiān)控計劃中一個必不可少的組成部分。
Kafka的監(jiān)控指標(biāo)
Broker度量指標(biāo)
Kafka的服務(wù)端度量指標(biāo)是為了監(jiān)控broker,也是整個消息系統(tǒng)的核心。因為所有消息都通過kafka broker傳遞,然后被消費,所以對于broker集群上出現(xiàn)的問題的監(jiān)控和告警就尤為重要。broker性能指標(biāo)有以下三類:
Kafka本身的指標(biāo)
主機層面的指標(biāo)
JVM垃圾回收指標(biāo)
UnderReplicatedPartitions |
在一個運行健康的集群中,處于同步狀態(tài)的副本數(shù)(ISR)應(yīng)該與總副本數(shù)(簡稱AR:Assigned Repllicas)完全相等,如果分區(qū)的副本遠(yuǎn)遠(yuǎn)落后于leader,那這個follower將被ISR池刪除,隨之而來的是IsrShrinksPerSec(可理解為isr的縮水情況,后面會講)的增加。由于kafka的高可用性必須通過副本來滿足,所有有必要重點關(guān)注這個指標(biāo),讓它長期處于大于0的狀態(tài)。 |
IsrShrinksPerSec IsrExpandsPerSec |
任意一個分區(qū)的處于同步狀態(tài)的副本數(shù)(ISR)應(yīng)該保持穩(wěn)定,只有一種例外,就是當(dāng)你擴展broker節(jié)點或者刪除某個partition的時候。為了保證高可用性,健康的kafka集群必須要保證最小ISR數(shù),以防在某個partiton的leader掛掉時它的follower可以接管。如果IsrShrinksPerSec(ISR縮水) 增加了,但并沒有隨之而來的IsrExpandsPerSec(ISR擴展)的增加,就將引起重視并人工介入。 |
ActiveControllerCount |
controller的職責(zé)是維護partition leader的列表,當(dāng)遇到這個值等于0且持續(xù)了一小段時間(<1秒)的時候,必須發(fā)出明確的告警。 |
OfflinePartitionsCount |
這個指標(biāo)報告了沒有活躍leader的partition數(shù)。 |
LeaderElectionRateAndTimeMs |
leader選舉的頻率(每秒鐘多少次)和集群中無leader狀態(tài)的時長(以毫秒為單位) |
UncleanLeaderElectionsPerSec |
這個指標(biāo)如果存在的話很糟糕,這說明kafka集群在尋找partition leader節(jié)點上出現(xiàn)了故障 |
TotalTimeMs |
這個指標(biāo)是由4個其他指標(biāo)的總和構(gòu)成的: lqueue:處于請求隊列中的等待時間 llocal:leader節(jié)點處理的時間 lremote:等待follower節(jié)點響應(yīng)的時間 lresponse:發(fā)送響應(yīng)的時間 |
BytesInPerSec BytesOutPerSec |
Kafka的吞吐量 |
生產(chǎn)者度量指標(biāo)
Response rate |
響應(yīng)的速率是指數(shù)據(jù)從producer發(fā)送到broker的速率 |
Request rate |
請求的速率是指數(shù)據(jù)從producer發(fā)送到broker的速率 |
Request latency avg |
平均請求延遲 |
Outgoing byte rate |
Producer的網(wǎng)絡(luò)吞吐量 |
IO wait time ns avg |
Producer的I/O等待的時間 |
消費者度量指標(biāo)
ConsumerLag MaxLag |
指consumer當(dāng)前的日志偏移量相對生產(chǎn)者的日志偏移量 |
BytesPerSec |
消費者的網(wǎng)絡(luò)吞吐量 |
MessagesPerSec |
消息的消費速度 |
ZooKeeperCommitsPerSec |
當(dāng)zookeeper處于高寫負(fù)載的時候,將會遇到成為性能瓶頸,從而導(dǎo)致從kafka管道抓取數(shù)據(jù)變得緩慢。隨著時間推移跟蹤這個指標(biāo),可以幫助定位到zookeeper的性能問題,如果發(fā)現(xiàn)有大量發(fā)往zookeeper的commit請求,你需要考慮的是,要不對zookeeper集群進行擴展。 |
MinFetchRate |
消費者最小拉取的速率 |
通過官方網(wǎng)站的說明(http://kafka.apache.org/documentation/#monitoring),可以查看Kafka提供的所有的監(jiān)控指標(biāo)參數(shù)。在這里只是列出了部分主要的參數(shù)指標(biāo)。
使用Kafka客戶端監(jiān)控工具
Kafka常用的客戶端管理、監(jiān)控工具,主要有以下幾種:
Kafka Manager
Kafka Tool
KafkaOffsetMonitor
JConsole
其中,前三個工具都是專門用于Kafka集群的管理與監(jiān)控;而JConsole(Java Monitoring and Management Console),是一種基于JMX的可視化監(jiān)視、管理工具,安裝好了JDK以后,Java就為我們提供了JConsole的客戶端工具。利用它我們也可以監(jiān)控Kafka的各項指標(biāo)。
這里我們簡單介紹一下JMX。JMX的全稱為Java Management Extensions。可以管理、監(jiān)控正在運行中的Java程序。常用于管理線程,內(nèi)存,日志Level,服務(wù)重啟,系統(tǒng)環(huán)境等。而Kafka底層也是基于Java的,所以我們也就可以使用JMX的標(biāo)準(zhǔn)來管理和監(jiān)控運行中的Kafka了。
下面我們分別介紹它們的使用方法。
Kafka Manager
Kafka Manager的Github地址是https://github.com/yahoo/kafka-manager。這款監(jiān)控框架的好處在于監(jiān)控內(nèi)容相對豐富,既能夠?qū)崿F(xiàn)broker級常見的JMX監(jiān)控(比如出入站流量監(jiān)控),也能對consumer消費進度進行監(jiān)控(比如lag等)。另外用戶還能在頁面上直接對集群進行管理,比如分區(qū)重分配或創(chuàng)建topic——當(dāng)然這是一把雙刃劍,好在kafka manager自己提供了只讀機制,允許用戶禁掉這些管理功能。
這里我們使用的版本是:kafka-manager-2.0.0.2.zip。安裝和配置非常簡單,按照下面的步驟配置Kafka Manager:
(1)首先,需要在啟動Kafka集群的命令腳本中,增加JMX的相關(guān)參數(shù)。否則無法使用客戶端工具管理和監(jiān)控Kafka集群。這里我們以kafka101主機上運行的broker 0和broker 1為例,來為大家演示。進入kafka安裝目錄下的bin目錄
cd /root/training/kafka_2.11-2.4.0/bin/
(2)修改kafka-run-class.sh文件,找到“JMX setting”的位置(第176行)。增加JMX Server的配置信息。如圖7.1所示。
-Djava.rmi.server.hostname=kafka101

圖7.1 修改Kafka Manager的JMX Setting
注意:
由于在kafka101主機上將會啟動兩個broker,為了方便可以在命令終端中使用export命令設(shè)置JMX的端口地址;也可以像下面這樣把JMX的端口寫到kafka-server-start.sh腳本中,如圖7.2所示,修改第30行。
export JMX_PORT="9999"

圖7.2 設(shè)置JMX的端口
(3)啟動Kafka Broker 0
export JMX_PORT="9990"
bin/kafka-server-start.sh config/server.properties &
(4)重新開啟一個命令行終端,啟動Kafka Broker 1
export JMX_PORT="9991"
bin/kafka-server-start.sh config/server1.properties &
(5)將Kafka Manager的壓縮包解壓至/root/training目錄
unzip kafka-manager-2.0.0.2.zip -d ~/training/
(6)進入Kafka Manager的conf目錄,并修改application.conf文件
#這里我們指定ZooKeeper集群的地址
kafka-manager.zkhosts="kafka101:2181,kafka102:2181,kafka103:2181"
#將下面的這一行注釋掉
#kafka-manager.zkhosts=${?ZK_HOSTS}
(7)采用nohup的方式啟動Kafka Manager
nohup bin/kafka-manager &
也可以像下面這樣啟動Kafka Manager的時候,指定相關(guān)參數(shù):
nohup bin/kafka-manager -Dconfig.file=conf/application.conf -Dhttp.port=8080 &
(8)啟動成功后,將輸出如下的日志信息,如圖7.3所示:

圖7.3 啟動Kafka Manager
可以看到,Kafka Manager將運行在9000端口上。
(9)通過瀏覽器訪問9000端口,可以打開Kafka Manager的Web控制臺,如圖7.4所示:

圖7.4 Kafka Manager的Web控制臺
(10)選擇“Cluster”-->“Add Cluster”,添加一個新的Kafka集群。勾選“Enable JMX Polling”,并點擊“Save”。如圖7.5所示:

圖7.5 添加Kafka集群
(11)添加成功后,點擊“Go to Cluster View”,跳轉(zhuǎn)到Kafka 集群的首頁,如圖7.6所示:

圖7.6 Kafka集群首頁
在這里,可以看到當(dāng)前的Kafka集群中共存在2個Broker,即:broker 0和broker 1;還有3個Topics。
(12)點擊Brokers的數(shù)字“2”,跳轉(zhuǎn)到Broker的監(jiān)控頁面上。在這里就可以實時監(jiān)控Kafka集群Broker的相關(guān)信息了。如Kafka集群的吞吐量(Bytes in /sec、Bytes out /sec)等等,如圖7.7所示:

圖7.7 監(jiān)控Kafka Broker
(13)圖7.8所示,展示了Kafka集群Topic的監(jiān)控信息。

圖7.8 監(jiān)控Kafka Topic
Kafka Tool
Kafka Tool是用于管理和使用Apache Kafka集群的圖形應(yīng)用程序。它提供了一種直觀的界面風(fēng)格,可讓用戶快速查看Kafka集群中的對象以及集群主題中存儲的消息。它包含面向開發(fā)人員和管理員的功能,一些關(guān)鍵功能如下:
快速查看所有Kafka集群,包括其broker,主題和消費者
查看分區(qū)中消息的內(nèi)容并添加新消息
查看消費者的偏移量,包括Apache Storm中的spout消費者
以良好的格式顯示JSON和XML消息
添加和刪除主題以及其他管理功能
將單個消息從您的分區(qū)保存到本地硬盤驅(qū)動器
編寫自己的插件,使您可以查看自定義數(shù)據(jù)格式
Kafka工具可在Windows,Linux和Mac OS上運行
從Kafka Tool的官方網(wǎng)站(https://www.kafkatool.com/download.html)上,直接下載Kafka Tool。這里我們直接下載Kafka Tool 2.0.8的版本。如下圖7.9所示:

圖7.9 下載Kafka Tool
下載完成后,直接安裝啟動即可。圖7.10展示了啟動的初始界面。

圖7.10 Kafka Tool的啟動界面
添加一個Kafka Cluster集群,并測試。如圖7.11所示:

圖7.11 添加Kafka集群
點擊“是”,進入Kafka集群的首界面。如圖7.12所示:

圖7.12 Kafka集群的首界面
在這里可以看到Kafka集群中的Broker信息、Topics的信息以及Consumers消費者的信息。
現(xiàn)在我們使用Kafka Tool來創(chuàng)建一個新的Topic。
(1)選擇“Browsers”中集群的“Topics”節(jié)點,并在右邊的界面上點擊
按鈕,添加一個新的Topic。
(2)輸入Topic的名字、分區(qū)數(shù)、以及每個分區(qū)的副本數(shù)。這里我們新創(chuàng)建的Topic名稱是mytopic2,它由兩個分區(qū)組成,并且每個分區(qū)的副本數(shù)為。如圖7.13所示。

圖7.13 Add Topic
(3)點擊“Add”,將成功創(chuàng)建Topic,如圖7.14所示。

圖7.14 成功創(chuàng)建Topic
(4)現(xiàn)在我們使用Kafka Tool來接收mytopic2上的消息數(shù)據(jù)。選擇剛剛創(chuàng)建好的mytopic2的主題,并在右邊的窗口中選擇“Data”的頁面,如圖7.15所示。

圖7.15 通過Kakfa Tool接收數(shù)據(jù)
(5)啟動一個Kafka Producer的命令行終端,并發(fā)送一些消息。如圖7.16所示:
bin/kafka-console-producer.sh --broker-list kafka101:9092 --topic mytopic2

圖7.16 通過命令行發(fā)送數(shù)據(jù)
(6)在Kafka Tool上,點擊
接收消息。這里就可以看到剛才我們在Kafka Producer命令行上發(fā)送的消息。如圖7.17所示:

圖7.17 在Kafka Tool上接收數(shù)據(jù)
(7)這里的數(shù)據(jù)格式默認(rèn)是“Byte Array”,我們可以在Properties的設(shè)置里面將其修改為String,并點擊“Update”,如圖7.18所示:

圖7.18 修改Topic的數(shù)據(jù)格式
(8)回到Data頁面,這時候數(shù)據(jù)將按照正確的格式顯示,如圖7.19所示:

圖7.19 顯示正確的數(shù)據(jù)
KafkaOffsetMonitor
KafkaOffsetMonitor是一個基于Web界面的管理平臺,可以用來實時監(jiān)控Kafka服務(wù)的Consumer以及它們所在的Partition中的Offset,我們可以瀏覽當(dāng)前的消費者組,并且每個Topic的所有Partition的消費情況都可以進行實時的監(jiān)控。KafkaOffsetMonitor可以從github上下載,地址是:https://github.com/quantifind/KafkaOffsetMonitor 。這里我們使用的是KafkaOffsetMonitor-assembly-0.2.0.jar
KafkaOffsetMonitor的安裝啟動比較簡單。我們可以直接在kafka101的主機上執(zhí)行下面的指令:
java -cp KafkaOffsetMonitor-assembly-0.2.0.jar \
com.quantifind.kafka.offsetapp.OffsetGetterWeb \
--zk kafka101:2181 \
--port 8089 \
--refresh 10.seconds \
--retain 1.days
其中:
lcom.quantifind.kafka.offsetapp.OffsetGetterWeb是運行Web監(jiān)控的類
--zk用于指定ZooKeeper的地址
--port是Web運行端口
--refresh和--retain用于指定頁面數(shù)據(jù)刷新的時間以及保留數(shù)據(jù)的時間值
打開瀏覽器訪問8089端口,就可以打開KafkaOffsetMonitor的首頁面,如圖7.20所示。

圖7.20 KafkaOffsetMonitor首頁
選擇“Topic List”,就可以監(jiān)控某個具體的Topic信息了,如圖7.21所示。

圖7.21 通過KafkaOffsetMonitor監(jiān)控Topic
JConsole
JConsole(Java Monitoring and Management Console),一種基于JMX的可視化監(jiān)視、管理工具,從Java 5開始引入。JConsole是用Java寫的GUI程序,用來監(jiān)控VM,并可監(jiān)控遠(yuǎn)程的VM,非常易用,而且功能非常強。命令行里打 jconsole,就可以直接啟動了。
這里我們方便,我們直接在Window上啟動JConsole。在CMD創(chuàng)建中直接輸入JConsole,如圖7.22所示。

圖7.22 啟動JConsole
JConsole的啟動界面如圖7.23所示。

圖7.23 JConsole的啟動界面
由于在前面配置Kafka Manager的時候,我們已經(jīng)啟用了broker 0和broker 1的JMX配置,所以這里可以直接通過JConsole連接到broker 0或者broker 1上。我們以broker 0 為例。選擇“遠(yuǎn)程進程”,并輸入broker 0的JMX地址,點擊“連接”,如圖7.24所示。
kafka101:9990

圖7.24 通過JConsole連接broker 0
選擇“不安全的連接”,進入JConsole監(jiān)控的主界面,如圖7.25和圖7.26所示。

圖7.25 不安全的連接

圖7.26 JConsole的主頁面
JConsole提供六個選項卡顯示應(yīng)用信息:
(1)概覽選項卡:提供內(nèi)存使用的概述、運行的線程數(shù)量、創(chuàng)建的對象數(shù)量以及CPU使用情況。
(2)內(nèi)存選項卡:顯示使用的內(nèi)存數(shù)量??梢赃x擇要監(jiān)視的內(nèi)存類型(堆、非堆或池)組合。
(3)線程選項卡:顯示線程數(shù)量和每個線程的詳細(xì)信息。
(4)類選項卡:顯示加載的對象數(shù)量的信息。
(5)VM 概要選項卡:提供運行應(yīng)用的JVM概要。
(6)MBean選項卡:顯示有關(guān)應(yīng)用的托管bean的信息。
這里我們選擇“MBean選項卡”,就可以看到Kakfa相關(guān)的MBean信息,如圖7.27所示。

圖7.27 通過JConsole監(jiān)控Kafka
以上圖監(jiān)控的參數(shù)“MessagesInPerSec”為例,它表示的是Kafka集群消息的速率。關(guān)于所有的Kafka監(jiān)控的MBean信息,可以參考官方網(wǎng)站上的說明,地址是:http://kafka.apache.org/documentation/#monitoring
監(jiān)控ZooKeeper
前面提到,整個Kafka的狀態(tài)靠Zookeeper來維護,對于Zookeeper性能的監(jiān)控也成為了整個Kafka監(jiān)控計劃中一個必不可少的組成部分。在典型的Kafka集群中, Kafka通過Zookeeper管理集群配置,例如:選舉Leader,以及在Consumer Group發(fā)生變化時進行Rebalance;生產(chǎn)者Producer將消息發(fā)布到broker,Consumer從broker訂閱并消費消息。這些操作都離不開ZooKeeper。所以在Kafka集群的管理監(jiān)控中,ZooKeeper的監(jiān)控也就成為了非常重要的一部分。
由于ZooKeeper本身也是由Java開發(fā)的應(yīng)用程序,我們當(dāng)然也可以前面提到的JMX的方式進行監(jiān)控,例如使用JConsole。圖7.28展示了通過JConsole監(jiān)控ZooKeeper MBean的監(jiān)控信息。

圖7.28 通過JConsole監(jiān)控ZooKeeper
這里我們也可以使用另一個客戶端工具ZooInspector監(jiān)控ZooKeeper。圖7.29展示了它的主界面。

圖7.29 通過ZooInspector監(jiān)控ZooKeeper
