kafka-副本
作用:提高数据可靠性
kafka中副本分为leader和follower,kafka生产者只会把数据发往leader,然后follower找leader进行数据同步
ar:所有的副本,ar=isr+osr
isr:和leader抱持同步的副本集合(包括leader)
osr:和leader同步时,延迟过多的部分
leader选举
-
broker启动后在zk的/brokers/ids中进行注册
-
所有broker到zkcontroller中进行争抢,抢到的就是controller broker,并由它负责监听/brokers/ids的节点变化
-
由controller broker进行leader选举
规则:在isr中存活为前提,按照ar中排在前面的优先。例如ar【1、0、2】,isr【0,2】那么leader就会按照0、2的顺序轮询
-
controller broker将节点信息上传到zk,其它broker从zk同步此信息
如果leader挂了
- controller会监听到节点变化
- 获取isr列表
- 按照规则选出新的leader
follower故障
- follower发生故障后会被临时踢出isr
- 这个期间leader和follower继续接收数据
- 待该follower恢复后,follower会读取本地磁盘纪录的上次的hw,并将log文件高于hw的部分截取掉,从hw开始向leader进行同步
- 等该follwer的leo大于等于该分区的hw,即follwer追上leader后,就可以重新加入isr了
leo(log end offset):每个副本的最后一个offset,leo其实就算最新的offset+1
hw(high watermark)所有副本中最小的leo,消费者能看到的最大的leo
leader故障
- leader故障后,会从isr中剔除,并选出一个新的leader
- 为保证多个副本之间的数据一致性,其余的follower会先将各自的log文件高于hw的部分截掉,然后从新的leader同步数据
者只能保证副本之间的数据一致性,并不能保证数据不丢失或不重复
leader自动平衡
正常情况下,kafka本身会自动把leader partition均匀的分散在各个机器上,但是如果某些broker宕机,会导致leader partition集中在其他少部分几台broker上,这会导致少数几台broker的读写压力过高
为了解决这个问题kafka可以通过一些配置来实现自动平衡:
- auto.leader.rebalance.enable:是否开启自动平衡,默认true
- leader.imbalance.per.broker.percentage:每个broker允许的不平衡的leader的比例,默认10%
- leader.imbalance.check.interval.seconds:检查是否再平衡时间,默认300秒