Kafka 的再平衡机制
Kafka 的再平衡机制
1 什么是再平衡
所谓的再平衡,指的是在 kafka consumer 所订阅的 topic 发生变化时发生的一种分区重分配机制。一般有三种情况会触发再平衡:
consumer group 中的新增或删除某个 consumer,导致其所消费的分区需要分配到组内其他的 consumer 上;
consumer 订阅的 topic 发生变化,比如订阅的 topic 采用的是正则表达式的形式,如 test-*此时如果有一个新建了一个 topic test-user,那么这个 topic 的所有分区也是会自动分配给当前的 consumer 的,此时就会发生再平衡;
consumer 所订阅的 topic 发生了新增分区的行为,那么新增的分区就会分配给当前的 consumer,此时就会触发再平衡。
Kafka 提供的再平衡策略主要有三种:Round Robin,Range 和 Sticky,默认使用 Range。这三种分配策略的主要区别在于:
Round Robin:会采用轮询的方式将当前所有的分区依次分配给所有的 consumer;
Range:首先会计算每个 consumer 可以消费的分区个数,然后按照顺序将指定个数范围的分区分配给各个 consumer;
Sticky:这种分区策略是最新版本中新增的一种策略,其主要实现了两个目的:
1. 将现有的分区尽可能均衡的分配给各个 consumer,存在此目的的原因在于 Round Robin 和 Range 分配策略实际上都会导致某几个 consumer 承载过多的分区,从而导致消费压力不均衡;
2.如果发生再平衡,那么在重新分配前的基础上会尽力保证当前未宕机的 consumer 所消费的分区不会被分配给其他的 consumer 上;
2 Round Robin
关于 Round Robin 重分配策略,其主要采用的是一种轮询的方式分配所有的分区,该策略主要实现的步骤如下。这里我们首先假设有三个 topic:t0、t1 和 t2,这三个 topic 拥有的分区数分别为 1、2 和 3,那么总共有六个分区,这六个分区分别为:t0-0、t1-0、t1-1、t2-0、t2-1 和 t2-2。这里假设我们有三个 consumer:C0、C1 和 C2,它们订阅情况为:C0 订阅 t0,C1 订阅 t0 和 t1,C2 订阅 t0、t1 和 t2。那么这些分区的分配步骤如下:
1) 首先将所有的 partition 和 consumer 按照字典序进行排序,所谓的字典序,就是按照其名称的字符串顺序,那么上面的六个分区和三个 consumer 排序之后分别为:
2) 然后依次以按顺序轮询的方式将这六个分区分配给三个 consumer,如果当前 consumer 没有订阅当前分区所在的 topic,则轮询的判断下一个 consumer:
尝试将 t0-0 分配给 C0,由于 C0 订阅了 t0,因而可以分配成功;
尝试将 t1-0 分配给 C1,由于 C1 订阅了 t1,因而可以分配成功;
尝试将 t1-1 分配给 C2,由于 C2 订阅了 t1,因而可以分配成功;
尝试将 t2-0 分配给 C0,由于 C0 没有订阅 t2,因而会轮询下一个 consumer;
尝试将 t2-0 分配给 C1,由于 C1 没有订阅 t2,因而会轮询下一个 consumer;
尝试将 t2-0 分配给 C2,由于 C2 订阅了 t2,因而可以分配成功;
同理由于 t2-1 和 t2-2 所在的 topic 都没有被 C0 和 C1 所订阅,因而都不会分配成功,最终都会分配给 C2。
按照上述的步骤将所有的分区都分配完毕之后,最终分区的订阅情况如下:
从上面的步骤分析可以看出,轮询的策略就是简单的将所有的 partition 和 consumer 按照字典序进行排序之后,然后依次将 partition 分配给各个 consumer,如果当前的 consumer 没有订阅当前的 partition,那么就会轮询下一个 consumer,直至最终将所有的分区都分配完毕。但是从上面的分配结果可以看出,轮询的方式会导致每个 consumer 所承载的分区数量不一致,从而导致各个 consumer 压力不均一。
版权声明: 本文为 InfoQ 作者【五分钟学大数据】的原创文章。
原文链接:【http://xie.infoq.cn/article/c84bc2504b2b2faacf4826253】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论