《深入理解Kafka:核心设计与实现原理》是基于2.0.0版本的书
在这本书中,终于看懂了笔者之前提过的几个问题
准备知识
1、leader里存着4个数据:leader_LEO、leader_HW、remote_LEO集合、remote_HW集合
2、follower里只保存自身的:follower_LEO、follower_HW
HW和LEO更新过程
假设:
1个leader 和 2个follower
此时:leader_LEO = 5、leader_HW = 0、所有 follower 的 follower_LEO = 0、follower_HW = 0
同步开始
1、follower向leader发送fetch请求,来拉取消息,这个fetch请求会带上各自的follower_LEO
(先省略leader处理fetch请求的过程)
2、leader接收fetch请求后,处理并返回,这个fetch请求的响应会带上 leader_HW
3、follower拿到了fetch请求的response,同步消息数据,更新自己的 follower_LEO
(假设此时 这2个 follower_HW 分别为3和4)
4、接下来计算一下 follower_HW 并更新
公式:follower_HW = min(leader_HW,follower_LEO)
所以 两个follower此时的 follower_HW 都是 min(0,0) = 0
5、follower再次发送fetch请求,并带上各自的 follower_LEO
6、leader处理fetch请求过程如下
把这2个 follower_LEO 加上自己的 leader_LEO,取最小值作为新的 leader_HW
公式:leader_HW = min(leader_LEO,RemoteIsrLEO)
(RemoteIsrLEO:ISR中的所有follower的follower_LEO)
leader_HW = min(l5,3,4) = 3
7、leader_HW = 3 被 fetch请求的response带上,返回
8、2个follower收到response后,依然是,同步消息数据,更新 follower_LEO,更新 follower_HW
(假设此时 这2个 follower_HW 分别更新至 6和8)
follower_HW1 = min(3,6) = 3
follower_HW2 = min(3