点击关注公众号,Linux分布式主任及时送达
一、controller
在kafka集群中谁来充当controller,是一个值得解决的问题。就跟集群中谁来充当leader同理。
所以kafka集群中就会有选举一个broker会被作为controller。controller主要负责以下几件工作:
- 当集群有个副本数的leader挂掉,则需要集群中重新选举一个新的leader,选举规则为从ISR集合中从左边获得。
- 当集群中有broker新增或者减少,controller会同步信息给其他broker。
- 当集群中有新分区新增或者减少,controller会同步信息给其他broker。
如上图:
假设ISR为201和leader挂掉了,就会根据controller机制进行重新选举leader。
二、rebalance
- rebalance机制是在消费者没有明确分区来消费。
- 触发条件:当消费组中的消费者和分区的关系发生变化的时候。
- 分区分配的策略:在rebalance之前,分区怎么分配会有三种策略如下:
1、range:根据公式计算得到每个消费消费哪几个分区:当前的消费者是分区总数/消费者数量+1,之后的消费是分区总数/消费者数量2、轮询:大家轮着来
3、sticky:贴合策略,如果需要rebalance,会在之前分配的基础上调整,不会改变之前的分配情况。如果这个策略没有开,那么就要全部重新分配。官方建议开启,减少性能开销。
下面通过图解
range如图:
通过上图可看出,broker有七个分区,而分区会向通过消费组分区/消费者+1进行分配,同理可得后续新增分区。
轮询如下图:
sticky
sticky方法则是结合上述机制实现的,提高性能。
三、HW和LEO
LEO是指每个副本最大的offset偏移量位置。
HW是已完成同步的位置。消息在写⼊broker时,且每个broker完成这条消息的同步后,hw 才会变化。在这之前消费者是消费不到这条消息的。在同步完成之后,HW更新之后,消费者 才能消费到这条消息,这样的⽬的是防⽌消息的丢失。如下图:
HW
如上图:
HW高水位线类似于水库的水位警告线,根据上图解释,分区未能同步到leader分布式相同时只可以是无法消费到消息的,如果可以消费到也只可以消费到4不能消费到5。