Kafka 的 ISR(In-Sync Replicas)机制 是 Kafka 实现高可用性和数据一致性的核心设计之一。以下是其具体工作原理的详细解析:
1. ISR 的基本概念
- ISR(In-Sync Replicas):指与 Leader 副本保持同步的副本集合。这些副本的数据与 Leader 一致,且能够响应客户端请求。
- AR(Assigned Replicas):分区的所有副本集合(包括 Leader 和 Follower),即
AR = ISR + OSR。 - OSR(Out-of-Sync Replicas):未与 Leader 同步的副本集合,例如因网络延迟或故障导致数据落后的副本。
2. ISR 的工作流程
(1) 数据同步
- 生产者写入数据:
- 消息首先写入 Leader 副本 的日志文件(
.log)。 - Leader 将消息复制到所有 Follower 副本(通过
AppendRequest请求)。
- 消息首先写入 Leader 副本 的日志文件(
- Follower 同步数据:
- Follower 定期向 Leader 发送 Fetch 请求,拉取未同步的消息。
- Follower 将消息写入本地日志,并更新自身的 LEO(Log End Offset)(当前日志末端偏移量)。
- Follower 向 Leader 发送 ACK 确认,表示已成功同步消息。
(2) ISR 的动态维护
- 同步条件:
- Follower 的 LEO 与 Leader 的 LEO 差距不能超过阈值(由
replica.lag.time.max.ms和replica.fetch.wait.max.ms控制)。 - Follower 必须在规定时间内(
replica.lag.time.max.ms)向 Leader 发送 Fetch 请求。
- Follower 的 LEO 与 Leader 的 LEO 差距不能超过阈值(由
- ISR 调整规则:
- 加入 ISR:新副本启动后,会先加入 OSR,并开始追赶 Leader 的数据。当同步进度达到要求时,会被移入 ISR。
- 移出 ISR:
- 如果 Follower 在
replica.lag.time.max.ms时间内未发送 Fetch 请求(超时)。 - 或者 Follower 的 LEO 落后 Leader 的 LEO 超过允许范围(旧版本 Kafka 使用
replica.lag.max.messages,但此参数已被废弃)。
- 如果 Follower 在
- 重新加入 ISR:当被移出 ISR 的副本恢复同步后,会重新加入 ISR。
(3) 高水位(HW)与数据提交
- HW(High Watermark):表示消费者可以读取的最大偏移量。只有当 ISR 中所有副本的日志都包含某条消息时,该消息的偏移量才会被纳入 HW。
- 数据提交逻辑:
- Leader 会等待 ISR 中所有副本确认消息写入后,才将 HW 右移,标记消息为“已提交”。
- 生产者通过
acks=all配置,确保消息被所有 ISR 副本确认后才视为成功。
3. Leader 故障与选举
(1) Leader 失效检测
- 监控机制:
- ZooKeeper/KRaft 监控 Broker 状态。如果 Leader 所在 Broker 宕机,或 Follower 未在
replica.lag.time.max.ms内发送 Fetch 请求,Leader 被判定失效。
- ZooKeeper/KRaft 监控 Broker 状态。如果 Leader 所在 Broker 宕机,或 Follower 未在
- ISR 作用:
- 只有 ISR 中的副本有资格参与新 Leader 选举,确保新 Leader 拥有最新的已提交数据。
(2) 新 Leader 选举
- 选举规则:
- 优先从 ISR 中选举:选择 ISR 中 LEO 最大的副本作为新 Leader(数据最完整)。
- 若 ISR 为空:若
unclean.leader.election.enable=true,则从 OSR 中选择 LEO 最大的副本作为新 Leader(可能丢失数据)。
- 选举流程:
- Controller 触发:集群中的 Controller 负责协调选举。
- 元数据更新:新 Leader 的信息写入 ZooKeeper/KRaft 日志,所有 Broker 更新分区元数据。
- 同步恢复:原 Leader(若恢复)作为 Follower 从新 Leader 拉取数据,重新加入 ISR。
4. 关键配置参数
| 参数 | 作用 | 默认值 |
|---|---|---|
replica.lag.time.max.ms | Follower 落后 Leader 的最大时间,超过此值会被移出 ISR | 10000(10秒) |
min.insync.replicas | 分区必须在 ISR 中的最小副本数,用于生产者的 acks=all 时 | 1 |
unclean.leader.election.enable | 是否允许非 ISR 副本成为 Leader | false(默认不允许) |
replica.fetch.wait.max.ms | Follower 拉取数据的最大等待时间 | 500(毫秒) |
5. 示例场景
场景 1:正常同步
- 分区副本:Leader(Broker 0)、Follower 1(Broker 1)、Follower 2(Broker 2)。
- Producer 设置
acks=all,消息写入 Leader 后同步到 Follower 1 和 2。 - ISR 包含所有副本,HW 正确右移,数据可靠。
场景 2:Follower 落后
- Broker 1 因网络延迟,Fetch 请求超时,被移出 ISR。
- ISR 剩下 Broker 0 和 2。Producer 设置
min.insync.replicas=2,此时写入失败(未满足最小同步副本数)。 - Broker 1 恢复后,重新同步数据并加入 ISR。
场景 3:Leader 故障
- Broker 0 宕机,Controller 从 ISR(Broker 1 和 2)中选择 LEO 最大的副本(假设为 Broker 1)作为新 Leader。
- 消费者自动切换到新 Leader,数据一致性得到保证。
6. ISR 机制的核心优势
- 数据可靠性:
- 通过
acks=all和min.insync.replicas确保消息被多个副本确认。 - 只有 ISR 中的副本参与选举,避免数据丢失。
- 通过
- 高可用性:
- Leader 失效时快速选举新 Leader(秒级切换)。
- 动态维护 ISR 列表,适应副本状态变化。
- 性能与一致性平衡:
- 顺序写入和 PageCache 提升性能,ISR 机制保障一致性。
- 通过配置参数(如
unclean.leader.election.enable)灵活权衡可用性与数据安全性。
总结
Kafka 的 ISR 机制通过 动态维护同步副本集合,结合 ACK 确认机制 和 Leader 选举策略,在保证数据可靠性的同时实现高可用性。其核心流程包括:
- 数据同步:Leader 将消息复制到 Follower,Follower 定期发送 Fetch 请求。
- ISR 动态调整:根据 Follower 的同步状态,动态添加或移除副本。
- 故障转移:Leader 失效时,从 ISR 中选举新 Leader,确保数据一致性。
合理配置 ISR 相关参数(如 replica.lag.time.max.ms 和 min.insync.replicas)可以进一步优化 Kafka 集群的可靠性和性能。
864

被折叠的 条评论
为什么被折叠?



