去掉 ZooKeeper:KRaft 模式搭建高可用 Kafka 集群

Kafka 3.x 用 KRaft 共识协议替代了 ZooKeeper 做元数据管理,部署一套高可用 Kafka 集群从此不用再单独维护一个 ZK 集群。这篇先讲清楚 KRaft 是什么,再记录三节点集群的搭建过程(kafka_2.13-3.1.0)。

KRaft 机制

Apache Kafka Raft (KRaft) 是为消除 Kafka 对 ZooKeeper 的元数据管理依赖而引入的共识协议,元数据职责合并进 Kafka 自身。KRaft 模式在 2.8 发布了体验版,3.0 内置,3.X 系列已是稳定版本。

%

kafka-kraft01

%

Quorum 控制器带来的好处:

  1. 新的元数据管理改进控制平面性能,集群可以扩展到数百万个分区;
  2. 稳定性提高、软件简化,更容易监控、管理和支持;
  3. 整个系统可以用单一的安全模型;
  4. 轻量级单进程即可开始使用 Kafka;
  5. 控制器故障转移几乎即时。

工作模式

仲裁控制器用 KRaft 协议保证元数据在仲裁中准确复制,状态存在事件源存储模型里,内部状态机随时可以精确重建。事件日志(元数据主题)定期通过快照删减,避免无限增长。其他控制器跟随活动控制器写入日志的事件;某个节点因分区事件掉线后,重新加入时读日志就能快速补齐错过的事件,不可用窗口显著缩短。

%

kafka-kraft02

%

事件驱动还有个额外收益:仲裁控制器激活前不需要像 ZK 方案那样先加载状态,领导权切换时新控制器内存里已经有全部提交的元数据记录。以前靠 RPC 完成的任务,现在统一走事件和日志。

%

kafka-kraft03

%

与 ZooKeeper 模式的配置对比

使用Zookeeper 使用Kraft
配置客户端和服务 zookeeper.connect=zookeeper:2181 bootstrap.servers=broker:9092
配置模式注册表 kafkastore.connection.url=zookeeper:2181 kafkastore.bootstrap.servers=broker:9092
Kafka管理工具 kafka-topics –zookeeper zookeeper:2181 kafka-topics –bootstrap-server broker:9092 … –command-config properties to connect to brokers
REST 代理 API v1 v2 或 v3
获取 Kafka 集群 ID zookeeper-shell zookeeper:2181 get/cluster/id kafka-metadata-quorum或查看metadata.properties或confluent cluster describe –url http://broker:8090 –output json

三节点集群部署

提示:在 kafka-zk01 上装好后直接拷贝给另外两个节点即可,下面只记录 kafka-zk01,其余节点操作相同。

解压安装:

[root@kafka-zk01 ~]# cd /opt/soft
[root@kafka-zk01 soft]# tar -zxvf kafka_2.13-3.1.0.gz -C /usr/local/
[root@kafka-zk01 soft]# cd /usr/local/
[root@kafka-zk01 local]# mv kafka_2.13-3.1.0 kafka

修改配置。配置文件路径:kafka安装目录/config/kraft/server.properties。三个节点都要改。

%

kafka-kraft04

%

格式化存储数据目录。先生成集群唯一 ID,三台节点必须使用同一个 ID 格式化:

[root@kafka-zk01 ~]# cd /usr/local/kafka/bin/
[root@kafka-zk01 bin]# ./kafka-storage.sh random-uuid
3S3eLM1kQ5KP-tYT103bJg

#三台节点都要使用上面生成的唯一集群ID进行格式化数据存储目录
/usr/local/kafka/bin/kafka-storage.sh format -t 3S3eLM1kQ5KP-tYT103bJg -c /usr/local/kafka/config/kraft/server.properties

用 Systemd 管理服务:

cat > /etc/systemd/system/kafka.service << EOF
[Unit]
Description=Apache Kafka server (broker)
Documentation=https://kafka.apache.org
After=network.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/kraft/server.properties
Restart=on-failure
LimitNOFILE=265535

[Install]
WantedBy=multi-user.target
EOF

三节点依次启动:

systemctl daemon-reload
systemctl restart kafka.service
systemctl status kafka.service
systemctl enable kafka.service

高可用测试与注意事项

两种方式验证:任一节点手动创建 Topic,去其他节点查看;手动创建生产者 Producer,在其他节点创建消费者 Consumer 消费。

配置里最容易踩的坑:每台主机的 node.id 不能重复,监听地址要根据实际服务器 IP 修改。三台节点的 server.properties 里 controller.quorum.voters 要保持一致,否则集群组不起来。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容