HW 和 LEO是如何运行的?

💡HW LEO

相信大家在上一篇文章已经知道啦,HW 就是高水位的意思,也就是收到消息反馈的标识, LEO 末尾数据标识, 也就是代表着下一个需要发送的数据,或者消费者下一个需要消费的数据。

这一次我们来一起揭密一下HW LEO 到底怎么配合工作的达到高可用的目的,是否过程还有些什么问题?


💡HW LEO 运行流程

1.首先我们还是以寄邮件的例子来进行说明。假设快递员小苏呢 每天需要邮寄邮件给大妈 小王 和 小欣 ,但这次是广告邮件,广告商要求这次投递的邮件 需要每个人都收到了邮件 才算一个有效的投递 .

HW LEO初始化原理图 (1)

假设现在邮局开始收到广告商需要发出的邮件,此时邮局的LEO = 1 因为下一个邮件写入的是 1 HW 大家都还没有确认 所以HW还是0。

生产者发送信息后LEO变化

紧接着,快递员小苏开始将这些广告邮件开始派送了~

follower收到消息HW LEO变化

这时候大妈 小王 小欣都收到了邮件 所以对应的LEO都会进行修改为LEO=1 意思是下一次我要收1号邮件了 ,0号我已经收过了

然后通知邮局嘿,0号广告邮件我已经看到了, 产品确实很实惠,但是别给我在发了哈,一次就够了。

leader 接受到follower响应更新HW (1)

邮局说,好啦你们都收到了对吗, 好的这次发生成功 我更新一下HW先。 所以此时HW = 1,证明大家已经收到了0号邮件,可是小王他们都HW都还是0呢 ,那么他们应该怎么更新呢?

答案就是下一次邮件发送的时候 leader 会带上自己的HW 以及 对应的LEO 也就是下一次数据发送的时候进行更新,如下图所示

followerHW更新示意图

不知道小伙伴们看懂了这两个参数更新的流程吗?

首先呢LEO的更新逻辑都是一样的,就是有数据写入的时候 往后先移动一位,定义好下一个需要写入的标识

HW呢有所不一样

leader HW : 当所有follower的LEO都更新了 , 才会进行更新HW。

follower HW : 只有当leader HW更新了 ,follower的HW才会进行更新,并且是第二次请求才会进行更新。

但是后面出现了这个情况, 小欣由于工作原因出差, 暂时无法接收到邮件, 那么怎么办呢?

由于Follower 有节点落后出现的问题


由上图可以知道 由于有节点落后,导致HW一直无法更新,并且kafka针对HW也有规定, 只有HW标识前的数据才能被读取, 也就是说HW=1 作为消费者来说只能看到0 和 1 的数据

后面的数据是无法看到的, 通过这个保证了数据的高可用。上述图中, 由于小欣同学出差导致了落后了, 这时候影响了HW的运行,导致了整体数据的堵塞,那么该怎么办呢?


💡ISR剔除机制

这时候其实kafka内部有一个剔除标准的, 也就是当你落后了多少数据 就把你剔除出去,就像上图的小欣 严重落后了 , 那么就先暂时剔除出去。如下图所示

follower严重落后进行剔除

看这样他们又一次恢复正常啦,整体的LEO 以及 HW都在开始慢慢进行恢复这一一边添加 一边确认,保证了复制到准确性。

好啦~,以上就是HW 以及 LEO的整体运行流程.

推荐阅读

🗣️那么后续想要了解LEO以及HW在什么情况下数据会丢失呢?kafka又是怎么修复的呢?

那么请留意后期的推文,或者关注我集中更新哦~

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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的更新会触发消费者端的位移提交和消息删除。 Kafka中的LEOHW分别代表副本底层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、付费专栏及课程。

余额充值