持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
在高水位 HW
机制下,Leader
切换时候会发生哪些问题?
会有两个主要问题:
Leader
切换时发生数据丢失问题Leader
切换时发生数据不一致问题
为什么会有这两个问题?
因为
Leader
副本高水位更新和Follower
副本高水位更新在时间上是存在错配的。
图解 Leader
切换时发生数据丢失问题
此问题发生概率极低。
问题重现流程主要是:
# 副本有 2 个,1 个 leader 和 1 个 follower
replication-factor = 2
# 最小同步数为1,1个副本写入数据就认为写入成功
min.insync.replicas = 1
复制代码
Leader
给Follower
同步数据Follower
宕机了,又重启了Leader
宕机了,Follower
被选举成Leader
问题重现详细流程:
- 假设一开始:
Leader
的LEO = 1, HW = 0
,Follower
的LEO = 0, HW = 0
- 请求拉取消息(1):
Follower
发送fetch
请求,Follower
写入数据,Leader
的LEO = 1, HW = 0
,Follower
的LEO = 1, HW = 0
- 请求拉取消息(2):
Follower
发送fetch
请求,Leader
的LEO = 1, HW = 1
,Follower
的LEO = 1, HW = 0
,这时候Follower
的HW = 1
还没更新。这时候,Follower
宕机了。
- **截断1:**这时,
Follower
宕机后重启了,Follower
的LEO
会根据HW
自动调整为 0,并把那条数据从日志文件中删除。
- 这时,
Leader
宕机了
Follower
被选举为Leader
,副本A 重启了
-
**截断2:**之后根据
Leader
(副本B)来同步数据副本A 需要执行相同的日志截断操作,即将高水位调整为与 B 相同的值。
综上就造成了数据丢失。