CMAK(Kafka Manager)安裝

CMAK 是管理Kafka集群的常用工具,之前的名字叫Kafka Manager。CMAK功能很強大,它可以管理多個Kafka集群,查看集群內部狀態,如:topic、broker、consumer、partition,也可用於創建topic,遷移分區等。筆者在安裝CMAK過程中遇到並解決了一些問題,現記錄下來分享給大家。

1. 編譯

Linux伺服器編譯

CMAK沒有提供編譯好的安裝包,因此需要下載源碼後編譯出安裝包。下載最新的CMAK源碼並解壓。

wget //github.com/yahoo/CMAK/archive/refs/tags/3.0.0.5.zip
unzip CMAK-3.0.0.5.zip

筆者首先嘗試在Linux伺服器上編譯,CMAK依賴的JDK版本為Java 11+ ,因此需要先下載JDK。筆者從Oracle官網下載了JDK11(需要先註冊帳號,登錄後才能下載),具體版本為:jdk-11.0.13_linux-x64_bin.tar.gz

編譯時需要添加java環境變數,並設置JAVA_HOME路徑,參考官網提供的命令編譯CMAK(JAVA的路徑需要修改)。

cd CMAK-3.0.0.5
PATH=/usr/lib/jvm/zulu-11-amd64/bin:$PATH \
  JAVA_HOME=/usr/lib/jvm/zulu-11-amd64 \
  ./sbt -java-home /usr/lib/jvm/zulu-11-amd64 clean dist

執行上面命令後,發現最終編譯失敗,報錯資訊如下:

Cannot use JVMCI compiler: No JVMCI compiler found

Mac本地編譯

查閱了相關資料,發現了在Mac上編譯成功的例子(Problem in installing CMAK in Macos #849 )。因此筆者嘗試在Mac上編譯源碼。

首先從CMAK Github官網下載最新版源碼的壓縮包並解壓,具體版本為:CMAK-3.0.0.5.zip, 在從Oracle官網下載JDK11並解壓,具體版本為:jdk-11.0.13_osx-x64_bin.tar.gz.

安裝sbt

brew install sbt

進入到CMAK目錄,執行編譯命令,注意需要運行sbt clean dist,而不是./sbt clean dist,另外JDK目錄修改成實際地址。

cd CMAK-3.0.0.5

PATH=jdk-11.0.13.jdk/Contents/Home/bin:$PATH \
  JAVA_HOME=jdk-11.0.13.jdk/Contents/Home \
  sbt  -java-home jdk-11.0.13.jdk/Contents/Home clean dist

最後發現編譯成功了,包位置:target/universal/cmak-3.0.0.5.zip

將編譯完成後的cmak包上傳到Linux伺服器,並解壓。

unzip cmak-3.0.0.5.zip

2. 配置

CMAK核心配置文件位置: conf/application.conf

最少配置

CMAK的最少配置是只需配置zk參數cmak.zkhosts,注意zk配置不能包含後綴。正確的配置示例:

cmak.zkhosts="my.zookeeper.host.com:2181,other.zookeeper.host.com:2181"

若zk配置包含後綴,如:cmak.zkhosts="my.zookeeper.host.com:2181/cmak"。那麼啟動cmak後會報錯,報錯資訊如下:

2022-03-10 17:19:52,585 - [ERROR] - from akka.actor.OneForOneStrategy in kafka-manager-system-akka.actor.default-dispatcher-3
requirement failed: Kafka manager base path not found : /kafka-manager
akka.actor.ActorInitializationException: akka://kafka-manager-system/user/kafka-manager: exception during creation
        at akka.actor.ActorInitializationException$.apply(Actor.scala:193)
        at akka.actor.ActorCell.create(ActorCell.scala:669)
        at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:523)
        at akka.actor.ActorCell.systemInvoke(ActorCell.scala:545)
        at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:283)
        ... 9 common frames omitted
Caused by: java.lang.IllegalArgumentException: requirement failed: Kafka manager base path not found : /kafka-manager
        at scala.Predef$.require(Predef.scala:281)
        at kafka.manager.actor.KafkaManagerActor.<init>(KafkaManagerActor.scala:77)
        ... 18 common frames omitted

報錯資訊顯示沒有找到CMAK的基路徑/kafka-manager,可見CMAK需要在zk元數據中自動生成/kafka-manager路徑,不能人為指定CMAK在zk中的路徑。

許可權認證

CMAK支援兩種許可權認證方式,一種是設置用戶名和密碼方式,需要設置參數basicAuthentication.enabled為true,詳細配置如下:

basicAuthentication.enabled=true

basicAuthentication.username="admin"
basicAuthentication.password="password"

另外一種是LDAP方式,需要把參數basicAuthentication.enabledbasicAuthentication.ldap.enabled均設為true,在配置LDAP的相關參數。

basicAuthentication.enabled=true
basicAuthentication.ldap.enabled=true

basicAuthentication.ldap.server=${?KAFKA_MANAGER_LDAP_SERVER}
basicAuthentication.ldap.port=389
basicAuthentication.ldap.username=${?KAFKA_MANAGER_LDAP_USERNAME}
basicAuthentication.ldap.password=${?KAFKA_MANAGER_LDAP_PASSWORD}
basicAuthentication.ldap.search-base-dn=${?KAFKA_MANAGER_LDAP_SEARCH_BASE_DN}
basicAuthentication.ldap.search-filter=${?KAFKA_MANAGER_LDAP_SEARCH_FILTER}
basicAuthentication.ldap.group-filter=${?KAFKA_MANAGER_LDAP_GROUP_FILTER}

3. 啟動

如果伺服器沒有配置java路徑,或者需要配置不同版本的java,那麼需要添加-java-home 選項。CMAK默認配置路徑為conf/application.conf, 默認埠為9000,可根據情況進行覆寫。應用啟動命令如下:

cd /data0/workspace/cmak-3.0.0.5 && bin/cmak -java-home jdk-11.0.13 -Dconfig.file=conf/application.conf -Dhttp.port=9000 > /dev/null 2>&1 &

服務啟動後,在CMAK UI介面上添加kafka集群,發現無法添加,且出現以下報錯資訊:

Yikes! KeeperErrorCode = Unimplemented for /kafka-manager/mutex

查看CMAK日誌,同樣發現了Unimplemented for /kafka-manager/mutex 報錯日誌。

2022-03-10 17:50:06,159 - [ERROR] - from kafka.manager.KafkaManager in pool-1-thread-1
Failed on input : KMAddCluster(ClusterConfig()
org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for /kafka-manager/mutex
        at org.apache.zookeeper.KeeperException.create(KeeperException.java:106)
        at org.apache.zookeeper.KeeperException.create(KeeperException.java:54)
        at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:1538)
        at org.apache.curator.utils.ZKPaths.mkdirs(ZKPaths.java:291)
        at org.apache.curator.framework.imps.CreateBuilderImpl$11.call(CreateBuilderImpl.java:746)
....
2022-03-10 17:50:06,162 - [ERROR] - from kafka.manager.ApiError$ in pool-1-thread-1
error : KeeperErrorCode = Unimplemented for /kafka-manager/mutex
org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for /kafka-manager/mutex
        at org.apache.zookeeper.KeeperException.create(KeeperException.java:106)
        at org.apache.zookeeper.KeeperException.create(KeeperException.java:54)
        at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:1538)
        at org.apache.curator.utils.ZKPaths.mkdirs(ZKPaths.java:291)
...

通過查閱資料(//github.com/yahoo/CMAK/issues/731#issuecomment-643880544), 發現需要在ZK集群上手動創建mutex目錄,即可在CMAK UI介面添加Kafka集群。

# ./bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 2] ls /kafka-manager
[configs, deleteClusters, clusters]
[zk: localhost:2181(CONNECTED) 3] create /kafka-manager/mutex ""
Created /kafka-manager/mutex
[zk: localhost:2181(CONNECTED) 5] create /kafka-manager/mutex/locks ""
Created /kafka-manager/mutex/locks
[zk: localhost:2181(CONNECTED) 6] create /kafka-manager/mutex/leases ""
Created /kafka-manager/mutex/leases

向zk集群創建目錄/kafka-manager/mutex,/kafka-manager/mutex/locks, /kafka-manager/mutex/leases 後,重啟CMAK,發現可以正常添加kafka集群了。

4. 參考資料

  1. CMAK Github官網

  2. Problem in installing CMAK in Macos #849

  3. Failed to add cluster on 3.0.0.1 #731