第 4 章 迁移到 KRaft 模式
如果您使用 ZooKeeper 进行 Kafka 集群的元数据管理,您可以在 KRaft 模式中使用 Kafka。KRaft 模式替代 ZooKeeper 用于分布式协调,提供增强的可靠性、可扩展性和吞吐量。
要迁移集群,请执行以下操作:
- 安装控制器节点仲裁来替换 ZooKeeper,以进行集群管理。
-
通过将
zookeeper.metadata.migration.enable属性设置为true,在控制器配置中启用 KRaft 迁移。 - 启动控制器,并使用相同的配置属性在当前集群代理上启用 KRaft 迁移。
- 执行代理滚动重启以应用配置更改。
- 迁移完成后,将代理切换到 KRaft 模式,并在控制器中禁用迁移。
完成 KRaft 模式后,无法回滚到 ZooKeeper。在继续迁移前请仔细考虑这一点。
在开始迁移前,请验证您的环境是否可以支持 KRaft 模式的 Kafka:
- 只有在专用控制器节点上支持迁移,不支持将双角色作为代理和控制器的节点。
- 在整个迁移过程中,ZooKRaft 和 KRaft 控制器节点并行运行,集群中需要足够的计算资源。
先决条件
-
以
kafka用户身份登录 Red Hat Enterprise Linux。 - 每个主机上安装了 Apache Kafka 的流,且配置文件可用。
- 您在 Kafka 3.7.0 或更新版本中使用 Streams for Apache Kafka 2.7 或更新版本。如果您使用早期版本的 Apache Kafka,在迁移到 KRaft 模式前升级。
启用日志记录来检查迁移过程。
在
log4j.properties中为集群中的控制器和代理设置根日志记录器的DEBUG级别。如需详细的特定于迁移的日志,请为迁移日志记录器设置TRACE:控制器日志记录配置
log4j.rootLogger=DEBUG log4j.logger.org.apache.kafka.metadata.migration=TRACE
流程
检索 Kafka 集群的集群 ID。
使用
zookeeper-shell工具:/opt/kafka/bin/zookeeper-shell.sh localhost:2181 get /cluster/id该命令返回集群 ID。
为集群安装 KRaft 控制器仲裁。
使用
controller.properties文件在每个主机上配置控制器节点。每个控制器至少需要以下配置:
- 唯一的节点 ID
-
migration enabled 标记设置为
true - zookeeper 连接详情
- 控制器仲裁使用的监听程序名称
- 控制器投票的仲裁
用于 inter-broker 通信的监听程序名称
控制器配置示例
process.roles=controller node.id=1 zookeeper.metadata.migration.enable=true zookeeper.connect=zoo1.my-domain.com:2181,zoo2.my-domain.com:2181,zoo3.my-domain.com:2181 listeners=CONTROLLER://0.0.0.0:9090 controller.listener.names=CONTROLLER listener.security.protocol.map=CONTROLLER:PLAINTEXT controller.quorum.voters=1@localhost:9090 inter.broker.listener.name=PLAINTEXT控制器仲裁的格式是 <
node_id>@<hostname>:<port> (用逗号分开的列表)。KRaft 控制器需要 inter-broker 侦听器名称来启动迁移。
为每个控制器节点设置日志目录:
/opt/kafka/bin/kafka-storage.sh format -t <uuid> -c /opt/kafka/config/kraft/controller.properties返回:
Formatting /tmp/kraft-controller-logs将 <uuid> 替换为您检索的集群 ID。对集群中的每个控制器节点使用相同的集群 ID。
默认情况下,
controller.properties配置文件中指定的日志目录(log.dirs)设置为/tmp/kraft-controller-logs。/tmp目录通常会在每次系统重启时清除,使其仅适用于开发环境。如果需要,使用逗号分隔列表设置多个日志目录。启动每个控制器。
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/controller.properties检查 Kafka 是否正在运行:
jcmd | grep kafka返回:
process ID kafka.Kafka /opt/kafka/config/kraft/controller.properties检查每个控制器的日志,以确保它们已成功加入 KRaft 集群:
tail -f /opt/kafka/logs/controller.log
在每个代理上启用迁移。
如果运行,请停止主机上运行的 Kafka 代理。
/opt/kafka/bin/kafka-server-stop.sh jcmd | grep kafka如果使用多节点集群,请参阅 第 3.6 节 “执行 Kafka 代理的安全滚动重启”。
使用
server.properties文件启用迁移。每个代理至少需要以下额外配置:
- Inter-broker 协议版本设置为版本 3.7
- 启用迁移的标记
- 与控制器节点匹配的控制器配置
- 控制器投票的仲裁
代理配置示例
broker.id=0 inter.broker.protocol.version=3.7 zookeeper.metadata.migration.enable=true zookeeper.connect=zoo1.my-domain.com:2181,zoo2.my-domain.com:2181,zoo3.my-domain.com:2181 listeners=CONTROLLER://0.0.0.0:9090 controller.listener.names=CONTROLLER listener.security.protocol.map=CONTROLLER:PLAINTEXT controller.quorum.voters=1@localhost:9090ZooKeeper 连接详情应该已存在。
重启更新的代理:
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties迁移会自动启动,可能需要一些时间,具体取决于集群中的主题和分区数量。
检查 Kafka 是否正在运行:
jcmd | grep kafka返回:
process ID kafka.Kafka /opt/kafka/config/kraft/server.properties
检查活跃控制器中的日志,以确认迁移已完成:
/opt/kafka/bin/zookeeper-shell.sh localhost:2181 get /controller查找一个
INFO日志条目,如下所示:完成从 ZooKeeper 迁移到 KRaft 的元数据。将每个代理切换到 KRaft 模式。
- 如以前一样停止代理。
更新
server.properties文件中的代理配置:-
使用同一 ID 的
node.id替换broker.id -
为
代理添加代理KRaft 角色 -
删除 inter-broker 协议版本(
inter.broker.protocol.version) -
删除启用迁移的标记(
zookeeper.metadata.migration.enable) - 删除 ZooKeeper 配置
-
删除控制器和代理通信的监听程序(
control.plane.listener.name)
KRaft 的代理配置示例
node.id=0 process.roles=broker listeners=CONTROLLER://0.0.0.0:9090 controller.listener.names=CONTROLLER listener.security.protocol.map=CONTROLLER:PLAINTEXT controller.quorum.voters=1@localhost:9090-
使用同一 ID 的
如果您在代理配置中使用 ACLS,请将 authorizer.
class.name 属性更新为基于 KRaft 的标准授权器。基于 zookeeper 的代理使用
authorizer.class.name=kafka.security.authorizer.AclAuthorizer。迁移到基于 KRaft 的代理时,指定
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer。- 如以前一样重启代理。
将每个控制器从迁移模式切换到。
- 如前文所述,以与代理相同的方式停止控制器。
更新
controller.properties文件中的控制器配置:- 删除 ZooKeeper 连接详情
-
删除
zookeeper.metadata.migration.enable属性 -
删除
inter.broker.listener.name
以下迁移的控制器配置示例
process.roles=controller node.id=1 listeners=CONTROLLER://0.0.0.0:9090 controller.listener.names=CONTROLLER listener.security.protocol.map=CONTROLLER:PLAINTEXT controller.quorum.voters=1@localhost:9090- 如前文所述,以与代理相同的方式重启控制器。