【消息队列】Kafka高水位和Leader Epoch原理

news2024/11/14 15:42:58

什么是高水位

首先高水位也就是HW,而对应的有LEO,其实这都是Kafka副本中针对位移的概念,其目的就是为了保证多副本间数据的一致性。
LEO (Log End Offet):每个副本的最后一个offset,LEO其实就是最新的offset+1。
HW(High Watermark):所有副本中最小的LEO
在这里插入图片描述
图中Completed表示已经完成的,In-Flight 正在进行的工作,高水位代表的是消费位移的位置。

高水位作用

主要作用就是如下两个

  • 定义消息的可见性,消息可以被哪些消费者进行消费。
  • 帮助Kafka完成副本同步
    在这里插入图片描述
    消费者可以消费哪些消息?
    低于高水位的消息都可以被消费者消息,即已提交消息,但是对于未提交消息不能被消费者消费。(0-7) .需要注意的是等于高水位的位移,也即8这个消息也不能被消费者消费,因为它属于未提交消息的行列。
    LEO是什么?
    图中,写入的消息有15条,位移0到14,15代表的是下一条新消息即将写入的位置,也即就是LEO。所以高水位到LEO之间都属于未提交消息,不能被消费者消费。所以,同一个副本对象,其高水位值不会高于LEO值。
    高水位和LEO是副本重要的两个属性,所有副本都有LEO和高水位,只不过Leader副本的高水位就是分区高水位。

高水位更新机制

我们知道Leader副本和Follower副本都保存的有HW和LEO,但是在Leader副本所在的Broker中还保存的有所有Follower副本的LEO值。为什么需要保存所有Follower副本的LEO,目的是为了确定Leader副本的高水位,其实就是分区的高水位。
在更新Follower副本的HW和LEO的时候,会同步更新Leader副本的HW和LEO,以及更新所有副本的HW,注意这里不会更新所有Follower副本的HW。
在这里插入图片描述
更新机制
在这里插入图片描述
什么时候判断副本之间同步呢

  • 进入ISR中
  • 远程Follower副本LEO值落后于副本LEO值,但是不超过默认值10S,replica.lag.time.max.ms

Leader副本更新机制
在这里插入图片描述
如上图所示,处理生产者请求的逻辑具体

  • 1.生产者发送消息到Broker
  • 2.Broker将消息持久化到磁盘中
  • 3.获取Leader副本存储所有远程副本的LEO值,是一个集合。
  • 4.获取Leader副本的HW。
  • 5.比较Leader副本的HW和所有远程副本的LEO,获取最小值。

而处理follower副本拉取逻辑

  • 1.从磁盘或者页缓存读取消息
  • 2.使用follower副本请求的位移更新其对应远程副本的LEO值。
  • 3.更新分区高水位值,具体如上过程。

Follower副本更新机制
从Leader拉取消息的处理逻辑

  • 1.写入消息到本地磁盘
  • 2.更新副本的LEO值
  • 3.更新高水位值,
    • a. 获取Leader发送的高水位值,currentHW
    • b. 获取步骤2中更新过的LEO值,currentLEO
    • c. 更新高水位为min(currentHW,currentLEO)

副本同步机制解析

首先我们假设在一个分区两个副本机制下。初始值都是0
1.发送者发送一条消息到Broker
在这里插入图片描述
2.首先将Leader副本LEO更新为1,其次远程follower副本拉取Leader消息,也将自己更新为LEO=1
在这里插入图片描述
3.虽然Leader副本和follower副本也都将各自的LEO=1,但是对于高水位的更新需要在下次follower副本拉取的过程中进行更新。因为上次follwer副本已经拉取了位移为0的消息,当在此拉取位移为1的消息的时候,Leader副本会进行如下操作,会将leader副本的HW更新为1,远程副本更新为1。接着将已经更新过的高水位值发送给follower副本,follwer副本HW=1,整个过程就结束了。
在这里插入图片描述

Leader Epoch机制

上述描述了HW和LEO的概念和更新过程,但是仔细的朋友肯定会发现,其实在follower副本更新HW的过程和leader副本更新HW的过程是存在一个间隔期,而这个间隔期可能会出现数据丢失。当然前提是写入消息的配置 Broker 端参数 min.insync.replicas 设置为 1
我们来描述一下这个场景,
1.首先存在两个副本一个副本ALeader,一个副本B。初始设置时,Leader副本的HW=2,副本B HW=1,这是可能存在的,因为副本B的更新需要以来下一次的拉取才可以更新。
2.当副本B宕机后,重启,会从日志文件中拉取最新的消息,因为只存储来一条消息,即位移为0的位置。当时当副本B去从Leader副本拉取消息的时候,这个时间Leader副本宕机了,没有办法,副本B成为了Leader副本。而副本B只存储了一条消息,而副本A重启回来会从副本B拉取消息,原来HW=2,现在只能更新为1,所以导致了丢失了一条消息。
在这里插入图片描述
那么是如何解决上述出现的这种follower副本和Leader副本数据丢失的场景呢?
在这里插入图片描述
其实是比较简单的,就是在副本B重启回来之后去拉取Leader副本的LEO值,发现LEO=2,不比自己的小,不会对日志进行阶段,因此可以保留消息1.当Leader宕机之后,也会拉取副本B的LEO,发现也不比自己的小,所以不会出现阶段。通过Leader Epoch机制,可以避免消息丢失。

小结

本篇文章,从什么是HW和LEO 描述其基本概念,目的(消息的可见性和副本同步)然后介绍了在Leader副本和Follower副本更新机制过程中对HW和LEO值的更新,但是因为存在Leader副本和Follower副本时间上的间隔期,导致消息丢失,所以Kafka社区引入了Leader Epoch机制来解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你猜我猜不猜 (猜数字游戏) 快来小玩一把叭

🤩本文作者:大家好,我是paperjie,感谢你阅读本文,欢迎一建三连哦。 🥰内容专栏:这里是《C语言》专栏,笔者用重金(时间和精力)打造,将C语言知识一网打尽,希望可…

解决Vue热更新失效问题

解决Vue热更新失效 一、问题描述二、出现原因三、解决方案四、总结 🚀 欢迎访问我的个人博客:https://wk-blog.vip 一、问题描述 之前在本地测试Vue项目时,是可以热更新的,但是最近一段时间发现Vue的热更新失效了。然后通过vs co…

【大厂直通车】美团_测开面经

哈喽,大家好,我是小浪;那么最近暑假实习,日常实习是卷的飞起,无论是开发岗,测试岗,算法岗,都一片死寂;不过还是有很多大佬,成功绞杀很多大厂,offer也是拿到手软; 团子暑期实习offer: 📱本专栏致力于持续更新最新各大厂面经,实习消息,招聘要求; 那么目前价格…

ISCSI个人理解与简要说明

ISCSI个人理解与简要说明 一、如何理解ISCSI二、iscsi 命令iscsiadm(管理客户端)tgtadm(管理服务端) 三、ISCSI中的概念四、从DAS,NAS,SAN的角度扩展理解ISCSI 一、如何理解ISCSI 理解一个东西&#xff0c…

Niginx的rewrite

常用的Nginx正则表达式 ^匹配输入字符串的起始位置 $匹配输入字符串的结束位置 *匹配前面的字符零次或多次。如“ol*" 能匹配"o”及“ol”、“oll” 匹配前面的字符一次或多次。如“ol" 能匹配“ol"及“ol1”、“olll", 但不能匹配“o” ?…

服务器版本的表白墙

目录 1.步骤 2.提供两个接口: 3.流程 4.代码 1.前端代码 2.sql创建表 3.后端代码 MessageServlet.java DBUtil.java 1.步骤 1.约定前后端交互的接口 2.开发服务器代码 a.编写servlet处理前端发来的请求 b.编写数据库代码,存储获取关键的数据 3.开发客户端代码 a.基于…

java学习中遇到的问题及解答

你好,我想问一下,为什么在idea编译环境下,有异常的地方它会报错,让你主动添加抛出错误代码呢? 在Java中,有两种类型的异常,一种是受检异常(checked exception)&#xff0…

一级结构规范 合集

极限状态设计原则4.1限态4.11 极限状态可分为承载能力极限状态、正常使用极限状态和耐久性极限状态。极限状态应符合下列规定:1当结构或结构构件出现下列状态之一时,应认定为超过了承载能力极限状态;1) 结构构件或连接因超过材料强度而破坏,或因过度变形…

安捷伦E4433B信号发生器

E4433B Agilent E4433B ESG-D系列 4G信号发生器安捷伦250kHz-4GHz 品  牌: Agilent 简单介绍 频率范围: E4430B 250K-1GHz E4431B 250K-2GHz E4432B 250K-3GHz E4433B 250K-4GHz 18320918653 供单信道和多信道CDMA用的测量卡用于I和Q的20 MH…

第六章 建造者模式

文章目录 前言一、传统方式解决盖房子需求完整代码抽象房子类 AbstractHouse实现子类 普通房子实现子类 高楼大厦客户端盖房子 二、引入建造者模式建造者模式的四个角色: 产品、抽象建造者、具体建造者、指挥者完整代码House类 (产品角色)抽象父类(抽象建…

Node内置模块 【Event事件模块】

文章目录 🌟前言🌟Event事件模块🌟EventEmitter类🌟加载events模块🌟实例化eventEmitter对象 🌟事件方法列表🌟使用事件🌟异步与同步 🌟写在最后 🌟前言 哈喽…

ZLMeidiaKit实现推流时(FFmpeg推rtmp流)时非127.0.0.1被拒绝需要鉴权的解决方式

场景 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放: 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放_霸道流氓气质的博客-CSDN博客 在上面搭建ZLMedia…

CE作业(3)

1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​ 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于[www.openlab.com/student](http://www.openlab.com/student) 网站访问学生信息&…

windows和linux上证书的增删查

文章目录 引言windows上对个人证书的增删查创建证书证书的查找证书的删除证书的安装 Linux上对个人证书的增删查创建证书证书的安装证书的查看证书的删除 Linux上对系统证书的增删查 引言 PS: 我之前看过《图解密码技术》,已经对证书这些概念有基本的了解&#xff…

Docker容器---dockerfile简介

Docker容器---dockerfile简介 一、dockerfile概念1、dockerfile介绍2、基于dockerfile创建3、docker镜像加载原理 二、镜像的创建1、基于现有镜像创建2、基于本地模板创建3、基于dockerfile创建 三、Dockerfile编写1、dockerfile操作指令(1)FROM 镜像&am…

9. 自注意力机制(Self-attention Part2)

P27 自注意力机制(Self-attention Part2) 视频链接 P27 自注意力机制(Self-attention Part2) 计算流程: Multi-head: 应用:

数据结构入门篇:第一篇

数据结构入门篇:第一篇 时间复杂度 数据结构入门篇:第一篇1.时间复杂度2.时间复杂度的练习总结 🤔首先,为什么要学数据结构? 数据结构的概念:在内存中对数据进行管理; 数据结构的学习能让我们在…

C#生成单色bmp图片,转为单色bmp图片 任意语言完全用字节拼一张单色图,LCD取模 其它格式图片转为单色图

最终效果: V1.8.2 20230419 文字生成单色BMP图片4.exe 默认1280*720 如果显示不全,请把宽和高加大 字体加大。 首先,用windows画板生成一张1*1白色单色图作为标准,数据如下: 数据解析参考:BMP图像文件完…

【K8S系列】深入解析StatefulSet(二)

序言 那些看似不起波澜的日复一日,一定会在某一天让你看见坚持的意义。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 Kubernetes (k8s) 是一个容器编排平…

用梯度下降的方式来拟合曲线

文章目录 1. 简述2. 理论原理以二次函数为例整体的梯度下降步骤: 3. 编码实现初始化权重矩阵计算损失和梯度更新权重 4. 结果首先对上一篇文章中的真实数据拟合。测试拟合高次曲线方程数据是2阶的,拟合方程是2阶的数据是4阶的,拟合方程也是4阶…