Kafka-Kraft 架构
左图为 Kafka 现有架构,元数据在 zookeeper 中,运行时动态选举 controller,由controller 进行 Kafka 集群管理。右图为 kraft 模式架构(实验性),不再依赖 zookeeper 集群,而是用三台 controller 节点代替 zookeeper,元数据保存在 controller 中,由controller 直接进行 Kafka 集群管理。这样做的好处有以下几个:
- Kafka 不再依赖外部框架,而是能够独立运行;
- controller 管理集群时,不再需要从 zookeeper 中先读取数据,集群性能上升;
- 由于不依赖 zookeeper,集群扩展时不再受到 zookeeper 读写能力限制;
- controller 不再动态选举,而是由配置文件规定。这样我们可以有针对性的加强controller 节点的配置,而不是像以前一样对随机 controller 节点的高负载束手无策。
Kafka-Kraft 集群部署
Kafka kraft是2.8+的新特性,所以安装的版本必须是2.8+。
下载kafka安装包
参考:Kafka官网下载地址
解压
tar -xvf kafka_2.12-3.2.0.tgz -C <安装目录>
修改配置文件
注:此处修改的是{kafkaHome}/config/kraft/server.properties的配置配置文件,而不是{kafkaHome}/config/server.properties文件。
#配置当前节点角色为broker还是controller。
#由于kraft模式不再依赖zk,所以controller的角色由kafka来充当。
#专用模式:broker或controller,共享模式:broker和controller
process.roles=broker,controller
#配置当前节点ID,整个集群环境中唯一。
node.id=1
#配置controller角色地址,多个角色用逗号隔开,格式:<node.id>@<listeners CONTROLLER的连接地址>
controller.quorum.voters=1@10.211.55.5:8092,2@10.211.55.5:8093,3@10.211.55.5:8094
#控制器名称,多个名称用逗号隔开。
controller.listener.names=CONTROLLER
#配置broker和controller监听地址
listeners=PLAINTEXT://:8082,CONTROLLER://:8092
advertised.listeners=PLAINTEXT://10.211.55.5:8082
#配置kafka数据存储目录
log.dirs=/opt/kafka_cluster2/kafka8082/kafka-datas
初始化集群数据目录
- 首先生成存储目录唯一 ID(可以重复使用),生成脚本:bin/kafka-storage.sh random-uuid
- 用该 ID 格式化 kafka 存储目录。本质就是用于
log.dirs
目录下生成meta.properties文件的cluster.id。
# -t:指定随机生成的ID,-c:指定配置文件,这里是kraft目录下的文件
bin/kafka-storage.sh format -t ftFsKdj2QCu2HK9xKdjB3Q -c config/kraft/server.properties
启动服务
# -daemon:用守护进程后台启动服务。
# 这里指定的配置文件是kraft目录下的server.properties
bin/kafka-server-start.sh -daemon config/kraft/server.properties
其他集群节点(node.id=2和node.id=3)按照此步骤部署和配置。
注:如果修改了kraft/server.properties文件之后启动失败,此时可能生成的元数据和原本的配置文件不匹配,需要删除log.dirs
目录,再执行上一步(初始化集群数据目录)重新生成元数据。如果实在不能删除log.dirs
目录下的数据,则需要根据启动失败的日志手动修改元数据内容,元数据保存在生成__cluster_metadata-0的目录下。
总结
kraft是kafka新推出的功能,该功能还未完善或存在bug,但是是未来发展的趋势。
我用的是kafka3.2.0版本,发现有以下bug:
- 我集群配置的是3台,但是我故意一台台启动,当启动两台的时候,kafka服务才能正常使用。
- 当我故意不启动第三台节点,能正常关掉第二台节点,此时第一台节点的日志显示一直在重试连接其他配置的controller节点,当我用kafka的命令或者kill命令尝试关闭第一台的进程,无论如何都关闭不了,只有当我启动其他controller节点的时候,第一台的节点才能关闭。
- 当三台服务一起启动,或者一起关闭的时候才没有以上奇奇怪怪的情况出现。