Kafka的ISR概念及Leader和follower数据同步机制

1.Replica
kafka的broker端每个partition都会有多个副本(replica),至少有一个leader领导者副本以及多个follower追随者副本(可配置),分区接收消息以及消费消息都会在leader中进行,而follower副本的作用就是备份leader中的消息,它们会定时的从leader中拉取最新数据,从而尽可能的保证和leader的同步。

1.什么是ISR?
分区中的所有副本统称为AR(Assigned Replicas)。所有与leader副本保持一定程度同步的副本(包括leader)组成ISR(in-sync replicas)。而与leader副本同步滞后过多的副本(不包括leader),组成OSR(out-sync replicas),所以,AR = ISR + OSR。在正常情况下,所有的follower副本都应该与leader副本保持一定程度的同步,即AR = ISR,OSR集合为空。

leader副本负责维护和跟踪ISR中所有follower的滞后状态,当follower落后太多或者长时间没有向leader发起同步请求,leader副本就会认为它出问题了,会把它从ISR中移除,这时候这个follower就会放入OSR集合中,直到某个时候这个follower同步跟上了leader,然后这个副本又会被加入到ISR中。此外,当leader副本挂了,只有ISR中的follower副本才有资格成为leader,OSR中的则没有资格。(可以通过修改对应的参数配置)。

2.ISR的伸缩性
Kafka在启动的时候会开启两个与ISR相关的定时任务,名称为“isr-expiration”和“isr-change-propagation”。
isr-expiration任务会周期性的检测每个分区是否需要缩减ISR集合。当检测到ISR中又失效的副本的时候,就会缩减ISR集合。如果某个分区的ISR集合发生变更,就会将变更后的数据记录到zookeeper中。
除此之外,ISR集合发生变更后会将变更后的记录缓存到isrChangeSet中,isr-change-propagation任务就会周期性的检查isrChangeSet,如果发现isrChangeSet中有ISR集合的变更记录,它就会在zookeeper的/isr_change_notification的路径下创建一个以isr_change开头的持久顺序节点(比如/isr_change_notification/isr_change_00000000),并将isrChangeSet中的信息保存到这个节点。kafka控制器为/isr_change_notification添加了一个Watcher,当这个节点的子节点发生变化的时候就会触发Watcher动作,以此通知控制器更新相关的元数据信息并向它管理的broker节点发送更新元数据信息的请求。最后删除/isr_change_notification的路径下已经处理过的节点。频繁的触发Watcher会影响kafka控制器,zookeeper甚至其他broker性能。为了避免这两种情况,kafka添加了指定的条件,当检测到分区ISR集合发生变化的时候,还需要检查以下两个条件:
(1).上一次ISR集合发生变化距离现在是否已经超过5秒。
(2).上一次写入zookeeper的时候距离现在已经超过60秒。
满足以上两个条件之一可以将ISR写入集合的变化的目标节点。

kafka何时扩充ISR?
随着follower副本不断进行消息同步,follower副本LEO也会逐渐后移,并且最终赶上leader副本,这个时候follower副本就有资格进入ISR集合,判断是否追上leader副本的判定准则是这个副本的LEO是否小于leader副本HW,并不是和leader副本LEO相比。ISR扩充后会同样更新zookeeper和isrChangeSet,之后的步骤就和ISR收缩的时候相同。

3.分区中的HW、LW、LEO
HW(High Watermark),俗称“高水位”,它表示了一个特定消息的偏移量(offset),消费只能拉取到这个offset之前的消息
LW(Low Watermark),俗称“低水位”,代表AR集合中最小的logStartOffset值,副本的拉取请求和删除请求都可能促使LW的增长。
LEO(Log End Offset),它表示当前日志文件中下一条待写入消息的offset,LEO的大小相当于当前日志分区中最后一条消息的offset值+1。分区ISR集合中每个副本都会维护自身的LEO,而ISR集合中最小的LEO即为分区的HW,对于消费者而言,只能消费HW之前的消息。
在这里插入图片描述
在这里插入图片描述

上图,follower1和follower2会拉取leader副本中的数据,在同步过程中,它们的同步效率也不一样,在某一时刻follower1完全跟上了leader副本而follower2只同步了消息3,所以当前leader副本LEO是5,follower1的LEO是5,follower2的LEO是4,那么当前分区的HW是4,所以只能消费到offset为0-3之间的消息。
在这里插入图片描述
直到follower1和follower2都成功写入了消息3和消息4,整个分区的HW和LEO是5,消费者就可以消费4位置上的消息了。

4.follower如何与leader同步数据
kafka的复制机制不是完全的同步复制,也不是单纯的异步复制,同步复制要求所有能工作的follower副本都复制完,这条消息才能被确认成功提交,这种是方式影响力性能。而在异步复制的情况下,follower副本异步的从leader副本中复制数据,数据只要被leader副本写入就认为已经成功提交。这种情况下,如果follower副本都没有复制完而落后于leader副本,这时候leader突然宕机,就会造成数据丢失。Kafka使用ISR的方式有效的权衡了数据可靠性与性能之间的关系。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值