文章目录
- 高水位是什么
- 高水位的作用
- 高水位更新
- Leader 副本
- Follower 副本
高水位是什么
水位是一个单调增加且表征最早未完成工作的时间戳
- 蓝色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)