9 张图带你理解 Kafka 中高水位 HW

大家好,我是君哥。

Kafka 高水位(简称 HW)是 Kafka 中非常重要的一个概念,今天来聊一聊 HW。

1 HW 简介

HW 是 Kafka 中 Offset 的一个值,HW 作为一个边界,Offset 小于 HW 的消息被称为已提交消息,这部分消息可以被消费者进行拉取消费,大于等于 HW 的消息被称为未提交消息,不能被消费者拉取。如下图:

图片

Offset 小于 108 的消息可以被消费者消费,Offset 大于等于 108 的消息不能被消费者消费 。

2 LEO 简介

Kafka 中跟 Offset 相关的还有一个重要概念叫 LEO(Log End Offset)。LEO 表示 Offset 中的最后一个位置,也就是新消息写入的第一个位置,这个位置还没有消息。比如下图中的 114 这个位置,新消息写入时会从这个位置开始存储。

图片

3 HW 更新机制

对于 Kafka 的一个分区来说,分区的所有副本都有 HW 和 LEO 这 2 个重要属性,不光是 Leader 副本。但是 Leader 副本的 HW 值被作为整个分区的 HW。

因此,分区每个副本所在的 Broker 都保存了自己的 HW 和 LEO 值,而 Leader 副本所在的 Broker 节点还保存了 Follower 副本的 HW 和 LEO。

注意:这里说的 Follower 必须跟 Leader 保持同步,一般用 2 个条件来判断:

  • Follower 在 ISR 集合中;

  • Follower 中 LEO 值落后于 Leader LEO 值的时间,不超过参数(replica.lag.time.max.ms)的值,默认 10s。

如下图,partition-test 这个分区有 3 个副本,Leader 和 Follower1、Follower2,Follower1 和 Follower2 所在的 Broker1 上保存了自己的 HW 和 LEO,而 Leader 所在的 Broker0 不仅保存了自己的 HW 和 LEO,还保存了 Follower1 跟 Follower2 的 HW 和 LEO。

图片

3.1 Follower 更新

Broker1 和 Broker2 作为分区的 Follower 副本,会从 Leader 拉取消息,写入本地磁盘,然后更新 LEO。更新成功 LEO 后,比较自己的 LEO 值跟 Leader 副本发送的 HW 值,取较小的作为自己的 HW。如下图:

图片

3.2 Leader 更新

从 3.1 中的图可以看到,Leader 收到 Follower 拉取消息请求后,会根据 Follower 副本发送的拉取请求中的 Offset 更新本地保存的 Follower 的 LEO。同时 leader 会更新自己的 HW = min LEO of{Leader、Follower1、Follower2}。

需要注意的是,Leader 是不能更新 Follower 的 HW 的。

下面看一下 Leader 副本收到生产者发送的消息时是怎样更新自己的 LEO 和 HW 的。如下图:

图片

4 一个示例

下面以 Leader 只有一个 Follower 的场景来说明 LEO 和 HW 的更新过程。

初始状态,Leader 所在的 Broker 节点保存的 Leader 的 LEO 和 HW 都是 0,保存的 Follower 的 LEO = 0。

图片

生产者发送一条消息后,Leader 节点更新 LEO = 1,此时 Leader 的 HW 是 0。Follower 还没有发起拉取请求,所以 Follower 的 LEO 任然是 0,Leader 的 HW 是 0。

图片

Follower 第一次拉取消息,发送给 Leader 的 Offset = 0,Leader 节点收到请求后,因为 Offset = 0,所以本地保存的 Follower LEO 不变。Leader 节点返回消息给 Follower,Follower 节点写入消息后更新自己的 LEO = 1。

图片

Follower 第二次拉取消息,发送给 Leader 的 Offset = 1,Leader 节点收到请求后,更新本地保存的 Follower LEO = 1,更新自己的 HW = 1 并返回给 Follower,Follower 收到 Leader 发送的 HW 后更新自己的 HW = 1。

图片

总结

高水位 HW 这个概念在 Kafka 中标记消息是否可以被消费者消费,这个概念跟 LEO 有着重要的关系。本文介绍了 LEO 和 HW 的更新机制,希望对你理解 HW 有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

让ChatGPT干正事、说人话、会思考!借助ChatGPT润出优质论文的实操指南

大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流,多多交流,相互成就,共同进步&a…

Qt 文件初始化配置ini/conf类型读写

学习目标: 文件初始化配置 前置环境 运行环境:qt creator 4.12 学习内容 INI 文件是一种常见的配置文件格式,它通常用于存储应用程序或系统的设置和参数。INI 文件的格式很简单,由以下几个部分组成: 节(Section): 节用方括号括起来,如 [General]、[Network] 等。…

基于Redis和阻塞队列的 异步秒杀业务

异步前 之前的秒杀业务的查询优惠券、查询订单、减库存、创建订单都要查询数据库,而且有分布式锁,使得整个业务耗时长,对此采用异步操作处理,异步操作类似于餐厅点餐,服务员负责点菜产生订单、厨师负责根据订单后厨做…

LabVIEW图像分段线性映射

介绍了如何使用LabVIEW对图像进行分段线性映射处理,通过对特定灰度值区间进行不同的线性映射调整,以优化图像的显示效果。案例中详细展示了如何配置和使用LabVIEW中的图像处理工具,包括设置分段区间、计算映射参数和应用映射函数等步骤。 实…

STM32智能医疗监测系统教程

目录 引言环境准备智能医疗监测系统基础代码实现:实现智能医疗监测系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 通信系统实现 4.4 用户界面与数据可视化应用场景:医疗监测与优化问题解决方案与优化收尾与总结 1. 引言 智能医疗监测系统通过STM32嵌…

Python爬取股票信息-并进行数据可视化分析,绘股票成交量柱状图

为了使用Python爬取股票信息并进行数据可视化分析,我们可以使用几个流行的库:requests 用于网络请求,pandas 用于数据处理,以及 matplotlib 或 seaborn 用于数据可视化。 步骤 1: 安装必要的库 首先,确保安装了以下P…

virtualbox窗口和win10窗口的切换

1、问题: 从windows切换到虚拟机可以用快捷键 ALTTAB,但是从虚拟机到windows使用 ALTTAB 无法成功切换 2、解决方法: 注意:发现设置为ctrlAlt会导致打开终端快捷键(CtrlAltT)失效,建议这里设置…

【C++】开源:地图投影和坐标转换proj库配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍地图投影和坐标转换proj库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&a…

mars3d加载wms服务或者wmts服务注意事项

1.wms只支持4326、3857、4490的标准切片,其他坐标系不支持 Mars3D三维可视化平台 | 火星科技 2.wmts同理,Mars3D三维可视化平台 | 火星科技 3.对应级别tilematrix找到的瓦片tilerow&tilecol这两个参数使用常见报错无效参考: 【Mars3d】…

VSCode设置字体大小

方法1:Ctrl 和 Ctrl -,可以控制整个VSCode界面的整体缩放,但是不会调整字体大小 方法2:该方法只能设置编辑器界面的字号,无法改变窗口界面的字号。 (1)点开左下角如下图标,进入…

商贸物流大脑:大模型+数据要素赋能智慧物流数据平台

项目背景与意义 物流行业快速发展,数据量急剧增加,随着电子商务、智能制造等领域的快速发展,物流行业面领着前所未有的挑战和机遇,如效率低下、资源配置不均、信息不透明等问题。随着全球化和电子商务的快速发展,数据…

【Linux进阶】文件系统8——硬链接和符号连接:ln

在Linux下面的链接文件有两种, 一种是类似Windows的快捷方式功能的文件,可以让你快速地链接到目标文件(或目录);另一种则是通过文件系统的inode 链接来产生新文件名,而不是产生新文件,这种称为硬链接&…

Vue + SpringBoot:el-upload组件单文件、多文件上传实战解析

文章目录 单文件上传后端前端 多文件上传后端前端 单文件上传 后端 PostMapping("/uploadDxfFile") public R uploadDxfFile(RequestParam(value "file", required true) MultipartFile multipartFile) throws Exception {// 文件校验工作if (multipar…

【C语言小知识】缓冲区

缓冲区 当我们使用printf()将数据显示在屏幕上,或者使用scanf()函数将数据输入到电脑里,我们是否会产生些许疑问?为何输入的字符会直接显示到屏幕上等等。这里需要介绍一个C语言中的一个关键概念——缓冲区。 当我们使用老式系统进行运行代码…

机器学习之保存与加载

前言 模型的数据需要存储和加载,这节介绍存储和加载的方式方法。 存和加载模型权重 保存模型使用save_checkpoint接口,传入网络和指定的保存路径,要加载模型权重,需要先创建相同模型的实例,然后使用load_checkpoint…

创维汽车开展年中总结会:创新创造·勇开拓 智慧经营·攀高峰

2024年7月3日,回顾上半年的工作成果,总结经验教训,明确下半年的发展方向和重点任务,创维汽车于山西省晋中市榆次区山西联合创维体验中心开展年中总结会。 创维集团、创维汽车创始人黄宏生;开沃集团联合创始人、首席执…

每日一更 EFK日志分析系统

需要docker和docker-compose环境 下面时docker-compose.yaml文件 [rootnode1 docker-EFK]# cat docker-compose.yaml version: 3.3services:elasticsearch:image: "docker.elastic.co/elasticsearch/elasticsearch:7.17.5"container_name: elasticsearchrestart: …

process.env 管理 Vue 项目的环境变量(Vue项目中环境变量的配置及调用)

简述:在构建 Vue 应用时,管理配置是开发中的一个重要部分。不同的环境(如开发、测试和生产)往往需要不同的配置,例如 API、 基础 URL、第三方服务的密钥等。使用环境变量可以帮助我们更好地管理这些配置。这里将介绍如…

2 极/2 零 (2P2Z) 补偿器

极/2 零 (2P2Z) 补偿器是模拟 II 型控制器的数字实现。它是一种滤波器,通过考虑两个极点和一个零点,将特定的增益和相位升压引入系统。您必须战略性地选择每个极点和零点的频率位置,这将有助于实现所需的系统性能。在该…

当需要对大量数据进行排序操作时,怎样优化内存使用和性能?

文章目录 一、选择合适的排序算法1. 快速排序2. 归并排序3. 堆排序 二、数据结构优化1. 使用索引2. 压缩数据3. 分块排序 三、外部排序1. 多路归并排序 四、利用多核和并行计算1. 多线程排序2. 使用并行流 五、性能调优技巧1. 避免不必要的内存复制2. 缓存友好性3. 基准测试和性…