3. Leader 与 Follower 角色:Leader 负责读写、Follower 负责备份、ISR 集合、AR 集合

在 Kafka 分区副本模型中,Leader 和 Follower 是两种核心角色,它们共同决定了消息的读写路径、数据冗余与一致性边界。理解这两个角色的职责划分,以及 ISR(In-Sync Replicas) 与 AR(Assigned Replicas) 集合的运作机制,是掌握 Kafka 读写分离架构的基础。

3.1 角色职责与读写分离模型

每个分区(Partition)在创建时会被分配多个副本(Replica),这些副本分布在不同的 Broker 上。副本之间通过 Leader-Follower 模型实现读写分离:

  • Leader:负责处理所有客户端的读写请求。每个分区有且仅有一个 Leader。
  • Follower:只负责从 Leader 拉取消息数据,进行被动备份。Follower 不对外提供读写服务。
核心原则: 读写分离的边界在于——Leader 是唯一的数据入口与出口,Follower 仅作为冗余副本存在。这种设计简化了一致性模型,避免了分布式读写冲突。

下图展示了 Leader 与 Follower 之间的数据流与角色边界:

Leader 与 Follower 角色边界与数据流 Producer Consumer Leader 读写入口 写入消息 拉取消息 Follower 1 只备份 Follower 2 只备份 Follower 3 只备份 拉取同步(Fetch) 说明: Follower 只从 Leader 拉取数据,不处理客户端请求。Leader 负责维护与所有 Follower 的同步状态。 当 Leader 宕机时,Controller 从 ISR 集合中选举新的 Leader。

3.2 ISR 集合:同步副本集合

ISR(In-Sync Replicas) 是指与 Leader 保持同步的副本集合。只有处于 ISR 中的 Follower 才有资格在 Leader 故障时被选举为新的 Leader。ISR 是 Kafka 保证数据一致性的关键机制。

属性 说明
定义 与 Leader 保持同步的副本列表,包含 Leader 自身
判定标准 Follower 在 replica.lag.time.max.ms 内成功拉取并确认了 Leader 的最新消息
默认超时 30 秒(可通过 replica.lag.time.max.ms 配置)
作用 决定 Leader 选举的候选池;控制消息的“已提交”状态
动态性 Follower 同步滞后时被踢出 ISR;追上后重新加入
实践要点: ISR 的大小直接影响可用性与一致性。ISR 越大,数据冗余度越高,但 Leader 需要等待更多副本确认才能提交消息(取决于 min.insync.replicas 配置)。生产环境建议将 min.insync.replicas 设置为 2,配合副本因子 3,在性能和可靠性之间取得平衡。

3.3 AR 集合:全部分配副本集合

AR(Assigned Replicas) 是指分区创建时分配的所有副本的集合,包括 Leader 和所有 Follower,无论它们当前是否处于同步状态。AR 是静态的,而 ISR 是动态的。

  • AR = ISR + OSR(Out-of-Sync Replicas)
  • OSR:同步滞后的副本,即被踢出 ISR 的 Follower。
  • AR 在分区创建时确定,除非执行副本重分配(Reassignment),否则不会改变。
关键区别: AR 是“计划分配”的副本全集,ISR 是“当前可用且同步”的副本子集。Leader 选举只能在 ISR 中进行,不能选举 OSR 中的副本。

3.4 ISR 与 AR 的关系对比

对比维度 ISR(In-Sync Replicas) AR(Assigned Replicas)
集合范围 AR 的子集 全部分配副本
动态性 动态变化(加入/踢出) 静态(除非重分配)
包含 Leader 是 是
包含滞后副本 否 是(OSR)
选举资格 有 仅 ISR 中的副本有资格
配置影响 replica.lag.time.max.ms replication.factor

下图展示了 AR、ISR 与 OSR 之间的包含关系:

AR、ISR、OSR 集合关系 AR(Assigned Replicas) ISR(In-Sync Replicas) Leader F1 F2 OSR1 OSR2 AR = ISR ∪ OSR;Leader 始终在 ISR 中;OSR 中的副本无选举资格

3.5 Leader 选举与 ISR 的联动

当 Leader 发生故障时,Kafka Controller 会从当前分区的 ISR 集合中选举一个新的 Leader。选举过程遵循以下规则:

  1. 优先从 ISR 中选举:ISR 中的副本拥有与旧 Leader 完全一致的数据,不会丢失消息。
  2. ISR 为空时的处理:如果 ISR 为空(所有副本都滞后或宕机),Kafka 会从 OSR 中选举一个副本作为 Leader,但此时可能发生数据丢失。
  3. unclean.leader.election.enable:该配置控制是否允许在 ISR 为空时从 OSR 选举 Leader。默认 false,建议生产环境保持关闭以避免数据不一致。
风险提示: 启用 unclean.leader.election.enable=true 虽然能提高可用性,但会导致已提交消息的丢失。在金融、交易等强一致性场景中,必须设置为 false,宁可服务不可用也不丢失数据。

3.6 副本同步与滞后判定

Follower 通过向 Leader 发送 Fetch 请求来拉取消息。Leader 会跟踪每个 Follower 的同步进度,判定其是否属于 ISR:

指标 说明 默认值
replica.lag.time.max.ms Follower 未发送 Fetch 请求的最大时间,超过则被踢出 ISR 30000(30 秒)
replica.lag.max.messages (旧版本)Follower 落后 Leader 的最大消息数,已废弃 4000
LEO(Log End Offset) 每个副本的最后一条消息偏移量 动态
HW(High Watermark) ISR 中所有副本都确认写入的偏移量,消费者只能读取 HW 之前的消息 动态
同步判定逻辑: 只要 Follower 在 replica.lag.time.max.ms 内至少发送了一次 Fetch 请求,并且请求中携带的 LEO 与 Leader 的 LEO 差距在可接受范围内,该 Follower 就保持在 ISR 中。Kafka 2.0+ 版本已移除基于消息数量的滞后判定,仅使用时间维度。

3.7 生产配置建议

  • 副本因子(replication.factor):建议设置为 3,保证在 1 个 Broker 宕机时仍有完整副本。
  • min.insync.replicas:建议设置为 2,配合副本因子 3,确保至少 2 个副本确认写入后才返回成功。
  • unclean.leader.election.enable:强一致性场景设为 false;高可用优先场景可设为 true,但需接受数据丢失风险。
  • replica.lag.time.max.ms:根据网络延迟和负载调整,默认 30 秒通常足够,短时间网络抖动不会导致频繁踢出 ISR。