持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
在高水位 HW 机制下,Leader 切换时候会发生哪些问题?
会有两个主要问题:
Leader切换时发生数据丢失问题Leader切换时发生数据不一致问题
为什么会有这两个问题?
因为
Leader副本高水位更新和Follower副本高水位更新在时间上是存在错配的。
回顾下 LEO 和 HW:
LEO 作用:
- 负责推算
Leader partition的HW。 - 更新
HW:当所有的follower partition的LEO推送给Leader partition时候,Leader partition根据min{LEO1...LEOn}即可得到Leader的HW
HW 作用:
- 更新
follower的HW:当follower请求leader数据同步时候,leader会返回自己的HW, 然后follower会更新min{Leader(HW),LEO} - 划分已提交和未提交数据:
HW=3,表示前3条数据是已经同步到其他所有的follower里面去了,所以也将其叫做committed(已提交数据),消费者是消费不到HW之后的uncommmitted数据的 - 消费:
Consumer只能看到base offset到HW offset之间的数据,这部分数据是committed,可以被消费。
图解 Leader 切换时发生数据不一致问题
问题重现流程主要是:
# 副本有 2 个,1 个 leader 和 1 个 follower
replication-factor = 2
# 最小同步数为1,1个副本写入数据就认为写入成功
min.insync.replicas = 1
Leader给Follower同步数据Follower宕机了,又重启了Leader宕机了,Follower被选举成Leader- 同步数据
问题重现详细流程:
- 假设一开始:
Leader的LEO = 2, HW = 1,Follower的LEO = 1, HW = 1
- 请求拉取消息:
Follower发送fetch请求,Follower写入数据,Leader的LEO = 2, HW = 1,Follower的LEO = 1, HW = 1,还没同步完成
- 这时,
Leader宕机了后重启,Follower被选举为 新Leader
- 这时,生产者发了一条新数据给 新
Leader,Leader的LEO = 2, HW = 2,Follower的LEO = 2, HW = 2,虽然两者HW = 2,但数据不同。