3.3. 执行安全滚动重启 Kafka 代理
此流程演示了如何在多节点集群中正常滚动重启代理。通常需要在升级或更改 Kafka 集群配置属性后进行滚动重启。
有些代理配置不需要重启代理。如需更多信息,请参阅 Apache Kafka 文档中的 更新 代理配置。
执行代理重启后,检查请求相关主题分区,以确保副本分区已耗尽。
如果您正在复制主题并确保至少一个副本处于同步状态,则只能执行安全重启,且不会影响可用性。对于多节点集群,标准方法是具有最少为 3 的主题复制因素,并将最小 in-sync 副本设置为复制因素减 1。对于数据的持续时间,如果您在生成者配置中使用了 acks=all,在重新启动下一个代理前需要检查您重启的代理是否与所有它所同步的分区保持同步。
单节点集群重启后不可用,因为所有分区都位于同一代理中。
先决条件
- AMQ Streams 安装 在所有要用作 Kafka 代理的主机上。
- 配置了 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返回:
number 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-sync 副本)计数小于副本数,则会列出副本下复制的分区。如果没有返回列表,则不会有待复制的分区。
使用
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)
# ...