4.3. 执行 Kafka 代理的安全滚动重启
此流程演示了如何在多节点集群中安全滚动重启代理。在升级或更改 Kafka 集群配置属性后,通常需要滚动重启。
有些代理配置不需要重启代理。如需更多信息,请参阅 Apache Kafka 文档中的 更新 代理配置。
执行代理重启后,检查复制主题分区,以确保副本分区已捕获。
要实现不丢失可用性的正常重启,请确保复制主题,并且至少复制主题(min.insync.replicas
)副本是同步的。min.insync.replicas
配置决定了必须确认写入被视为成功的最小副本数。
对于多节点集群,标准方法是具有最少为 3 的主题复制因素,并将最小 in-sync 副本设置为复制因素减 1。对于数据的持续时间,如果您在生成者配置中使用了 acks=all
,在重新启动下一个代理前需要检查您重启的代理是否与所有它所同步的分区保持同步。
单节点集群在重启后不可用,因为所有分区都在同一个代理中。
先决条件
- 一个 ZooKeeper 集群已被配置并运行。
Kafka 集群按预期运行。
检查有复制的分区或影响代理操作的任何其他问题。此流程中的步骤描述了如何检查有重复分区。
流程
在每个 Kafka 代理上执行以下步骤。在继续执行下一个代理前,在第一个代理上完成这些步骤。在最后一个活跃控制器的代理上执行步骤。否则,活动控制器需要在多个重启时更改。
停止 Kafka 代理:
/opt/kafka/bin/kafka-server-stop.sh
对在完成后需要重启的代理配置进行任何更改。
如需更多信息,请参阅以下内容:
重启 Kafka 代理:
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
检查 Kafka 是否正在运行:
jcmd | grep kafka
返回:
process ID kafka.Kafka /opt/kafka/config/server.properties
使用
ncat
实用程序将dump
命令发送到其中一个 ZooKeeper 节点,以验证所有节点是否为 Kafka 集群的成员。使用 ncat dump 检查 ZooKeeper 中注册的所有 Kafka 代理
echo dump | ncat zoo1.my-domain.com 2181
要使用包括四个字母的命令,如
dump
,需要在zookeeper.properties
中指定4lw.commands.whitelist=*
。输出必须包含您启动的 Kafka 代理。
具有 3 个节点的 Kafka 集群的 ncat 命令的输出示例
SessionTracker dump: org.apache.zookeeper.server.quorum.LearnerSessionTracker@28848ab9 ephemeral nodes dump: Sessions with Ephemerals (3): 0x20000015dd00000: /brokers/ids/1 0x10000015dc70000: /controller /brokers/ids/0 0x10000015dc70001: /brokers/ids/2
等待直到代理有 0 个重复分区。您可以从命令行检查或使用指标。
使用带有
--under-replicated-partitions
参数的kafka-topics.sh
命令:/opt/kafka/bin/kafka-topics.sh --bootstrap-server <bootstrap_address> --describe --under-replicated-partitions
例如:
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --under-replicated-partitions
命令提供了集群中带有重复分区的主题列表。
带有复制分区的主题
Topic: topic3 Partition: 4 Leader: 2 Replicas: 2,3 Isr: 2 Topic: topic3 Partition: 5 Leader: 3 Replicas: 1,2 Isr: 1 Topic: topic1 Partition: 1 Leader: 3 Replicas: 1,3 Isr: 3 # …
如果 ISR (同步副本)计数小于副本数,则会列出 in-replicated 分区。如果没有返回列表,则没有复制的分区。
使用
UnderReplicatedPartitions
指标:kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions
指标提供副本未捕获的分区计数。您等到计数为零。
提示当主题有一个或多个重复分区时,请使用 Kafka Exporter 创建警报。
重启时检查日志
如果代理无法启动,请检查应用程序日志中的信息。您还可以检查代理关闭的状态,并在 /opt/kafka/logs/server.log
应用程序日志中重启。
日志以成功关闭代理
# ... [2022-06-08 14:32:29,885] INFO Terminating process due to signal SIGTERM (org.apache.kafka.common.utils.LoggingSignalHandler) [2022-06-08 14:32:29,886] INFO [KafkaServer id=0] shutting down (kafka.server.KafkaServer) [2022-06-08 14:32:29,887] INFO [KafkaServer id=0] Starting controlled shutdown (kafka.server.KafkaServer) [2022-06-08 14:32:29,896] INFO [KafkaServer id=0] Controlled shutdown request returned successfully after 6ms (kafka.server.KafkaServer) # ...
成功重启代理的日志
# ... [2022-06-08 14:39:35,245] INFO [KafkaServer id=0] started (kafka.server.KafkaServer) # ...