Kafka再平衡算法是否跨主题平衡?

5

Kafka的再平衡算法是否跨越主题工作?

假设我有5个主题,每个主题有10个分区,并且有20个消费者应用程序实例在同一消费者组中订阅这5个主题。

Kafka会尝试均匀地在20个实例之间平衡50个分区吗?

还是它只在一个主题内进行平衡,因此前10个实例可能(或很可能)接收所有50个分区,而另外10个实例可能保持空闲?

我知道在早期的Kafka版本中,它不会在主题之间平衡,但目前的版本呢?

2个回答

4
将消费者实例分配到分区取决于消费者配置partition.assignment.strategy。其默认值为class org.apache.kafka.clients.consumer.RangeAssignor,但您也可以选择RoundRobinAssignorStickyAssignor或者通过扩展抽象类AbstractPartitionAssignor来构建自己的策略。
我认为对于您的情况,轮询分配策略会导致更平衡的分配。下面的图表显示了“范围”和“轮询”策略之间的差异。

enter image description here

在您的情况下(每个主题有10个分区和20个消费者实例),使用“范围”策略会导致10个实例处于空闲状态。然而,使用“轮询”策略会保持所有实例繁忙,因为它遵循以下原则:分区将均匀分布,最大分配差异应该为1个分区。
请注意,消费者对主题分区的分配与“重新平衡”不同。当发生以下情况时,将启动“重新平衡”:
- 消费者离开消费者组(例如未能发送心跳或明确请求离开); - 新消费者加入消费者组; - 消费者更改其主题订阅; - 订阅主题发生变化,例如增加/减少分区。
在重新平衡期间,整个消费者组的消费暂停,并且基于您选择的策略再次进行分配。

1
为什么RangeAssignor是默认策略,如果它如此无效? - Anatolii Stepaniuk
2
如果您有一个消费者组读取多个主题,通常希望在消费者内部加入数据。当这样做时,最好的方法通常是将主题共同分区,并且组内的消费者都具备执行连接所需的所有数据。 - Michael Heil

2
你可以选择RoundRobin作为分区分配器,而不是默认的Range分配器,以便让所有实例都进行消费。
Range分配器:
Range分配器适用于每个主题,它将根据消费者总数将分区划分为几个范围。然后,所有消费者将按字典顺序排序,每个消费者将取一组分区。
对于你的情况,每个主题有10个分区,总共有20个消费者。然后,协调员将为前10个消费者分配1个分区。在这种情况下,你将得到10个空闲的消费者。
对于每个主题都会发生同样的事情,因此你将得到前10个消费者已被分配5个分区(每个主题1个),而其他10个将处于空闲状态。
Round-Robin分配器:
Round-Robin分配器将列出由消费者组订阅的所有主题的所有分区。然后,每个消费者将轮流获取分区。
对于你的情况,协调员将列出所有分区,如下所示:
t1p1, t1p2, t1p3 ... t5p9, t5p10

所有20个消费者将按照此顺序进行分区,最终您将获得:

Consumer1: t1p1, t3p1, t5p1
Consumer2: t1p2, t3p2, t5p2
.
.
.
Consumer 10: t2p10, t4p10

它可以比范围分配器更加平衡。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接