Administrator
发布于 2023-07-19 / 4323 阅读
71

Kafka KRaft 模式取代 ZooKeeper 的迁移

背景:ZooKeeper 又成了单点隐患

七月中我们的 Kafka 集群(3.2 版本,还跑在 ZooKeeper 上)遇到一次 ZK 会话超时,导致整个集群控制器选举卡了 90 秒,消息生产大面积抖动。ZK 那套独立组件既要单独运维、又要和 Kafka 版本对齐,一直是心腹大患。Kafka 3.3 起 KRaft 模式已 GA,我们决定趁这次把 ZK 彻底去掉。

KRaft 架构:用 Quorum 取代 ZK

KRaft(Kafka Raft metadata mode)把元数据管理收编进 Kafka 自身,用内置的 Raft 共识(KafkaRaftClient)选出一个 Controller Quorum,不再依赖外部 ZooKeeper。角色分两类:

  • Controller:参与 Raft 选举、管理元数据和分区 Leader 分配,由 controller.quorum.bootstrap.servers 组成。
  • Broker:照常处理消息读写,不再连 ZK。

一个节点可以既是 Broker 又是 Controller(混合部署),小集群省钱;大集群建议分开。

迁移步骤:滚动且可回退

我们采取「先并行、再切换、最后下线」:

  1. 准备 KRaft Controller 集群:另起 3 个节点跑 Controller 角色,process.roles=controllerlisteners=CONTROLLER://:9093
  2. Broker 改为双连:Kafka 3.4+ 支持 zookeeper.connectcontroller.quorum.bootstrap.servers 并存过渡,先让 Broker 同时认识 ZK 和 KRaft。
  3. 切元数据到 KRaft:确认 Controller Quorum 健康后,逐台重启 Broker,去掉 zookeeper.connect
  4. 下线 ZK:全部 Broker 切完后,停掉 ZK 集群。

配置示例(Broker):

process.roles=broker
controller.quorum.bootstrap.servers=ctrl1:9093,ctrl2:9093,ctrl3:9093
listeners=PLAINTEXT://:9092,CONTROLLER://:9093

运维变化与收益

维度ZK 模式KRaft 模式
组件数Kafka + ZK 两套仅 Kafka
控制器选举依赖 ZK 会话,慢Raft 内部,秒级
扩缩容需协调 ZK元数据自管理
升级复杂度两组件版本耦合单一版本

实测切到 KRaft 后,控制器故障切换从 90 秒降到 3 秒以内,因为不用再等 ZK 会话超时。运维侧少维护一套 ZK,告警项直接少一半。

坑点提醒

  • KRaft 下 server.propertiesbroker.id 仍要唯一,但不再存 ZK,得靠自己保证不冲突。
  • 过渡期千万别两边同时写元数据,按官方步骤严格串行操作。
  • 旧版本消费者/生产者客户端不受影响,兼容性没坑。

就写到这。如果哪天你也被《Kafka KRaft 模式取代 ZooKeeper 的迁移》里同一个坑绊住,回来翻这篇,能省半小时。

参考