分区的分配以及再平衡
默认策略是
Range + CooperativeSticky
。
Kafka
可以同时使用
多个分区分配策略。
1.Range分区策略
Range 是对每个 topic 而言的。
首先对同一个 topic 里面的分区按照序号进行排序,并 对消费者按照字母顺序进行排序。
通过 partitions数/consumer数 来决定每个消费者应该 消费几个分区。如果除不尽,那么前面几个消费者将会多 消费 1 个分区。
例如,
7/3 = 2
余
1
,除不尽,那么 消费者
C0
便会多 消费 1
个分区。
8/3=2
余
2
,除不尽,那么
C0
和
C1分别多 消费一个。如果消费者1号挂了那么
1 号消费者:消费到 0、1、2、3 号分区数据。
2 号消费者:消费到 4、5、6 号分区数据。
2.RoundRobin分区策略
RoundRobin 轮询分区策略,是把所有的 partition 和所有的 consumer 都列出来,然后按照 hashcode 进行排序,最后 通过轮询算法来分配 partition 给到各个消费者。(假设都是七个分区,三个消费者)。
1号消费者:0,3,6
2号消费者:1,4
3号消费者:2,5
1号消费者挂掉再平衡之后
2号消费者:0,2,4,6
3号消费者:1,3,5
3.Sticky分区
可以理解为分配的结果带有“粘性的”。即在执行一次新的分配之前, 考虑上一次分配的结果,尽量少的调整分配的变动,可以节省大量的开销。
首先会尽量均衡的放置分区 到消费者上面,在出现同一消费者组内消费者出现问题的时候,会尽量保持原有分配的分 区不变化