☰
Kafka Manager 1.3.3.22部署与运维实战:从UI纳管到API巡检
2026/10/20 14:05:56 网站建设 项目流程

简介:Kafka-Manager-1.3.3.22 编译版压缩包面向大数据平台运维与开发人员,用于解决 Kafka 集群在管理、监控与运维层面的可视化需求。包内为已编译好的可直接运行程序,约 75.91MB,解压后即可配合 Zookeeper 接入现有 Kafka 集群,省去源码编译和依赖装配环节。资源描述中明确了修改 application.conf 中 kafka-manager.zkhosts 为实际 Zookeeper 地址、通过 nohup 方式指定端口启动并生成 start.log 的操作路径,可帮助读者快速掌握基于 Hadoop 分布式环境的 KafkaManager 部署要点,也可作为 CM 或 Ambari 之外轻量级 Kafka UI 管理方案。目前已有 962 人浏览学习,适合刚接触 Kafka 集群监控或需要在多节点环境下统一管理 Broker 主题、分区与消费组的中级运维人员。

1. Kafka Manager 1.3.3.22 是什么:没有官方 Web 控制台时的最后一根稻草

Kafka 集群默认不带可视化界面,排查 Topic 分区情况、看 Consumer 消费到哪、确认 Broker 是否存活,单靠命令行也能做,但效率太低,尤其是集群规模上来之后。Kafka Manager 1.3.3.22 是社区里流传最广、被生产环境验证得最多的一个发行版本,基于 Play Framework 构建,把 Kafka 集群的元数据、Topic、Consumer Group、Broker 状态全部映射到网页上,日常运维十有八九靠它。它解决的不是 Kafka 本身的问题,而是“人在界面上快速定位问题”的问题。适合刚接手 Kafka 集群、还没搭好完整监控平台的人,也适合想把集群管理操作集中到一个入口的老手。本文按部署、纳管集群、盯消费、踩坑、API 巡检这条线,把这个工具完整拆一遍。

2. 部署 Kafka Manager 1.3.3.22:JDK 8、配置文件和启动链路

2.1 为什么 1.3.3.22 至今仍是默认选择

Kafka Manager 的后续版本在功能迭代上走得激进,但很多团队在生产环境里仍然锁死 1.3.3.22,原因有两个。第一,1.3.3.x 是最后一个广泛使用的稳定分支,1.3.3.22 补上了不少安全性修复,社区里大量运维笔记都是基于这个版本写的,遇到问题容易找到参考。第二,它的界面逻辑足够清晰,创建 Topic、分区重平衡、查看消费滞后这些高频操作都在两级页面内完成,没有多余的学习成本。

需要特别注意的是运行环境。1.3.3.22 基于旧版 Play Framework 构建,要求 JDK 8 运行。用 JDK 11 或 17 直接启动,大概率会遇到类加载或者反射调用方面的兼容性报错,所以第一步就是确认服务器上有 JDK 8。安装路径不用纠结,关键是JAVA_HOME要指向 JDK 8。

2.2 下载解压与目录结构

拿到kafka-manager-1.3.3.22.zip之后,解压到部署目录即可,不需要编译,也不需要额外安装依赖,这一点比很多管理工具省心。

# 解压到 /opt 下,保持目录名便于辨识 unzip kafka-manager-1.3.3.22.zip -d /opt cd /opt/kafka-manager-1.3.3.22 # 确认关键目录是否存在 ls -l

解压之后重点关注两个目录:bin/存放启动脚本,conf/存放application.conf配置文件。lib/下面全是依赖 jar,一般不用动。这个工具本质上是独立 Web 服务,自带嵌入式 HTTP 服务,默认监听 9000 端口,不需要放到 Tomcat 里。

2.3 修改配置:ZooKeeper 地址、密钥和应用参数

Kafka Manager 通过 ZooKeeper 来发现集群的 Broker 列表和元数据,所以配置文件里最核心的一项就是kafka-manager.zkhosts。如果是单节点 ZooKeeper,填localhost:2181即可;如果是集群,用逗号分隔多个地址。另外必须改掉默认的application.secret,否则每次启动都会有安全提醒,某些环境甚至会拒绝启动。

# 编辑 conf/application.conf,定位到以下配置项 kafka-manager.zkhosts="zk1:2181,zk2:2181,zk3:2181" # application.secret 至少 32 位,随便生成一串随机字符 application.secret="$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 64 | head -n 1)"

参数说明:kafka-manager.zkhosts负责确定连接哪个 ZooKeeper,如果 Kafka 集群使用了chroot,例如/kafka/prod,需要把地址写成zk1:2181/kafka/prod,否则后端会去 ZooKeeper 根节点找 Kafka 元数据,结果就是集群列表为空。application.secret是 Play Framework 的会话加密密钥,不设置或使用默认值会让 Cookie 安全性缺失,同时控制台会持续输出警告日志。

如果生产环境有多个人要用这个页面,建议同时开启内置认证。在配置文件里搜索basicAuthentication,把它设置为true,然后配置用户名密码。这个功能是纯前端登录拦截,不依赖 Kafka 的 ACL,适合做简单的访问控制。

2.4 启动、验证端口与初次访问

启动命令需要手动指定配置文件路径,并显式声明 HTTP 端口。我一般习惯加上 IPv4 优先参数,避免个别服务器上 IPv6 解析导致的连接超时问题。

# 前台启动,方便观察日志;确认无误后用 nohup 或 systemd 托管 cd /opt/kafka-manager-1.3.3.22 bin/kafka-manager -Dconfig.file=conf/application.conf -Dhttp.port=9000 -Djava.net.preferIPv4Stack=true

启动成功后,Kafka Manager 会监听 9000 端口,但此时还是空壳,页面上没有任何集群。用curl验证服务是否正常响应:

curl -s http://localhost:9000/api/clusters | head -c 500

返回一个 JSON 数组(可能为空),说明服务已经起来了。接下来打开浏览器访问http://服务器IP:9000,进入首页后就可以开始配置集群。第一次启动日志里如果出现大量 WARN,多半是application.secret未改或者 ZooKeeper 连接串有误,优先检查这两处。

提示:不要在生产服务器上用-Dhttp.port=80映射到低端口,非 root 用户起不来,而且直接暴露 9000 端口到公网风险极大,建议挂在 Nginx 后面做访问控制。

3. 把 Kafka 集群纳管进 Kafka Manager:集群参数与 Topic 操作实战

3.1 新建集群:版本选择、JMX 端口与安全设置

进入首页后点击Cluster -> Add Cluster,这一步决定后续所有操作是否顺畅。表单里的每一项都有坑,逐个说清楚。

表单项推荐值 / 说明常见坑
Cluster Name写成业务可识别的名字,例如># 在 kafka-server-start.sh 之前设置 JMX 参数 export JMX_PORT=9999 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" bin/kafka-server-start.sh config/server.properties &

参数说明:JMX_PORT是 Kafka 脚本约定的快捷环境变量,脚本内部会把它合并进 JMX 远程监听参数;KAFKA_JMX_OPTS里显式声明了port=9999,两者保持一致才能稳定监听。authenticate=false表示不开启 JMX 认证,这在可信内网环境足够,如果对安全性要求高,需要配置jmxremote.password和jmxremote.access文件,Kafka Manager 侧也要对应填写用户名密码。

3.2 创建 Topic:UI 操作与命令行验证

Kafka Manager 的 Topic 创建页面提供了分区数和副本数的输入框。对于生产 Topic,我的建议是分区数不低于 Broker 数量,副本数保持 3,如果当前集群只有 2 个节点,副本数就填 2。

# 在 UI 上创建名为 order-events 的 Topic,分区数 6,副本数 3 # 创建后用命令行验证元数据是否与 UI 一致 kafka-topics.sh --bootstrap-server broker1:9092 --describe --topic order-events

命令行返回的分区信息里,每个分区对应一行,Replicas列显示三个 Broker,Isr列应该与Replicas完全一致。如果 UI 上创建成功但命令行看不到,说明 Topic 创建接口返回成功但实际上未写入 ZooKeeper,这种情况在版本选择错误时偶发。反过来,如果在命令行创建 Topic,UI 上通常需要等待一个刷新周期(大约 30 秒)才能看到,不要立刻刷新没看到就以为创建失败。

3.3 分区重平衡:从生成计划到手动执行

分区重平衡在 Kafka Manager 里不是一个自动触发的功能,需要手动生成分配方案,再手动执行。入口在Topic -> Reassign Partitions,选择需要迁移的 Topic,点击Generate Partition Assignments,系统会根据当前 Broker 列表生成一份副本分配 JSON。

{ "version": 1, "topics": [ { "topic": "order-events", "partition": 0, "replicas": [1, 2, 3] } ] }

这份 JSON 的逻辑很直白:把order-events的 0 号分区副本分配到 Broker 1、2、3 上。如果只想把部分分区搬到新加进来的 Broker 上,不要直接改这份自动生成的 JSON,而是去掉不需要迁移的分区项,保留目标分区。执行之后,Kafka 会慢慢做副本复制,期间 UI 上 Topic 的状态会显示Under-replicated,这是正常的,等复制完成后状态自动恢复。这里要留一个心眼:不要在业务高峰期执行大规模重平衡,副本复制会占用 Broker 磁盘 IO 和带宽,一旦落盘速度跟不上,会拖慢生产消费链路。

4. 用 UI 盯集群:Topic、Consumer 与延迟排查实战

4.1 Topic 列表页:颜色、分区分布与副本状态

Topic列表页第一眼看到的是所有 Topic 的名称、分区数、副本数和状态颜色。状态颜色是这个页面最有价值的信息:绿色代表所有分区副本都在 ISR 列表内;黄色代表存在Under-replicated分区,意味着某个副本长期掉队;红色代表有分区处于 offline,即副本全部不可用,此时对应分区无法读写。

点进 Topic 详情页,可以看到每个分区的 Leader、副本分布、ISR 列表,以及每个分区的消息量趋势。实际排查时最常用的路径是:先看列表页哪个 Topic 变色,再进详情页确认是哪个分区异常,最后顺着Replicas列定位到具体 Broker。这套链路 Kafka Manager 做得非常顺手,比命令行快得多。

4.2 Consumer 消费状态:Lag 计算与 Offset 重置

Consumer 页面是日常运维里打开频率最高的功能。进入Consumer标签页,会看到所有 Consumer Group 列表,每个 Group 后面有消费者数量和 Lag 汇总。Kafka Manager 对 Kafka 1.0 及以上的内部 Consumer Group 支持得最好,数据来源是 Kafka 自带的协调器;如果是老式的 ZooKeeper-based Consumer,虽然也能看到,但 Lag 数据可能不够准确。

需要特别谨慎的操作是Reset Offset。UI 上提供了重置消费位点的按钮,它会把 Group 的 Offset 直接改成选定位置。这个操作对正在实时消费的 Group 是危险的,例如业务方正在消费的 Group 有大量消息堆积,想在 UI 上把 Offset 重置到最新,如果 Group 内多个消费者实例同时在运行,重置过程中可能造成重复消费或消息跳跃。

我的建议是:任何 Offset 重置操作,先通知业务方,确认这个 Group 可以被位移,然后停掉业务消费者,再在 Kafka Manager 里执行重置,最后重启消费者验证。不要在 UI 里看到一个 Group Lag 高就直接点重置,这不是 Kafka Manager 的锅,而是 Kafka Offset 机制本质上就没有“后悔药”。

4.3 Broker 状态与 Preferred Replica Election

Broker 页面列出了每个 Broker 的主机名、端口、Controller 角色以及存活状态。这里有一个高频场景:某台 Broker 重启之后,原本分布在上面的分区 Leader 不会自动迁回去,即使该 Broker 已经恢复正常。此时 Kafka 集群处于“Leader 分布不均”的状态,但不影响读写,只是某些 Broker 压力偏大。

Kafka Manager 提供了Run Preferred Replica Election按钮,执行后集群会把每个分区的 Leader 迁回首选副本。操作路径在Operations -> Preferred Replica Election,可以全选所有 Topic 执行,也可以指定 Topic。执行后观察 Topic 详情页的 Leader 分布,正常情况下会看到 Leader 重新均匀分散到各个 Broker 上。

5. 避坑与常见问题排查:Kafka Manager 翻车记录与补救

5.1 Leader 显示 N/A、Topic 指标全空白:JMX 没对上

现象:集群页面正常显示,Broker 列表也在,但进入 Topic 详情后,Broker 列显示 N/A,所有指标图全是空白。

原因:Kafka Broker 没有开启 JMX,或者 Kafka Manager 集群配置里填的 JMX 端口与 Broker 实际监听端口不一致。常见做法是启动 Kafka 时忘了设置JMX_PORT。

解决:在 Kafka 启动脚本中配置 JMX 端口并重启 Broker。如果不想重启 Broker,检查server.properties附近是否有独立 JMX 配置文件,部分团队会用KAFKA_JMX_OPTS注入端口。修改 Kafka Manager 集群配置里的 JMX 端口后,等待一个刷新周期再看。

# 核对 Kafka 进程是否监听 9999 端口 ss -lntp | grep 9999

如果ss输出为空,说明 Broker 进程根本没打开 JMX 端口。不要在 Kafka Manager 上反复改端口,问题不在管理端。

5.2 集群版本选错导致操作报 Unsupported Version

现象:新建集群后 Broker 列表为空,或者创建 Topic 时提示Unsupported Version,但 ZooKeeper 地址确认无误。

原因:Kafka Manager 内置的协议版本与 Broker 实际版本差距过大,后台使用旧版 ApiVersions 请求时被 Broker 拒绝。

解决:把集群配置里的 Kafka Version 改为2.0.0。绝大多数 2.x 和 3.x Broker 都能兼容这个版本的请求。改完后重启 Kafka Manager,或者重新保存集群配置。如果仍然报错,检查 Broker 的inter.broker.protocol.version是否被设置成过旧版本,改成与 Broker 匹配的版本后滚动重启。

5.3 启用 SASL 认证后 Kafka Manager 连不上集群

现象:集群开启 SASL_PLAINTEXT 或 SSL 后,Kafka Manager 页面能打开,但集群状态异常,操作 Topic 时提示认证失败。

原因:Kafka Manager 以普通客户端身份连接 ZooKeeper 和 Broker,认证配置没有传给后端 JVM,因此拿不到元数据。

解决:在 Kafka Manager 的启动脚本中加入 JAAS 配置,指定认证文件路径,然后重启服务。

bin/kafka-manager \ -Dconfig.file=conf/application.conf \ -Djava.security.auth.login.config=/etc/kafka-manager/jaas.conf \ -Dhttp.port=9000

参数说明:-Djava.security.auth.login.config指定 JAAS 配置文件,文件内容需要包含 ZooKeeper 和 Kafka 两段认证信息。这个操作本质上是把 Kafka Manager 当成一个带认证的 Kafka 客户端来配置,和普通 Java 客户端连 SASL 集群的方式一致。

5.4 Kafka Manager 白屏,业务集群不受影响:先重启管理端

现象:页面长时间转圈或直接白屏,SSH 到服务器发现 Kafka Manager 进程还在,但端口不响应。

原因:Play Framework 的调度线程被大量元数据请求拖死,常见于同时纳管多个大集群的场景。Kafka 集群本身不受影响,生产消息照常收发。

解决:不要慌,更不要为了排查问题去重启 Kafka Broker。直接重启 Kafka Manager 进程即可。

# 找到 Kafka Manager 进程 ps -ef | grep kafka-manager # kill 后重新启动 kill <pid> bin/kafka-manager -Dconfig.file=conf/application.conf -Dhttp.port=9000 &

5.5 界面加载极慢:刷新周期和线程池参数

现象:点击 Topic 列表后页面要转几十秒才能出数据,同时 Kafka Manager 所在机器 CPU 跑满。

原因:配置了过多的集群,或者 Broker 数量大但管理端的元数据刷新周期太短。每个刷新周期都会拉取全量 Broker 元数据和 Topic 列表,集群越多,请求堆积越严重。

解决:在配置文件里调大刷新间隔,并适当调大调度线程池,然后重启。

# conf/application.conf 中调整 kafka-manager.broker-view-update-period-seconds=60 kafka-manager.poller.dispatcher.pool-size=8

参数说明:刷新间隔默认值偏小,调到 60 秒可显著降低访问频率,代价是 UI 上创建设置的生效时间变长;线程池大小控制并行拉取的能力,按集群数量调整,集群多就增大,但不要超过 CPU 核心数太多,否则只会增加上下文切换开销。

6. 进阶:把 Kafka Manager 的 API 变成巡检数据源

Kafka Manager 不仅提供页面,还暴露了一组 HTTP API。生产环境里监控平台未覆盖到 Kafka 指标时,可以写一个简单脚本,定期通过 API 拉取 Topic 元数据和分区状态,做到基础的健康巡检。

# 拉取集群列表 curl -s http://localhost:9000/api/clusters # 拉取指定集群的 Topic 列表 curl -s http://localhost:9000/api/clusters/data-center-a/topics

API 返回的是 JSON,可以直接用 Python 脚本解析。下面这个脚本逻辑是:拉取所有 Topic 的分区信息,检查是否存在 offline 分区,如果有就把异常 Topic 和分区号打印出来并返回非零退出码,方便接入定时任务。

#!/usr/bin/env python3 # 巡检脚本:检查集群内是否存在 offline 分区 import json import sys import urllib.request base_url = "http://localhost:9000" cluster = "data-center-a" with urllib.request.urlopen(f"{base_url}/api/clusters/{cluster}/topics") as resp: data = json.load(resp) # 兼容不同版本 API 返回结构 topic_map = data.get("topics", data) if isinstance(data, dict) else data bad_topics = [] for name, topic in topic_map.items(): for partition in topic.get("partitions", []): if partition.get("offline"): bad_topics.append((name, partition.get("partition"))) if bad_topics: print("发现 offline 分区:", bad_topics) sys.exit(1) print(f"Topic 总数: {len(topic_map)},所有分区在线")

脚本逻辑说明:从集群 topics 接口拿到数据后,先判断返回结构是否是字典,兼容不同部署版本返回格式的差异;再遍历每个 Topic 的分区列表,offline字段为true表示该分区所有副本不可用。定时任务可以加一个条件:连续两次巡检都发现同一个分区 offline 再告警,避免平滑切换期间误报。

这套脚本的前提依然是 JMX 配置正确,因为 Kafka Manager 的 API 数据来源与页面完全一致,JMX 采集不到的信息,API 也拿不到。另外,如果开启了 basicAuthentication,API 请求需要带 Basic Auth 头,可以用urllib.request.HTTPBasicAuthHandler或者在 curl 里加-u user:password。

写过那么多管理工具,Kafka Manager 算是最皮实的一个。但我也在半夜因为管理端白屏去重启过 Broker,结果把生产业务抖动了将近一个小时,查完才发现 Kafka Manager 自己假死而已。从那以后,每次动 Kafka Manager 之前我都强制走一遍流程:先确认 JMX 通不通,再确认版本选对没有,最后才决定要不要重启它本身。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询