文章目录

  • 高水位是什么
  • 高水位的作用
  • 高水位更新
  • Leader 副本
  • Follower 副本


高水位是什么

水位是一个单调增加且表征最早未完成工作的时间戳

kafka 高水位线 kafka水位机制_时间戳

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

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

高水位的作用

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

kafka 高水位线 kafka水位机制_kafka 高水位线_02

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

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

高水位更新

kafka 高水位线 kafka水位机制_时间戳_03

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

kafka 高水位线 kafka水位机制_时间戳_04


与 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)