3.11. 对可用性进行分区重新平衡
分区可以在代理之间复制以容错。对于给定分区,一个代理是被选择的领导人,处理所有生成请求(写入日志)。在其他代理中,分区遵循者复制分区领导分区数据,以便在领导失败时数据可靠性。
遵循者通常不为客户端提供服务,但 机架 配置允许消费者在 Kafka 集群跨越多个数据中心时使用来自最接近的副本的消息。仅限后续者只从分区领导设备复制信息,并允许恢复失败。恢复需要一个 in-sync follower。跟进者通过将 get 请求发送到领导请求来保持同步,按顺序将消息返回到后续程序。如果遇到最近提交的消息在领导上的最新提交的消息,则跟进者就被视为同步。领导者通过查看后续者请求的最后一个偏移来对此进行检查。除非允许未干净的领导选举机制,否则,直到同步后续程序通常不符合领导机 后才应具备资格。
您可以在后续者视为同步范围前调整 lag 时间:
# ...
replica.lag.time.max.ms=30000
# ...
lag time 定时限于将消息复制到所有 in-sync 副本,以及生产者必须等待被确认的时间。如果后续程序未能生成 fetch 请求,并在指定的 lag 时间内获取最新的消息,则会从同步副本中删除。您可以缩短早检测失败的副本的滞后时间,但这样做可能会增加无法同步的后续者数量。正确的 lag 时间值取决于网络延迟和代理磁盘带宽。
当领导分区不再可用时,选择其中一个 in-sync 副本作为新领导。分区副本列表中的第一个代理称为 首选 领导者。默认情况下,基于定期检查领导分布,默认启用 Kafka 以进行自动分区领导重新平衡。也就是说,Kafka 会检查首选领导是 当前的 领导人。重新平衡可确保领导人在代理和代理之间均匀分布。
您可以使用 AMQ Streams 的 Cruise Control 找出副本分配,以在集群中均匀平衡负载的代理。其计算考虑了领导者和后续者所经历的不同负载。失败的领导人会影响 Kafka 集群的平衡,因为剩余的代理会获得领先的额外分区的额外工作。
对于由 Cruise Control 找到的分配,需要实际平衡分区是首选领导分区所致的。Kafka 可以自动确保使用首选领导者(可能),根据需要更改当前的领导人。这样可确保集群保持在 Cruise Control 找到的 balanced 状态。
在触发重新平衡前,您可以控制重新平衡检查的频率(以秒为单位),以及对代理允许的 imbalance 百分比。
#...
auto.leader.rebalance.enable=true
leader.imbalance.check.interval.seconds=300
leader.imbalance.per.broker.percentage=10
#...
代理的领导值是当前代理是当前领导的分区数和首选领导分区数量之间的比例。您可以将百分比设定为零,以确保始终选择首选领导(假设它们处于同步状态)。
如果检查重新平衡需要更多的控制,您可以禁用自动重新平衡。然后,您可以选择何时使用 kafka-leader-election.sh 命令行工具触发重新平衡。
带有 AMQ Streams 提供的 Grafana 仪表板显示没有活跃领导的分区和分区的指标。