图解kafka中hw,leo,isr

原创不易,转载请注明出处


前言

本文主要是介绍下kafka broker 中的hw leo isr分别是啥,然后介绍hw与leo在写入消息的时候,副本同步的时候在partition leader 副本与partition follower副本是怎样变化的,follower 副本要满足什么条件加入才能加入isr列表,又是在什么样的情况下被踢出isr列表。

1.hw leo isr的介绍

leo :log end offset,每个partition 副本中都有这么一个leo的维护(不管是leader 副本还是follower副本),代表着下一条消息的offset 就从这个leo开始,就是当前最后一条消息的offset+1。
在这里插入图片描述
比如说这个上图是某个partition 的某个副本,现在已经写到offset是3,下次再写入消息的offset是4,leo也就是4。如果这个时候再往里面追加一条消息,leo就成5了
在这里插入图片描述
isr列表:inSyncReplicas,分区中与leader副本保持一定程度同步的副本成为isr,这个是与副本同步有关的,就是说,如果你partition的follower副本会去leader副本上拉取数据同步到follower副本中,这个时候follower副本的leo也是会增加的,每拉过来一条数据follower副本的leo就会+1,然后如果你这个follower 副本的leo追上了leader的hw,就会将这个follower副本添加到isr列表中,如果过段时间发现这个follower 好长时间没有拉取数据了,就会将它从isr列表中剔除。
hw : highwater 高水位,这个东西是与副本同步和消费者消费有关,先说下副本同步的,leader 副本的hw是与isr中的副本leo有关的,是isr所有副本中leo,follower 副本在去leader副本上拉取消息进行同步的时候,会带上自己的那个leo,这个过程中leader副本就尝试更更新一下hw,然后每次follower副本拉取消息回来的时候,都会将leader的hw带回去,根据自己的leo来更新一下自己的hw,如果自己的leo小于leader的hw,自己的hw就是leo,如果是自己的leo大于leader hw,自己的hw就是leader hw。将消息消费者对hw后的消息是不可见的, 消息消费者只能消费hw之前的消息。

2.图解hw leo isr 变化

现在我们topic是orderTopic 然后partition是0的partition来举例子。然后有4个副本,一开始的时候什么不管是leader 还是follower副本里面一条消息都没有。
在这里插入图片描述

场景一:消息生产者往leader 副本中追加了一个消息集,追加完成后,leader副本就会检查一下增加一下leo,这个时候leader 副本的leo变成了2,hw还是0
在这里插入图片描述
场景二:3个follower副本不停的去leader 副本上同步消息,follower1,2,3很快将消息拉回了自己的broker 上去,由于他们的leo与leader的hw比较,是大于等于的,这几个副本都会加到isr中(需要注意的是leader副本是天生在isr中的)。消息到被追加到follower副本之后,更新各个副本字节leo。
在这里插入图片描述
就这个样子消息生产者不停的往leader副本的leo中追加消息,然后leader 副本的leo不停的增加,然后follower副本也不停的去leader副本上拉取消息,然后带上自己的leo,拉完消息后,leader副本就会更新下自己hw,自己的hw就是isr 副本中最小的那个leo,follower拉取消息回去的时候,会将leader副本的hw带回与与自己的leo做比较,如果leader hw小于自己的leo ,然后自己的hw就使用leader 的hw,如果自己的leo小于leader hw,就会使用自己的leo作为hw。
在这里插入图片描述
随着时间流逝,有的follower副本所在的broker由于机器性能问题或者是full gc原因,拉取速度就会很慢,leader 的hw就会为这个follower副本所拖累,就像上图中的follower 2副本。
leader 副本所在的机器还有有个定时任务,会每10s执行一次,然后会遍历所有partition的isr列表,找出那种10s(由replica.lag.time.max.ms这个参数配置的)没有发去过fetch请求(向leader副本发起同步消息)的follower副本,然后将他们移除对应的isr列表。
咱们这里假设follower 2 副本10s没有向leader 副本所在的broker 发起fetch请求,那个定时任务就会感知到这个副本有问题,然后就会从isr中摘除,接着更新下leader 的hw。
在这里插入图片描述
就像上图这个样子,一旦follower 2被移除isr列表,然后更新leader 的hw的时候,就会找现在在isr中的副本最小的那个leo。
如果是follower 2副本所在的机器负载变轻,然后同步追上了leader 副本,也就是说follower 2 的leo 追上了leader hw,这个follower 2 又会被添加到这个isr列表中。

总结

本文首先介绍了一下leo,isr,hw 是啥,接着图解了leader 副本在追加完消息后leo是怎样变化的,follower同步消息的时候leader的hw是怎样变化的,isr列表是怎样变化的,follower将消息同步到自己本地的时候,自己的leo与hw是怎样变化的。什么情况下会将follower从isr中移除,什么情况下在将follower添加到isr列表中。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页