1. Kafka 高可用架构中多 Broker/分区/副本、ISR 与 controller 选举如何保障可用性
Kafka 通过多 Broker、分区与副本、ISR 副本集合以及 controller 选举机制共同保障高可用,请说明这些机制各自的职责与配合方式?
- Kafka 分区与副本(replication factor)的基本概念
- ISR(In-Sync Replica)的定义与收缩/恢复条件
- controller 的作用与选举机制
Kafka 将一个 topic 的日志划分为多个分区(partition),每个分区有多个副本(replica),副本分布在不同的 Broker 上,从而在单个 Broker 宕机时仍能提供读写。每个分区有一个 leader 副本负责读写,其余为 follower 副本,follower 从 leader 拉取数据保持同步。ISR 是当前与 leader 保持同步的副本集合,只有 ISR 中的副本才会被选为新的 leader;当 follower 落后超过 replica.lag.time.max.ms 时会被移出 ISR,追平后重新加入。controller 是集群中专门负责管理元数据与分区 leader 选举的 Broker,负责分区副本的分配、leader 选举、ISR 变更等;controller 通过外部存储(ZooKeeper 或 KRaft 的 controller 节点)注册并依赖临时节点/epoch 机制防止脑裂,在 controller 宕机后由其余 Broker 重新竞选产生新的 controller。
高可用不是单一机制,而是"副本冗余 + ISR 保证一致性 + controller 协调元数据"的组合。ISR 决定了数据一致性的边界:ISR 内选举保证不丢已提交数据,ISR 外选举(unclean leader election)则可能丢数据。controller 负责把"谁能成为 leader"这一决策全局唯一化,配合 epoch 防止多个 controller 同时决策导致的分裂。
# 查看 topic 的副本与 ISR 状态
kafka-topics.sh --describe --topic my_topic --bootstrap-server localhost:9092
# 输出中 Partition 行显示了 Leader/Replicas/Isr