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 系列已是稳定版本。
%

%
Quorum 控制器带来的好处:
- 新的元数据管理改进控制平面性能,集群可以扩展到数百万个分区;
- 稳定性提高、软件简化,更容易监控、管理和支持;
- 整个系统可以用单一的安全模型;
- 轻量级单进程即可开始使用 Kafka;
- 控制器故障转移几乎即时。
工作模式
仲裁控制器用 KRaft 协议保证元数据在仲裁中准确复制,状态存在事件源存储模型里,内部状态机随时可以精确重建。事件日志(元数据主题)定期通过快照删减,避免无限增长。其他控制器跟随活动控制器写入日志的事件;某个节点因分区事件掉线后,重新加入时读日志就能快速补齐错过的事件,不可用窗口显著缩短。
%

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

%
与 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。三个节点都要改。
%

%
格式化存储数据目录。先生成集群唯一 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 要保持一致,否则集群组不起来。
















暂无评论内容