经过上次 Kafka 日志集群某节点重启失败导致某个主题分区不可用的事故之后,这篇文章专门对分区不可用进行故障重现,并给出我的一些骚操作来尽量减少数据的丢失。
故障重现
下面我用一个例子重现现分区不可用且 leader 副本被损坏的例子:
- 使用 unclean.leader.election.enable = false 参数启动 broker0;
- 使用 unclean.leader.election.enable = false 参数启动 broker1;
- 创建 topic-1,partition=1,replica-factor=2;
- 将消息写入 topic-1;
- 此时,两个 broker 上的副本都处于 ISR 中,broker0 的副本为 leader 副本;
- 停止 broker1,此时 topic-1 的 leader 依然时 broker0 的副本,而 broker1 的副本从 ISR 中剔除;
- 停止 broker0,并且删除 broker0 上的日志数据;
- 重启 broker1,topic-1 尝试连接 leader 副本,但此时 broker0 已经停止运行,此时分区处于不可用状态,无法写入消息;
- 恢复 broker0,broker0 上的副本恢复 leader 职位,此时 broker1 尝试加入 ISR,但此时由于 leader 的数据被清除,即偏移量为 0,此时 broker1 的副本需要截断日志,保持偏移量不大于 leader 副本,此时分区的数据全部