第 4 章 迁移到 KRaft 模式
如果您使用 ZooKeeper 进行 Kafka 集群的元数据管理,您可以在 KRaft 模式中使用 Kafka。KRaft 模式替代 ZooKeeper 用于分布式协调,提供增强的可靠性、可扩展性和吞吐量。
在迁移过程中,您要安装一个控制器节点的仲裁,用于替换 ZooKeeper 来管理集群。您可以通过将 zookeeper.metadata.migration.enable
属性设置为 true
,在控制器配置中启用 KRaft 迁移。当控制器启动时,您可以使用同一配置属性在当前集群代理上启用 KRaft 迁移。迁移完成后,您可以将代理切换为使用 KRaft 和控制器退出迁移模式。
在开始迁移前,请验证您的环境是否可以在 KRaft 模式中支持 Kafka,因为 KRaft 不支持带有多个磁盘的 JBOD 存储。
先决条件
-
以
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 连接详情
- 控制器监听程序
控制器投票的仲裁
控制器配置示例
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
控制器仲裁的格式是 <
node_id>@<hostname>:<port
> (用逗号分开的列表)。
为每个控制器节点设置日志目录:
/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
如果您在多节点集群中运行 Kafka,请参阅 第 3.6 节 “执行 Kafka 代理的安全滚动重启”。
使用
server.properties
文件启用迁移。每个代理至少需要以下额外配置:
- inter-broker 协议版本设置为版本 3.5。
- 启用迁移的标记
- 控制器监听程序
- 控制器投票的仲裁
代理配置示例
broker.id=0 inter.broker.protocol.version=3.5 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
ZooKeeper 连接详情应该已存在。代理的控制器配置与控制器的控制器配置相同。
重启更新的代理:
/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 配置
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.metadata.migration.enable
属性。 如前所述,重启控制器。
以下迁移的控制器配置示例
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