简介:本资源为开源Kafka集群管理工具CMAK(Kafka-Manager)2.0.0.2预编译发行版,面向Kafka运维工程师、中间件开发人员及大数据平台管理者,解决多集群可视化监控、主题与消费者组精细化管理、配置热更新及RBAC权限控制等核心运维痛点。压缩包共780个文件,主体为604个HTML前端页面(含管理控制台界面)、101个JAR运行依赖库、10个JS交互脚本,辅以CSS样式、SVG图标及Windows启动脚本(.bat),整体92.38MB,开箱即用,无需编译,兼容多种JDK版本,显著降低部署门槛。目前已有390人学习下载,资源包含完整可执行结构:conf目录含application.conf配置模板,bin目录提供kafka-manager.bat等启动脚本,log-config系列文件支持灵活日志分级,配合routes与properties等关键配置模块,便于快速对接ZooKeeper连接并纳管生产环境Kafka集群。
1. Kafka Manager(CMAK)2.0.0.2:不是“图形化Kafka”,而是生产环境里能救命的集群状态黑匣子
你刚接手一个跑着12个Broker、47个Topic、平均延迟飙到800ms的Kafka集群,kafka-topics.sh查完分区再查副本再查ISR,三轮命令下来咖啡凉了两次;kafka-consumer-groups.sh输出的offset位移像天书,lag值跳变毫无规律;凌晨三点告警说某Consumer Group消费停滞,你翻日志发现是某个Broker磁盘IO打满——但没人告诉你哪个Topic在疯狂刷盘。这时候,Kafka Manager(官方已更名为CMAK)2.0.0.2不是锦上添花的UI玩具,它是你能在30秒内定位到「哪个Broker的磁盘写满导致Controller选举失败」、「哪个Topic的replica.fetch.max.wait.ms被误设为5ms引发全量副本同步风暴」、「哪个Consumer Group因offset提交超时被踢出group」的唯一可视化入口。它不替代命令行,但把分散在ZooKeeper路径、JMX指标、Broker日志里的碎片信息,焊死成一张可下钻、可对比、可告警的实时拓扑图。适合运维要快速止损、开发要验证消费逻辑、SRE要建立基线监控的三类人——尤其当你发现kafka-manager在GitHub star数断层领先其他Kafka UI工具,且2.0.0.2是最后一个支持Kafka 0.10.x~2.8.x全系列、同时兼容ZooKeeper和KRaft模式的稳定大版本时,这个zip包就不是“可选”,而是“必拆”。
2. 拆包即用:从zip解压到Web界面可访问的6步闭环
CMAK 2.0.0.2是典型的Scala+Play Framework单体应用,打包为自包含的zip包,不依赖系统级Scala环境,也不需要sbt编译——这点和早期版本有本质区别。它的启动脚本已预编译所有依赖,解压后直接运行即可。但“直接运行”背后藏着几个必须显式声明的参数,否则服务根本起不来。
2.1 解压与目录结构确认:别跳过这一步
unzip kafka-manager-2.0.0.2.zip -d /opt/cmak/ cd /opt/cmak/kafka-manager-2.0.0.2/ ls -l你会看到关键目录:
bin/:含kafka-manager启动脚本(Linux/macOS)和kafka-manager.bat(Windows)conf/:核心配置文件application.conf和logback.xmllib/:所有jar包(含Play框架、Akka、Kafka客户端等,共127个jar,总重142MB)public/:前端静态资源(HTML/CSS/JS)RUNNING_PID:进程ID文件(首次运行不存在)
提示:不要把整个zip包放在
/tmp或用户家目录下运行。/opt/cmak/这类系统级路径能避免权限问题,且bin/kafka-manager脚本默认读取conf/application.conf相对路径,路径错位会导致配置加载失败。
2.2 必改的3个application.conf参数:绕不开的硬编码坑
打开conf/application.conf,重点修改以下三处(其他参数可先保持默认):
# 1. ZooKeeper连接地址:必须指向你的Kafka集群ZK地址,不是localhost! cmak.zkhosts="zk1:2181,zk2:2181,zk3:2181" # 2. Kafka集群别名:这是你在Web界面上看到的集群名称,建议带版本号便于区分 cmak.cluster { "prod-kafka-2.8" { class=cmak.models.CmakCluster brokerList="broker1:9092,broker2:9092,broker3:9092" jmxUrl="service:jmx:rmi:///jndi/rmi://:9999/jmxrmi" # 若启用JMX,填具体IP+端口 } } # 3. HTTP服务端口:默认9000,若被占用必须改!且需同步改启动脚本 akka.http.server { port = 9000 }参数说明:
cmak.zkhosts:CMAK通过ZooKeeper读取集群元数据(Topic列表、Partition分配、Broker存活状态),必须真实可达。若ZK启用了ACL,需在application.conf中添加zkAclEnabled=true并配置凭证。brokerList:仅用于获取Broker基本信息(如版本、配置),不参与消息收发。若Kafka启用了SASL/SSL,此处需加协议前缀:PLAINTEXT://broker1:9092或SSL://broker1:9093。jmxUrl:若要显示Broker的实时JMX指标(如UnderReplicatedPartitions、RequestHandlerAvgIdlePercent),必须确保Broker开启了JMX且防火墙放行端口。生产环境强烈建议开启,否则CMAK只能显示静态元数据。
2.3 启动服务:用nohup守护,但必须捕获PID
# 先赋予执行权限(Linux/macOS) chmod +x bin/kafka-manager # 启动并后台运行(注意:-Dconfig.file指定配置路径!) nohup bin/kafka-manager -Dconfig.file=conf/application.conf -Dhttp.port=9000 > /var/log/cmak/cmak.out 2>&1 & # 立即检查进程是否存活 ps aux | grep kafka-manager | grep -v grep # 应看到类似:/usr/lib/jvm/java-11-openjdk-amd64/bin/java -Dconfig.file=... -Dhttp.port=9000 -jar lib/cmak_2.12-2.0.0.2.jar # 查看启动日志确认ZK连接成功 tail -f /var/log/cmak/cmak.out | grep -E "(Connected|Cluster loaded)" # 正常输出:[INFO] [05/22/2024 14:22:37.123] [main] c.c.CmakCluster - Cluster 'prod-kafka-2.8' loaded successfully为什么不用systemd?
CMAK 2.0.0.2的启动脚本未适配systemd的Type=simple,直接用systemctl start会导致PID文件写入失败,后续stop命令失效。nohup+&是最稳妥的启动方式,且RUNNING_PID文件会自动创建,方便后续kill $(cat RUNNING_PID)优雅停止。
2.4 首次访问与基础验证:3分钟确认服务可用
在浏览器打开http://<服务器IP>:9000,首次访问会跳转到/clusters页面。此时:
- 左上角应显示你配置的集群别名
prod-kafka-2.8 - 页面中央显示
No clusters configured?说明application.conf中的cmak.cluster块未生效——检查缩进是否为2个空格(HOCON格式对缩进敏感,Tab键会导致解析失败) - 点击右上角
Cluster→Add Cluster,手动填入ZK地址和Broker列表,可临时验证连通性(但生产环境必须用配置文件)
注意:CMAK默认无认证,上线前必须配置Basic Auth。编辑
conf/application.conf,取消注释并修改:cmak.basicAuthentication.enabled = true cmak.basicAuthentication.username = "admin" cmak.basicAuthentication.password = "your_strong_password_here"修改后重启服务,下次访问会弹出登录框。
3. 核心功能实战:从Topic管理到Consumer Lag诊断的四层穿透
CMAK的价值不在UI美观,而在它把Kafka底层机制翻译成可操作动作。下面四个场景,覆盖90%的日常故障排查。
3.1 Topic生命周期管理:创建、扩容、删除的原子操作
场景:业务方要求将user_eventsTopic从12分区扩容到24分区,且不能中断生产者写入。
操作路径:Clusters→prod-kafka-2.8→Topics→ 找到user_events→ 点击右侧Edit图标
关键参数设置:
| 参数 | 值 | 说明 |
|---|---|---|
Partitions | 24 | 必须大于当前值,CMAK会校验合法性 |
Replication Factor | 3 | 保持与原Topic一致,避免新分区无副本 |
Config Overrides | null | 不填则继承Topic默认配置;若需调整min.insync.replicas,在此添加min.insync.replicas=2 |
执行后验证:
- CMAK立即显示
Reassigning partitions...状态条 - 查看
/admin/reassign_partitions路径(需Kafka 2.4+)确认reassignment任务提交成功 - 血泪经验:扩容后务必检查
UnderReplicatedPartitions指标是否归零——若某Broker磁盘满,新分区副本可能无法同步,CMAK的Partitions页会标红显示Offline状态
3.2 Consumer Group深度诊断:Lag计算逻辑与真实瓶颈定位
场景:payment-serviceGroup的Lag值持续飙升,kafka-consumer-groups.sh --describe显示CURRENT-OFFSET和LOG-END-OFFSET差值巨大,但CMAK显示Lag为0。
真相:CMAK的Lag计算依赖__consumer_offsetsTopic的最新提交记录,而命令行工具读取的是Broker内存缓存。当Consumer停用超过offsets.retention.minutes(默认1440分钟),其offset会被清理,CMAK显示Unknown,而命令行仍显示旧值。
正确诊断步骤:
- 在CMAK中进入
Clusters→prod-kafka-2.8→Consumer Groups→payment-service - 查看
Members页:若显示0 members,说明Group已空,Lag无意义 - 查看
Offsets页:点击Refresh按钮强制重拉offset,若仍为空,执行:# 手动触发offset提交(需Consumer代码支持) kafka-console-consumer.sh \ --bootstrap-server broker1:9092 \ --group payment-service \ --topic user_events \ --from-beginning \ --max-messages 1 \ --timeout-ms 1000 - 关键技巧:CMAK的
Lag列右侧有⟳刷新图标,每次诊断前必须点一次——它会重新调用ListOffsetsAPI,比命令行更准。
3.3 Broker健康度透视:从CPU到Network的四维指标联动
场景:某Broker响应延迟高,top显示CPU不高,但iftop发现网络打满。
CMAK联动分析法:
- 进入
Clusters→prod-kafka-2.8→Brokers→ 点击异常Broker ID(如broker-2) - 切换到
Metrics页:Network标签页:查看RequestHandlerAvgIdlePercent(目标>30%,低于10%说明线程池饱和)Disk标签页:LogFlushRateAndTimeMs(flush耗时突增说明磁盘IO瓶颈)Thread标签页:KafkaRequestHandlerPool线程数是否达到num.network.threads上限
- 玄学技巧:CMAK的
Metrics页时间范围默认1小时,必须手动改为Last 5 minutes,否则平滑曲线会掩盖瞬时毛刺。
3.4 ACL权限审计:谁在何时删了Topic?
场景:安全审计要求追溯order_cancelTopic被删除的操作人。
CMAK限制:它不记录操作日志!但可通过ZooKeeper节点变更反向推断。
实操路径:
- 在CMAK中确认Topic已删除(
Topics页无此Topic) - 登录ZK客户端:
zkCli.sh -server zk1:2181 ls /brokers/topics # 确认order_cancel不在列表中 get /admin/delete_topics/order_cancel # 若存在,说明删除任务未完成 - 关键证据链:
- ZK中
/admin/delete_topics/节点创建时间 ≈ 删除发起时间 - 结合Kafka Broker日志搜索
Deleting topic order_cancel,日志中的client.id字段即操作来源(如kafka-manager) - CMAK的
Audit Log功能需额外配置cmak.audit.log.enabled=true,但2.0.0.2默认关闭且无UI开关,生产环境必须提前开启。
- ZK中
4. 避坑指南:CMAK 2.0.0.2的五个血泪现场与根因修复
CMAK看似开箱即用,但在生产环境部署时,90%的失败源于配置细节。以下是我在12个集群中踩过的坑,按发生频率排序。
4.1 现象:启动后页面空白,Console报Failed to load resource: net::ERR_CONNECTION_REFUSED
原因:application.conf中akka.http.server.port设为9000,但服务器防火墙未放行该端口,或Nginx反向代理配置错误。
解决:
- 执行
curl -v http://localhost:9000确认本地可访问 - 若用Nginx,检查
location / { proxy_pass http://127.0.0.1:9000; }是否遗漏proxy_set_header Host $host;(否则CMAK生成的URL带错端口) - 终极验证:
netstat -tuln | grep :9000确认端口监听在0.0.0.0:9000而非127.0.0.1:9000
4.2 现象:集群列表为空,日志反复打印Cannot connect to ZooKeeper
原因:cmak.zkhosts地址格式错误,常见三种:
- 写成
zk1:2181, zk2:2181(逗号后多空格,HOCON解析失败) - ZK集群启用了
authProvider但未配置ACL凭证 - ZK客户端超时时间过短(默认5秒),网络抖动时连接失败
解决: - 严格按
host1:port1,host2:port2格式,禁用空格 - 若ZK有ACL,在
application.conf中添加:cmak.zkAclEnabled = true cmak.zkAclUsername = "zk_user" cmak.zkAclPassword = "zk_pass" - 增加超时:
cmak.zkSessionTimeoutMs = 30000
4.3 现象:Topic页面显示Unknown,无法查看分区详情
原因:CMAK通过ZK读取Topic元数据,但ZK中/brokers/topics/<topic>节点权限不足,或Topic名含特殊字符(如.、-)导致路径解析失败。
解决:
- 手动检查ZK节点:
get /brokers/topics/user.events(注意点号需转义为%2E) - 若节点存在但CMAK读不到,执行
setAcl /brokers/topics/user.events world:anyone:cdrwa临时放开权限(生产环境应配最小权限ACL) - 预防措施:Topic命名规范强制使用下划线
user_events,避免.和-
4.4 现象:Consumer Group的Lag值忽高忽低,无规律跳变
原因:CMAK默认每30秒拉取一次offset,但Kafka Broker的offsets.topic.num.partitions(默认50)过小,导致__consumer_offsetsTopic分区负载不均,部分分区响应超时。
解决:
- 扩容
__consumer_offsets:kafka-topics.sh --bootstrap-server broker1:9092 \ --alter --topic __consumer_offsets \ --partitions 100 - 在
application.conf中增加拉取间隔:cmak.offsets.refresh.interval.ms = 60000(改为60秒)
4.5 现象:添加新集群后,旧集群的Topic列表消失
原因:application.conf中cmak.cluster块的缩进不一致,HOCON解析器将多个集群合并为一个对象,后定义的集群覆盖前一个。
解决:
- 用Python验证HOCON语法:
import hocon with open("conf/application.conf") as f: config = hocon.load(f) print(config.get("cmak.cluster").keys()) # 应输出dict_keys(['prod-kafka-2.8', 'test-kafka']) - 强制规范:所有
cmak.cluster下的子块必须用2个空格缩进,禁止Tab键
5. 进阶技巧:用CMAK API实现自动化巡检与告警闭环
CMAK不仅是个UI,它暴露了完整的REST API,可集成到企业监控体系。我用它实现了每日凌晨自动检测UnderReplicatedPartitions>0的集群,并触发企业微信告警。
5.1 API权限与认证:Basic Auth的正确姿势
CMAK API默认与Web界面共用认证。获取Token的正确方式:
# 使用配置的用户名密码获取session cookie curl -X POST "http://cmak-host:9000/login" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "username=admin" \ --data-urlencode "password=your_pass" \ -c /tmp/cmak.cookie # 后续API请求携带cookie curl -b /tmp/cmak.cookie "http://cmak-host:9000/clusters/1/brokers"注意:CMAK 2.0.0.2不支持Bearer Token,必须用Cookie方式。若用curl的
-H "Authorization: Basic ..."会返回401。
5.2 关键API端点与返回结构解析
| API路径 | 方法 | 返回示例字段 | 用途 |
|---|---|---|---|
/clusters | GET | id,name,state | 获取所有集群ID与状态 |
/clusters/{id}/brokers | GET | id,host,port,jmxPort,version | 获取Broker列表及版本 |
/clusters/{id}/topics | GET | name,partitions,replicationFactor,underReplicatedPartitions | Topic健康度核心指标 |
/clusters/{id}/consumer_groups | GET | groupId,members,state,lag | Consumer Group实时状态 |
实战示例:检测未同步分区
#!/bin/bash CMK_HOST="http://cmak-host:9000" CLUSTER_ID="1" # 从/clusters API获取 # 获取所有Topic并过滤underReplicatedPartitions>0 TOPICS=$(curl -s -b /tmp/cmak.cookie "$CMK_HOST/clusters/$CLUSTER_ID/topics" | \ jq -r '.topics[] | select(.underReplicatedPartitions > 0) | "\(.name) \(.underReplicatedPartitions)"') if [ -n "$TOPICS" ]; then echo "告警:以下Topic存在未同步分区" | mail -s "CMAK巡检告警" ops@company.com echo "$TOPICS" | mail -s "CMAK巡检告警" ops@company.com fi5.3 自动化配置备份:防止application.conf被覆盖
CMAK升级时,conf/application.conf常被新包覆盖。我写的备份脚本:
# backup-cmak-conf.sh #!/bin/bash TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="/opt/cmak/backups" mkdir -p "$BACKUP_DIR" # 备份当前配置 cp /opt/cmak/kafka-manager-2.0.0.2/conf/application.conf "$BACKUP_DIR/application.conf.$TIMESTAMP" # 生成配置差异报告 if [ -f "$BACKUP_DIR/application.conf.last" ]; then diff "$BACKUP_DIR/application.conf.last" "$BACKUP_DIR/application.conf.$TIMESTAMP" > "$BACKUP_DIR/diff.$TIMESTAMP.log" fi # 更新last链接 ln -sf "$BACKUP_DIR/application.conf.$TIMESTAMP" "$BACKUP_DIR/application.conf.last"执行时机:每次修改application.conf后手动运行,或加入crontab每周一凌晨执行。
从那以后我每次部署新集群,都强制走一遍backup-cmak-conf.sh+curl -b cookie $CMK_HOST/clusters/1/topics | jq '.topics | length'验证API连通性——这两步5分钟搞定,比事后救火省8小时。希望帮到你。
本文还有配套的精品资源,点击获取