【Kafka】图解 Leader 切换时发生数据丢失问题

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

在高水位 HW 机制下,Leader 切换时候会发生哪些问题?

会有两个主要问题:

  1. Leader 切换时发生数据丢失问题
  2. Leader 切换时发生数据不一致问题

为什么会有这两个问题?

因为 Leader 副本高水位更新和 Follower 副本高水位更新在时间上是存在错配的。


图解 Leader 切换时发生数据丢失问题

此问题发生概率极低。

问题重现流程主要是:

# 副本有 2 个,1 个 leader 和 1 个 follower
replication-factor = 2

# 最小同步数为1,1个副本写入数据就认为写入成功
min.insync.replicas = 1
复制代码
  1. LeaderFollower 同步数据
  2. Follower 宕机了,又重启了
  3. Leader宕机了,Follower 被选举成 Leader

问题重现详细流程:

  1. 假设一开始:LeaderLEO = 1, HW = 0FollowerLEO = 0, HW = 0

2022-06-0614-47-01.png

  1. 请求拉取消息(1):Follower 发送 fetch 请求,Follower 写入数据,LeaderLEO = 1, HW = 0FollowerLEO = 1, HW = 0

2022-06-0614-57-53.png

  1. 请求拉取消息(2):Follower 发送 fetch 请求,LeaderLEO = 1, HW = 1FollowerLEO = 1, HW = 0,这时候 FollowerHW = 1 还没更新。这时候,Follower 宕机了。

2022-06-0615-26-22.png

  1. **截断1:**这时,Follower 宕机后重启了,FollowerLEO 会根据 HW 自动调整为 0,并把那条数据从日志文件中删除。

2022-06-0615-37-23.png

  1. 这时,Leader 宕机了

2022-06-0615-41-37.png

  1. Follower 被选举为 Leader ,副本A 重启了

2022-06-0615-44-11.png

  1. **截断2:**之后根据 Leader (副本B)来同步数据

    副本A 需要执行相同的日志截断操作,即将高水位调整为与 B 相同的值。

2022-06-0615-47-43.png

综上就造成了数据丢失。

猜你喜欢

转载自juejin.im/post/7106834360208195598
今日推荐