kafka分区的分配策略

kafka分区分配是否均衡会影响到Kafka整体的负载均衡,具体还会牵涉到优先副本等概念。kafka中的分区分配主要有三种:

  • 主题的分区分配:为集群制定创建主题时的分区副本分配方案
  • 生产者的分区分配:指为每条消息指定其所要发往的分区
  • 消费者的分区分配:指为消费者指定其可以消费消息的分区

1. topic的分区分配

创建主题时是否指定replica-assignment、broker.rack、disable-rack-aware等参数

  • 使用replica-assignment参数:按照指定的方案来进行分区副本的创建
  • 不使用replica-assignment参数:按照内部的逻辑来计算分配方案
    • 指定机架信息的分配策略
      • broker.rack:当前broker在哪个机房
      • disable-rack-aware:是否指定机架信息
    • 未指定机架信息的分配策略

2. 生产者的分区分配

当producer调用send方法发送消息之后,消息要经过拦截器、序列化器、分区器,之后才能被真正地发往broker。

  • 如果producer指定了topic+partition,那么消息就不需要经过分区器。
  • 如果producer只指定了topic,那么消息就需要经过分区器。

Kafka中提供的默认分区器是DefaultPartitioner,它实现了Partitioner接口(用户可以实现这个接口来自定义分区器),其中的partition方法就是用来实现具体的分区分配逻辑。

  • 如果消息的key为null,那么消息将会以轮询的方式发往主题内的各个可用分区
  • 如果消息的key不为null,那么默认的分区器会对key进行哈希(采用MurmurHash2算法,具备高运算性能及低碰撞率),最终根据得到的哈希值来计算分区号,拥有相同key的消息会被写入同一个分区

3. 消费者的分区分配

在Kafka的默认规则中,每一个分区只能被同一个消费组中的一个消费者消费。

对于消费者的分区分配而言,Kafka自身提供了三种策略。

3.1 RangeAssignor(默认的分区分配策略)

Range策略是对每个主题而言的,首先对同一个主题里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。在我们的例子里面,排完序的分区将会是0, 1, 2, 3, 4, 5, 6, 7, 8, 9;消费者线程排完序将会是C1-0, C2-0, C2-1。然后将partitions的个数除于消费者线程的总数来决定每个消费者线程消费几个分区。如果除不尽,那么前面几个消费者线程将会多消费一个分区。

3.2 RoundRobinAssignor

RoundRobinAssignor原理

RangeAssignor策略的原理是按照消费者总数和分区总数进行整除运算来获得一个跨度,然后将分区按照跨度进行平均分配,以保证分区尽可能均匀地分配给所有的消费者。对于每一个Topic,RangeAssignor策略会将消费组内所有订阅这个Topic的消费者按照名称的字典序排序,然后为每个消费者划分固定的分区范围,如果不够平均分配,那么字典序靠前的消费者会被多分配一个分区。

RoundRobinAssignor问题

这种分配方式明显的一个问题是随着消费者订阅的Topic的数量的增加,不均衡的问题会越来越严重

3.3 StickyAssignor

Kafka从0.11.x版本开始引入这种分配策略

StickyAssigno动机

  • 尽管RoundRobinAssignor已经在RangeAssignor上做了一些优化来更均衡的分配分区,但是在一些情况下依旧会产生严重的分配偏差,比如消费组中订阅的Topic列表不相同的情况下
  • 更核心的问题是无论是RangeAssignor,还是RoundRobinAssignor,当前的分区分配算法都没有考虑上一次的分配结果。显然,在执行一次新的分配之前,如果能考虑到上一次分配的结果,尽量少的调整分区分配的变动,显然是能节省很多开销的。

StickyAssigno目标

  • 分区的分配要尽可能的均匀
  • 分区的分配尽可能的与上次分配的保持相同

当两者发生冲突时,第一个目标优先于第二个目标。鉴于这两个目标,StickyAssignor策略的具体实现要比RangeAssignor和RoundRobinAssignor这两种分配策略要复杂很多。

 

参考

https://juejin.im/post/5d1df788f265da1b8811fa7b

https://www.jianshu.com/p/d4677c01d6a3

https://cloud.tencent.com/developer/article/1553585

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值