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

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

责任编辑:武晓燕 来源: 君哥聊技术
相关推荐

2020-06-28 07:39:44

Kafka分布式消息

2022-06-11 18:15:26

KubernetesDockerLinux

2022-02-28 11:10:42

ZGCG1收集器

2022-04-11 11:55:34

架构技术调优

2022-06-13 11:05:35

RocketMQ消费者线程

2023-04-11 08:35:22

RocketMQ云原生

2022-07-11 11:06:11

RocketMQ函数.消费端

2021-04-25 10:45:59

Docker架构Job

2021-05-18 06:55:07

Java AQS源码

2022-07-04 11:06:02

RocketMQ事务消息实现

2022-06-27 11:04:24

RocketMQ顺序消息

2019-07-24 08:49:36

Docker容器镜像

2021-11-12 08:38:26

一致性哈希算法数据结构

2021-12-06 07:15:47

Pulsar地域复制

2015-07-13 10:23:23

Java图解

2022-05-09 11:15:05

RocketMQPULL 模式PUSH 模式

2023-09-28 21:37:41

HashMap多线程

2020-11-27 06:28:55

Spring循环依赖

2021-08-15 18:59:13

垃圾收集器JDK

2021-11-29 07:47:56

RocketMQ分布式消息
点赞
收藏

51CTO技术栈公众号