适用范围与版本基线
本文面向 Kafka 4.1 KRaft 集群,先通过只读证据判断控制面是否具有可用多数派、日志是否收敛,再决定是否进入节点维护流程。4.1 是本文参考基线,不表示当前最新版本。命令要求使用与集群相容的发行包和经过配置的认证文件;本文不执行任何集群操作,验证状态为 PENDING。
记录 broker、controller、CLI 的具体版本,以及节点 ID、控制器监听器、机架、磁盘和元数据目录。现有 Kafka 集群监控场景 已展示 KRaft 控制面与观测关系,但没有展开实际投票成员及其元数据复制日志,不能从图中的单个 controller 方框推断真实成员数。
多数派解决什么问题
KRaft controller 通过复制元数据日志协调集群元数据,其中一个担任 active controller。投票成员的多数派决定仲裁能力:三个投票成员可容忍一个不可用,五个可容忍两个;增加 broker 或 observer 不会增加投票多数派。若三个 controller 共用一个存储故障域,进程分布并没有提供三个独立故障域。
controller 处理元数据,broker 承载业务分区日志。元数据仲裁丢失时,部分已有读写可能暂时继续,但依赖元数据变更、注册和故障接管的行为会受影响。因此应分别报告“数据面样本仍可用”和“控制面不能安全推进”,不能用一次生产成功覆盖控制面告警。KRaft 运维说明
静态与动态成员配置先分清
二进制版本和已生效的 feature level 是两份证据。Kafka 4.1 支持静态仲裁向动态仲裁升级,但升级二进制不会自动完成所有 feature 升级。读取 kraft.version:缺失或 FinalizedVersionLevel 为 0 表示静态仲裁,达到 1 表示动态仲裁;metadata.version 是另一项功能级别,不应混写。
静态仲裁用 controller.quorum.voters 描述投票成员。动态仲裁用 controller.quorum.bootstrap.servers 提供发现入口,入口地址列表不等于当前投票成员列表。应把配置文件、feature 状态和运行时 CurrentVoters 三者核对,而不是只数配置行中的地址。发现入口不可达也可能是监听器、证书或 ACL 问题,不能直接判断所有 controller 已宕机。
一次有限的只读采样
以下用一个已知 broker 管理入口采集,不遍历所有节点。先在终端设置实际 KAFKA_BOOTSTRAP 和受控认证文件路径 KAFKA_ADMIN_CONFIG,文件应限定请求与 API 超时,例如 10 秒请求、30 秒 API 预算。两项 CLI 均只执行一次;工具进程若超过约定总预算应中止并保留错误,不以无限重试替代定位。
bin/kafka-metadata-quorum.sh \
--bootstrap-server "$KAFKA_BOOTSTRAP" \
--command-config "$KAFKA_ADMIN_CONFIG" describe --status
bin/kafka-metadata-quorum.sh \
--bootstrap-server "$KAFKA_BOOTSTRAP" \
--command-config "$KAFKA_ADMIN_CONFIG" describe --replication记录 ClusterId、LeaderId、LeaderEpoch、HighWatermark、CurrentVoters 和 CurrentObservers,再按成员比较日志末端、复制差距和最近追赶时间。不要复制包含凭据的配置文件到巡检附件。若改用 --bootstrap-controller,必须使用实际 controller 监听器及对应认证,不能把 broker 端口机械替换成一个惯用端口。
如何解释日志进度
HighWatermark 表示已提交元数据进度,成员日志末端反映其已复制进度。单次差距不能说明趋势:在预先约定的窗口追加两次采样,结合当时真实的元数据变更量判断是否追赶。业务平稳、没有元数据变化时,高水位不增长本身不是故障;有待处理变更且提交延迟持续增长时才需要沿控制面继续查。
将 raft-metrics 的角色、当前 leader、epoch、提交延迟、选举延迟,与 controller 事件队列等待和处理时间对齐。Exporter 字段名取决于映射规则,先核对原始 JMX 指标及角色,不把 observer 的状态解释为丢失投票权。多个节点同时出现延迟,应优先关联共享磁盘、网络和进程停顿证据;单节点持续落后再缩小到该成员。Kafka 4.1 监控指标
节点维护需要保住身份与日志
在动态仲裁中,节点 ID、directory ID 和运行时成员身份都需要记录。更换磁盘不是“同一个 ID 启动即可”,新 controller 应先完成日志追赶,再按对应版本流程纳入投票成员。本文不提供 add-controller、remove-controller 或 format 的通用生产命令,因为它们改变恢复条件,需要实际拓扑和变更方案。
计划停止一个成员前,以当前已提交的投票成员总数 N 计算法定多数 floor(N/2)+1,再检查停机后仍健康且互通的成员数是否满足。暂时离线不会降低门槛:五名 voter 已有两名离线时仍需三名,不能把健康三名重算为多数两名。上一次维护尚未恢复追赶,或其他成员间歇不可达时,应停止下一步。combined broker/controller 模式把两种角色的维护故障域绑在一起,关键环境的容量与滚动维护不能按独立部署假定。
常见误区与危险恢复动作
- 把 topic ISR 当作 KRaft 投票成员。 ISR 服务业务分区复制,不能据此判断元数据仲裁。可联读 分区与消费诊断,但两份证据分别验收。
- 看到 ActiveControllerCount 为 1 就宣告健康。 本地角色只是时点信息,还要验证多数派通信、日志进度和请求效果。
- 落后就清空目录重新 format。 格式化会破坏原有元数据恢复输入;多数成员带空日志启动尤其危险。先保护原盘、集群身份和日志,禁止把格式化当作修复延迟的方法。
- 所有非 ISR 选主都等于不安全选举。 Kafka 4.1 新集群默认启用 ELR,ELR 与 unclean leader election 的资格规则不同;它属于业务分区可用性机制,仍不能补足 KRaft 多数派。ELR 官方说明
验收、停止与回退
首轮验收需保存实际投票成员、身份、故障域、leader 稳定性和同窗日志趋势,并能解释至少一个管理请求与一个业务读写样本的结果。有限观测只能证明该窗口,不应宣称已覆盖任意断电、网络分区或磁盘损坏。
多数派不确定、身份冲突、日志缺口无法解释或原始元数据副本不足时,停止滚动变更并进入事故恢复流程。只读采样的回退是结束采集;已改变成员或 feature 的环境不能靠复制旧配置保证回退,应按该版本支持路径与现有提交历史单独制定恢复方案。保留未知项和实测恢复时间,不填造成功记录。