kafka-manager介紹
kafka-manager是目前最受歡迎的kafka集群管理工具,最早由雅虎開源,用戶可以在Web界面執行一些簡單的集群管理操作。
之前叫kafka-manager,現在改名叫CMAK(Cluster Manager for Apache Kafka)了。
具體支持以下內容:
- 管理多個集群
- 輕松檢查群集狀態(主題,消費者,偏移,代理,副本分發,分區分發)
- 運行首選副本選舉
- 使用選項生成分區分配以選擇要使用的代理
- 運行分區重新分配(基于生成的分配)
- 使用可選主題配置創建主題(0.8.1.1具有與0.8.2+不同的配置)
- 刪除主題(僅支持0.8.2+并記住在代理配??置中設置delete.topic.enable = true)
- 主題列表現在指示標記為刪除的主題(僅支持0.8.2+)
- 批量生成多個主題的分區分配,并可選擇要使用的代理
- 批量運行重新分配多個主題的分區
- 將分區添加到現有主題
- 更新現有主題的配置
kafka-manager安裝
kafka-manager 3.0.0.2 以下版本官方只支持源碼編譯安裝。
kafka-manager 3.0.0.2 及以上版本官方提供給了編譯包,但要求環境為 jdk11及以上。
本文將以 3.0.0.2 以下的最高版本 3.0.0.1 介紹編譯安裝方式,3.0.0.2 及以上使用編譯包直接部署即可。
組件安裝操作步驟參考 組件安裝部署手冊模板,根據不同組件的安裝目標,部分操作可以省略。
本文將按照該參考步驟執行。
一、獲取組件可執行程序庫,包括主程序,此為組件的基本文件
1.官網下載 kafka-manager源碼
創建目錄 /usr/local/kafka-manager,將源碼包下載到該目錄下,支持wget獲取。
特別關注:官方release分支只有3.0.0.2及以上版本,所以需要在 tag 分支下載。

2.安裝依賴組件
kafka-manager依賴sbt編譯,需要先安裝sbt。
其中,kafka-manager源碼路徑中,已經集成了sbt程序,所以無需單獨安裝。
如果確實需要安裝特定版本sbt,則可以參考 sbt組件安裝(CentOS7)
3.sbt編譯
特別關注:sbt編譯過程中需要下載很多依賴包,官方倉庫下載效率很低,建議修改sbt倉庫地址
3.1 修改倉庫地址,以阿里云倉庫為例
[root@localhost kafka-manager]# vim ~/.sbt/repositories #內容如下 [repositories] #local public: http://maven.aliyun.com/nexus/content/groups/public/ typesafe:http://dl.bintray.com/typesafe/ivy-releases/ , [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly ivy-sbt-plugin:http://dl.bintray.com/sbt/sbt-plugin-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] sonatype-oss-releases sonatype-oss-snapshots
3.2 編譯
[root@localhost kafka-manager]# tar -zxvf CMAK-3.0.0.1.tar.gz [root@localhost kafka-manager]# cd CMAK-3.0.0.1/ [root@localhost CMAK-3.0.0.1]# ll 總用量 56 drwxrwxr-x 9 root root 109 2月 20 2020 app -rw-rw-r-- 1 root root 4373 2月 20 2020 build.sbt drwxrwxr-x 2 root root 108 2月 20 2020 conf drwxrwxr-x 2 root root 156 2月 20 2020 img -rw-rw-r-- 1 root root 11307 2月 20 2020 LICENSE drwxrwxr-x 2 root root 49 2月 20 2020 project drwxrwxr-x 5 root root 54 2月 20 2020 public -rw-rw-r-- 1 root root 9572 2月 20 2020 README.md -rwxrwxr-x 1 root root 20971 2月 20 2020 sbt drwxrwxr-x 4 root root 37 2月 20 2020 src drwxrwxr-x 5 root root 51 2月 20 2020 test #自帶sbt環境 [root@localhost CMAK-3.0.0.1]# ./sbt clean dist #獨立安裝sbt環境 [root@localhost CMAK-3.0.0.1]# sbt clean dist
編譯過程很長,因為要下載很多依賴包,成功后會在 target/universal/ 目錄下生成一個可用于部署的 zip文件,解壓到指定目錄即可,如 /usr/local/kafka-manager/3.0.0.1。
特別關注:由于sbt編譯過程非常耗時,建議大家下載編譯好的安裝包來運行
- 官方安裝包,3.0.0.2及以上版本,需要jdk11支持
- 網絡資源,即網友編譯好的安裝包,請自行查找,附較低版本 2.0.0.2:鏈接:https://pan.baidu.com/s/1fiQvM1rbt5cwtEtl45vwMA 提取碼:hh4w
特別關注:經驗證,2022年開始,國內sbt環境編譯成功率幾乎為0,強烈建議下載編譯好的安裝包,否則浪費太多時間和精力。
二、安裝系統服務
kafka-manager默認沒有安裝系統服務,通過主程序運行。
三、主程序加入到環境變量
根據實際需要評估是否需要加入環境變量
[root@localhost ~]# vim /etc/profile #kafka-manager env export KAFKA_MANAGER_HOME=/usr/local/kafka-manager/3.0.0.1 export PATH=$PATH:$KAFKA_MANAGER_HOME/bin [root@localhost ~]# source /etc/profile
四、配置文件
配置kafka-manager連接的zk集群地址
[root@localhost 3.0.0.1]# vim conf/application.conf 修改內容如下,注釋其他zk配置項,如kafka-manager.zkhosts cmak.zkhosts="192.168.11.63:8181,192.168.11.66:8181,192.168.11.72:8181"
五、運行用戶
默認使用root運行即可。
六、開機啟動
請參考教程 Linux開機啟動方案
七、服務啟動運行
以主程序運行為例(已經將主目錄添加環境變量)
1.啟動
kafka-manager默認使用9000端口,可以使用-Dhttp.port指定端口
[root@localhost 3.0.0.1]# nohup bin/cmak -Dconfig.file=conf/application.conf -Dhttp.port=9002 >/dev/null 2>&1 &
2.驗證
訪問本機9002端口

3.kafka-manager詳細使用,請參考教程 詳細解析 kafka manager 的使用
4.停止kafka-manager
停止kafka-manager可以使用停止進程的方式 kill -9 pid,但是停止進程后,需要刪除安裝目錄下的 RUNNING_PID 文件,其中記錄著上次運行的進程號,如果不刪除,下次啟動時會首先檢測是否存在 RUNNING_PID 文件,存在則繼續提示啟動異常
#定位進程,可以通過進程名稱,也可以通過監聽端口號 [root@localhost cmak-3.0.0.1]# ps -ef | grep kafka-manager [root@localhost cmak-3.0.0.1]# ps -ef | grep cmak [root@localhost cmak-3.0.0.1]# netstat -lntup | grep 9002 tcp6 0 0 :::9002 :::* LISTEN 3051/java #停止進程 [root@localhost cmak-3.0.0.1]# kill -9 3051 #刪除PID文件 [root@localhost cmak-3.0.0.1]# rm -f RUNNING_PID
特別關注:關于kafka 與 kafka-manager
kafka-manager監控問題
如果kafka部署的是集群(多于一臺),則可能會遇到kafka-manager監控kafka broker數據異常問題,比如只有一臺broker顯示有數據,其他broker無數據,如下

正常情況下應該是如下效果

問題分析
kafka-manager監控流程
kafka-manager通過jmx + rmi技術實現kafka監控,大致流程如下

根據以上流程,第4步操作可能會有如下問題
- kafka broker默認通過localhost解析 rmi ip 地址,所以會返回127.0.0.1,所以如果kafka broker與kafka-manager不在同一臺服務器上,則無法連接
- kafka broker默認返回隨機 rmi 端口,如果需要配置防火墻,則無法預測隨機端口范圍
所以,解決以上問題,就需要實現kafka broker返回指定的rmi ip與端口。
解決方案方案探討
嘗試一
首先,可能大家會想到通過修改服務器 /etc/hosts文件,將127.0.0.1改為本機ip地址,這樣在broker解析localhost時,將返回實際ip地址。此方案確實可以解決rmi ip的問題,同時配合關閉防火墻,經驗證可以實現kafka-manager正常監控kafka。只是需要考慮以下注意事項
- 將本機localhost解析改為實際ip地址,需要評估同服務器上其他應用服務或組件是否受影響,有些服務可能需要使用127.0.0.1
- hosts無法解決rmi端口隨機的問題,如果運維環境要求開啟防火墻,將無法滿足要求
嘗試二
接下來我們從kafka自身運行原理分析解決方案。
kafka啟動過程中,通過 kafka-server-start.sh 調用 kafka-run-class.sh。
1.分析kafka啟動腳本 kafka-server-start.sh
可以在此處設置相關參數的值,并在啟動 kafka-run-class.sh 時傳入
...省略其他配置... if [ "x$KAFKA_LOG4J_OPTS" = "x" ]; then export KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:$base_dir/../config/log4j.properties" fi if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G" fi ...省略其他配置... exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"
2.分析kafka啟動腳本kafka-run-class.sh
kafka在 kafka-run-class.sh 中設置了 $JMX_PORT 參數,允許在kafka啟動前配置,最后在啟動kafka程序時,將拼接好的參數作為java啟動參數傳入。
其中,參數可以通過多種途徑配置,如下
- 環境變量 /etc/profile
- kafka啟動腳本 kafka-server-start.sh內部
- kafka啟動時動態指定 JMX_PORT=9999 bin/kafka-server-start.sh -daemon config/server.properties
...省略其他配置... # JMX settings if [ -z "$KAFKA_JMX_OPTS" ]; then KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false " fi # JMX port to use if [ $JMX_PORT ]; then KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT " fi ...省略其他配置... # Launch mode if [ "x$DAEMON_MODE" = "xtrue" ]; then nohup "$JAVA" $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_JMX_OPTS $KAFKA_LOG4J_OPTS -cp "$CLASSPATH" $KAFKA_OPTS "$@" > "$CONSOLE_OUTPUT_FILE" 2>&1 < /dev/null & else exec "$JAVA" $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_JMX_OPTS $KAFKA_LOG4J_OPTS -cp "$CLASSPATH" $KAFKA_OPTS "$@" fi
3.kafka-run-class.sh并未設置關于 rmi 的相關參數
解決方案總結
總結以上分析,考慮到jmx端口、rmi ip、rmi 端口需要同時支持配置,推薦使用kafka啟動腳本調整的方案。
具體方案參考如下
方案一:調整kafka-run-class.sh
1.在kafka-run-class.sh中增加rmi參數,如下
...省略其他配置... # JMX settings if [ -z "$KAFKA_JMX_OPTS" ]; then KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false " fi # JMX port to use if [ $JMX_PORT ]; then KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT " fi # RMI host to use # RMI與JMX原則上屬于不同技術,應該重新設計參數變量,如KAFKA_RMI_OPTS,此處共用KAFKA_JMX_OPTS,避免修改最終Java執行參數 if [ $RMI_HOST ]; then KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Djava.rmi.server.hostname=$RMI_HOST " fi # RMI port to use # RMI與JMX原則上屬于不同技術,應該重新設計參數變量,如KAFKA_RMI_OPTS,此處共用KAFKA_JMX_OPTS,避免修改最終Java執行參數 if [ $RMI_PORT ]; then KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.rmi.port=$RMI_PORT " fi ...省略其他配置...
2.參數可以通過多種途徑配置,如下
- 環境變量 /etc/profile
- kafka啟動腳本 kafka-server-start.sh內部
- kafka啟動時動態指定
方案二:不調整kafka-run-class.sh
1.保持kafka-server-start.sh與kafka-run-class.sh默認
2.通過多種途徑配置完整的KAFKA_JMX_OPTS,如下
- 環境變量 /etc/profile
- kafka啟動腳本 kafka-server-start.sh內部
- kafka啟動時動態指定
其中,KAFKA_JMX_OPTS完整參數集合為
export KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9999 -Djava.rmi.server.hostname=192.168.11.72 -Dcom.sun.management.jmxremote.rmi.port=9998"
特別關注:需要根據實際運維環境確認選擇何種方案,沒有最好的方案,只有最合適的方案。
特別關注:
如果沒有配置 -Dcom.sun.management.jmxremote.authenticate=false,則啟動kafka時會提示jmx權限問題,啟動失敗
錯誤: 找不到口令文件: /usr/local/jdk_8/jdk1.8.0_201/jre/lib/management/jmxremote.password
特別關注:
如果使用環境變量(/etc/profile)全局配置方案,會影響控制臺生產者(kafka-console-producer.sh)、消費者(kafka-console-consumer.sh)工具的使用,因為在這2個工具的啟動腳本中,也會調用 kafka-run-class.sh ,即也會使用全局配置,監聽JMX端口、RMI端口,然后報【端口已占用】異常。
以控制臺消費者腳本為例,如下
[root@localhost bin]# cat kafka-console-consumer.sh #!/bin/bash if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then export KAFKA_HEAP_OPTS="-Xmx512M" fi exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleConsumer "$@"
浙公網安備 33010602011771號