bigywater.tech
Kafka 内部原理 · 43

ZooKeeper 模式和 KRaft 模式有什么区别

检查本机Kafka 4.3.1的安装目录,看ZooKeeper相关的脚本和配置是否还存在,再用一份老式的zookeeper.connect配置真实尝试启动,看这个版本会怎么响应。

0个
安装目录里真实找到的ZooKeeper相关脚本数量
必填
process.roles在这个版本真实唯一支持的启动方式

验证:这个版本的安装目录里,ZooKeeper相关的东西真实一个都不剩

命令 · shell $ ls $KAFKA_HOME/bin | grep -i zoo (真实没有任何输出) $ ls $KAFKA_HOME/config/zookeeper.properties (真实:No such file or directory)

老版本的Kafka发行包里,bin/目录下真实会有zookeeper-server-start.sh、zookeeper-shell.sh这些脚本,config/目录下也真实带着一份zookeeper.properties模板。本机装的Kafka 4.3.1,这些文件真实一个都找不到——不是藏在别的路径,是这个版本的发行包里真实压根没有打包它们。

验证:用老式配置真实启动一个broker,直接报错拒绝

命令 · shell $ cat zk-style.properties broker.id=99 zookeeper.connect=localhost:2181 log.dirs=/tmp/zk-style-logs $ kafka-server-start.sh zk-style.properties
真实实测 · 本机执行输出
[ERROR] Exiting Kafka due to fatal exception (kafka.Kafka$)
org.apache.kafka.common.config.ConfigException: Missing required configuration
"process.roles" which has no default value.
	at org.apache.kafka.common.config.ConfigDef.parseValue(ConfigDef.java:537)
	at kafka.server.KafkaConfig.<init>(KafkaConfig.scala:148)
	at kafka.Kafka$.buildServer(Kafka.scala:65)

这份配置里的zookeeper.connect=localhost:2181真实一个字都没有报错——它不是配置错误,是这个参数真实已经不存在于这个版本的配置体系里了,broker根本不检查它。真正让启动失败的,是process.roles这个KRaft模式的核心参数缺失:这个版本的KafkaConfig真实把process.roles定义成了一个没有默认值的必填项,不填就直接在构造配置对象这一步抛异常,连日志系统都还没真实初始化完。

结论

这组对照真实说明的不是"KRaft比ZooKeeper模式更推荐",而是在Kafka 4.x这个版本,ZooKeeper模式已经真实不存在了——发行包里没有相关脚本和配置模板,服务端代码也真实不再识别zookeeper.connect这个参数,process.roles(决定一个节点是broker、controller还是两者都是)变成了真实唯一支持、且必填的启动方式。本系列前面几篇里3节点集群的实验,每个节点的server.properties真实都设置了process.roles=broker,controller——这不是可选的性能优化项,是这个版本真实唯一能让Kafka启动起来的配置方式。

分步演示:真实验证ZooKeeper模式是否还存在

每一步都是本文上面真实用本机Kafka 4.3.1跑出来的原始结果。

老式zookeeper.connect配置真实启动不起来
这一步新验证的检查项

    参考与说明

    • 数据来自本机homebrew安装的Kafka 4.3.1发行包,真实检查bin/config目录内容,以及一次真实的启动失败尝试。
    • 和《Kafka Controller 到底负责什么》一起看:那篇看到的Controller职责,在ZooKeeper模式下真实是分散在ZooKeeper本身和一个专门的Controller broker之间完成的,本文的重点只是确认这个版本已经没有那条路可选。
    • 没有验证:更早版本(比如Kafka 3.x)里ZooKeeper模式和KRaft模式并存、可以互相迁移时的真实配置差异。
    京ICP备2026067502号-1京公网安备11010502063487号