当 Kafka 的 Leader 崩溃并且 ISR(In-Sync Replicas) 为空时,会出现一个非常严重的情况,因为 Kafka 无法继续从同步副本中选举出新的领导者,导致该分区的数据可能不可用。
ISR 是一组与 Leader 保持同步的副本(Replica),即这些副本的日志已经跟上了 Leader。如果 ISR 为空,说明没有副本能够提供数据的同步副本,也没有副本能够被选举为新的 Leader。
如何解决 Leader 崩溃时 ISR 为空的情况
Kafka 采取以下机制来处理这种情况:
-
分区不可用:
- 当一个分区的 Leader 崩溃,且该分区没有任何同步副本时,Kafka 会将该分区标记为不可用。此时,该分区的消息无法被消费,因为没有副本可供提供数据。
- 如果在 ISR 为空 的情况下,Kafka 无法选举新的 Leader,那么该分区的数据将无法访问,消费者将无法消费该分区的消息,直到分区变为可用。
-
等待副本同步:
- 如果某些副本因为网络延迟或其他原因而暂时无法同步,那么 Kafka 会等待这些副本回到同步状态,并在此期间通过 ISR 的更新来选举新的 Leader。
- 一旦有足够的副本跟上 Leader,Kafka 就会从这些副本中选举一个新的 Leader。如果这些副本有最新的数据,那么分区就会变得可用。
-
Replica 强制选举(min.insync.replicas):
- Kafka 有一个配置参数
min.insync.replicas
,它指定了一个分区在其副本中至少需要有多少个副本是同步的,才能选举新的 Leader。
- 如果该参数被设置为大于 1(默认值为 1),那么 Kafka 会确保只有当有足够数量的副本处于同步状态时,才能继续写入数据。即使 Leader 崩溃并且 ISR 为空,Kafka 也不会允许生产者向该分区写入数据,直到至少有足够数量的副本同步成功。
-
未同步的副本转为 Follower:
- 如果分区的某些副本未能及时同步(例如由于网络延迟等原因),它们将被移出 ISR 列表。Kafka 会尝试尽快将这些副本同步回日志。
- 一旦同步完成,这些副本将重新加入 ISR,Kafka 就可以重新选举 Leader,并恢复数据的正常访问。
-
手动干预:
- 如果自动恢复无法及时恢复数据,可考虑手动干预,执行诸如强制让一个副本作为 Leader 或重新分配分区等操作。
- 可以通过 Kafka 的管理工具或 API 进行手动操作,例如
kafka-leader-election.sh
工具来手动选择新的 Leader。
-
数据丢失风险:
- 如果 Kafka 集群中有一个分区的所有副本都不可用或未同步,并且没有足够的副本来选举新的 Leader(比如副本数量过少),那么该分区的数据可能会丢失。为了降低这种风险,建议每个分区有多个副本,并且
min.insync.replicas
的值大于 1,以确保至少有一个副本是同步的,避免出现单点故障。