高水位是什么

水位是一个单调增加且表征最早未完成工作的时间戳
在这里插入图片描述

  • 蓝色Completed部分代表已经完成的工作
  • 红色In-Flight部分代表正在进行中的工作
  • 蓝色和红色两者的边界就是水位线

Kafka中水位是通过消费位移来表示的,而不是时间戳。Kafka中的高水位一般缩小为HW

高水位的作用

  • 标识分区下哪些消息是可以被消费者消费的
  • 帮助Kafka完成副本同步

在这里插入图片描述

  • 高水位:位移值等于高水位的消息也属于未提交消息
  • LEO:Log End Offset,标识副本写入下一条消息的位移值,目前是无消息的

所以高水位的值不会大于LEO,同时Leader副本的高水位就是分区的高水位。

高水位更新

在这里插入图片描述

  • Leader副本所在的Broker上,还存在其他Follower副本的LEO值
  • Kafka 副本机制在运行中,更新 Broker 1 上 Follower 副本的高水位和 LEO 值,同时也更新 Broker 0 上 Leader 副本的高水位和 LEO 以及所有远程副本的 LEO,但它不会更新远程副本的高水位值
  • Broker0 上保存的Follower副本又称为远程副本,帮助Leader副本确定其高水位

在这里插入图片描述
与 Leader 副本保持同步的两个条件:

  • 该远程 Follower 副本在 ISR 中
  • 该远程 Follower 副本 LEO 值落后于 Leader 副本 LEO 值的时间,不超过 Broker 端参
    数 replica.lag.time.max.ms (默认10s)

Kafka 只判断第 1 个条件的话, 就可能出现某些副本具备了“进入 ISR”的资格,但却尚未进入到 ISR 中的情况。此时,分 区高水位值就可能超过 ISR 中副本 LEO,而高水位 > LEO 的情形是不被允许的。

分别从 Leader 副本和 Follower 副本两个维度,来总结一下高水位和 LEO 的更 新机制。

Leader 副本

处理生产者请求的逻辑如下:

  • 写入消息到本地磁盘。
  • 更新分区高水位值。
    • 获取 Leader 副本所在 Broker 端保存的所有远程副本 LEO 值{LEO-1,LEO-2, …,LEO-n}。
    • 获取 Leader 副本高水位值:currentHW。
    • 更新 currentHW = min(currentHW, LEO-1,LEO-2,…,LEO-n)。

处理 Follower 副本拉取消息的逻辑如下:

  • 读取磁盘(或页缓存)中的消息数据
  • 使用 Follower 副本发送请求中的位移值更新远程副本 LEO 值
  • 更新分区高水位值(具体步骤与处理生产者请求的步骤相同)
Follower 副本

从 Leader 拉取消息的处理逻辑如下:

  • 写入消息到本地磁盘。
  • 更新 LEO 值。
  • 更新高水位值。
    • 获取 Leader 发送的高水位值:currentHW
    • 获取步骤 2 中更新过的 LEO 值:currentLEO
    • 更新高水位为 min(currentHW, currentLEO)
Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐