kafka-副本

kafka-副本

丁起男 133 2022-03-15

kafka-副本

作用:提高数据可靠性

kafka中副本分为leader和follower,kafka生产者只会把数据发往leader,然后follower找leader进行数据同步

ar:所有的副本,ar=isr+osr

isr:和leader抱持同步的副本集合(包括leader)

osr:和leader同步时,延迟过多的部分

leader选举

  1. broker启动后在zk的/brokers/ids中进行注册

  2. 所有broker到zkcontroller中进行争抢,抢到的就是controller broker,并由它负责监听/brokers/ids的节点变化

  3. 由controller broker进行leader选举

    规则:在isr中存活为前提,按照ar中排在前面的优先。例如ar【1、0、2】,isr【0,2】那么leader就会按照0、2的顺序轮询

  4. controller broker将节点信息上传到zk,其它broker从zk同步此信息

如果leader挂了

  1. controller会监听到节点变化
  2. 获取isr列表
  3. 按照规则选出新的leader

follower故障

  1. follower发生故障后会被临时踢出isr
  2. 这个期间leader和follower继续接收数据
  3. 待该follower恢复后,follower会读取本地磁盘纪录的上次的hw,并将log文件高于hw的部分截取掉,从hw开始向leader进行同步
  4. 等该follwer的leo大于等于该分区的hw,即follwer追上leader后,就可以重新加入isr了

leo(log end offset):每个副本的最后一个offset,leo其实就算最新的offset+1

hw(high watermark)所有副本中最小的leo,消费者能看到的最大的leo

leader故障

  1. leader故障后,会从isr中剔除,并选出一个新的leader
  2. 为保证多个副本之间的数据一致性,其余的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秒