图解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列表中。

LEO(Log End Offset)是指副本底层log文件下一条要写入的消息的位移。例如,如果LEO=10,那么当前文件已经写入了10条消息,位移范围是[0,10)。HW(High Watermark)是指所有分区已提交的位移,通常HW<=LEO。 对于多副本情况下,各个副本HWLEO的演变过程如下:当Leader副本写入新的消息时,它会更新自己的LEO。Follower副本会从Leader副本拉取消息,并更新自己的LEO为Leader副本的LEO值加1。同时,Follower副本还会更新自己的HW。更新HW的算法是比较当前LEO和Leader副本传送过来的HW的值,然后取较小值作为自己的HW值。HW的更新会触发消费者端的位移提交和消息删除。 KafkaLEOHW分别代表副本底层log文件下一条要写入的消息的位移和所有分区已提交的位移。通过比较HW和消费者的位移,Kafka可以保证消息的顺序性。 关于分区器、序列化器和拦截器,分区器用于决定将消息发送到哪个分区,序列化器用于将消息对象序列化为字节流进行发送,拦截器则可以在消息发送前后进行一些处理。处理顺序是先经过拦截器,然后经过分区器和序列化器。 Kafka生产者客户端的整体结构包括一个或多个Producer线程、一个缓冲区、一个分区器、一个或多个拦截器和一个或多个序列化器。Producer线程负责将消息发送到Kafka集群的Broker,缓冲区用于缓存待发送的消息,分区器决定消息被发送到哪个分区,序列化器将消息对象序列化为字节流进行发送,拦截器可以在消息发送前后进行一些处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

$码出未来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值