跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Kafka ISR与AR深度解析:副本同步机制核心概念

Kafka 的 ISR(In-Sync Replicas)和 AR(Assigned Replicas)是副本同步机制的核心。AR 包含分区所有副本,ISR 仅包含与 Leader 同步的副本。ISR 用于 Leader 选举和数据一致性保证。通过 replica.lag.time.max.ms 判定同步状态,min.insync.replicas 控制写入可靠性。当 ISR 为空时,unclean leader election 可能导致数据丢失。理解这些概念对保障 Kafka 高可用至关重要。

RefactorPro发布于 2026/4/6更新于 2026/7/2164 浏览
Kafka ISR与AR深度解析:副本同步机制核心概念

Kafka ISR与AR深度解析:副本同步机制核心概念

在 Kafka 的分布式架构中,副本机制是保证高可用和数据一致性的基石。而 ISR(In-Sync Replicas)和 AR(Assigned Replicas)则是理解副本同步机制的两个核心概念。

一、核心概念定义

1.1 AR:分区的所有副本

AR(Assigned Replicas):一个分区分配的所有副本集合,包括 Leader 和所有 Follower。

角色说明
Leader负责读写
Follower同步数据
ARLeader + 所有 Follower

1.2 ISR:与 Leader 保持同步的副本

ISR(In-Sync Replicas):与 Leader 保持同步的 Follower 集合,包括 Leader 自身。只有 ISR 中的副本才有资格被选举为新的 Leader。

状态说明
ISR副本 0,1,2,3 (与 Leader 同步)
AR副本 0,1,2,3,4 (分配的所有副本)
OSR副本 4 (同步落后,不在 ISR 中)

1.3 官方定义

概念全称定义包含
ARAssigned Replicas分区分配的所有副本Leader + 所有 Follower
ISRIn-Sync Replicas与 Leader 保持同步的副本Leader + 同步的 Follower

二、ISR 的判定标准

2.1 同步的判断条件

// Kafka 源码中的判断逻辑(概念性)
class ReplicaManager {
    def isInSync(replica: Replica): Boolean = {
        // 1. 必须是 Follower(或 Leader)
        // 2. 必须与 Leader 保持同步
        // 主要判断依据:
        // - Follower 的 LEO(Log End Offset)要接近 Leader 的 LEO
        // - Follower 的拉取请求要及时
        // - 在 replica.lag.time.max.ms 时间内有拉取请求
           config.replicaLagTimeMaxMs
           replica.lastCaughtUpTimeMs
           time.milliseconds()
        
        (currentTimeMs - lastCaughtUpTimeMs) <= maxLagMs
    }
}
val
maxLagMs
=
val
lastCaughtUpTimeMs
=
val
currentTimeMs
=
// 如果最后一次追上 Leader 的时间在允许范围内

2.2 关键参数

# Kafka Broker 配置
# 1. 副本落后最大时间阈值
replica.lag.time.max.ms=30000
# 默认 30 秒
# 如果 Follower 超过 30 秒没有拉取消息,就会被踢出 ISR

# 2. 最小同步副本数
min.insync.replicas=2
# Topic 级别或 Broker 级别配置
# 生产者在 acks=all 时需要 ISR 中至少有这么多个副本

2.3 ISR 的动态变化

正常状态:
Leader: 0
ISR: [0,1,2,3,4]

Follower 变慢/网络延迟/GC/负载高:
Follower 4 同步落后
超过阈值 (replica.lag.time.max.ms)
从 ISR 中移除

ISR: [0,1,2,3]
Follower 4 (非 ISR)

Follower 恢复:
重新开始同步
追上 Leader 的 offset
重新加入 ISR

ISR: [0,1,2,3,4]

三、ISR 的核心作用

3.1 作用一:Leader 选举的选民池

Kafka Leader 选举流程优先从 ISR 中选择。

故障发生:Leader 0 不可用
Controller 检测到 Leader 故障
开始选举
检查 ISR 列表:当前 ISR: [1,2,3]

候选人对比:
Follower 1 ✅ ISR 中 数据最新
Follower 2 ✅ ISR 中 数据最新
Follower 3 ✅ ISR 中 数据最新
Follower 4 ❌ 不在 ISR 数据落后

选举规则:
• 优先从 ISR 中选择
• ISR 中所有副本数据一致
• 保证数据不丢失

特殊情况:
• ISR 为空时启用脏选举
• 可能丢失数据
• 配合 unclean.leader.election

为什么只能用 ISR 选举?

  • ISR 中的副本数据与 Leader 基本一致
  • 选它们做 Leader 不会丢失数据
  • 不在 ISR 中的副本数据落后,当选会导致数据丢失

3.2 作用二:消息确认的基准

// Producer 的 acks 参数
Properties props = new Properties();
// acks=0:不等待确认
props.put("acks", "0");
// 可能丢数据,性能最高

// acks=1:Leader 确认即可
props.put("acks", "1");
// Leader 写入成功就返回

// acks=all:ISR 全部确认
props.put("acks", "all");
// 最安全,性能最低
// 或 acks=-1(等同于 all)

acks=all 的工作原理: Producer 发送消息 -> Leader 写入本地 -> 同步给 ISR 中的 Follower -> 所有 ISR 确认 -> 返回成功。 若 min.insync.replicas=2,则 2 个 ISR 确认就够了。

3.3 作用三:保证数据一致性

// 结合 min.insync.replicas 保证最小同步数
// Topic 配置
bin/kafka-topics.sh --bootstrap-server localhost:9092 --alter --topic my-topic --config min.insync.replicas=2

// Producer 配置
props.put("acks", "all");
// 要求所有 ISR 确认
// 当 ISR 数量小于 min.insync.replicas 时
// 比如:副本数=3,ISR=[0,1](2 个),min.insync.replicas=2 ✅ 可用
// 如果 ISR=[0](1 个),min.insync.replicas=2 ❌ 不可用,Producer 会收到异常

四、AR 与 ISR 的关系图解

4.1 集合关系图

AR: 所有副本
├── Leader
├── Follower 1
├── Follower 2
└── Follower 3 (同步落后)

ISR: 同步副本集合
├── Leader
├── Follower 1
└── Follower 2

4.2 公式表示

AR = {Leader, Follower1, Follower2, Follower3, ...}
ISR = {Leader, Follower_i, Follower_j, ...} 其中 Follower 满足同步条件
OSR = AR - ISR # Out-of-Sync Replicas,同步落后的副本
AR = ISR ∪ OSR
ISR ∩ OSR = ∅

4.3 动态变化示例

# 查看副本状态
bin/kafka-topics.sh \
  --bootstrap-server localhost:9092 \
  --describe \
  --topic my-topic

# 输出示例
# Topic: my-topic Partition: 0 Leader: 0 Replicas: 0,1,2,3,4 Isr: 0,1,2,3
# AR: [0,1,2,3,4]
# ISR: [0,1,2,3]
# OSR: [4]

五、ISR 相关的关键配置

5.1 Broker 级别配置

# server.properties
# Follower 落后多长时间被踢出 ISR(默认 30 秒)
replica.lag.time.max.ms=30000

# 是否允许不在 ISR 中的副本被选举为 Leader
# 如果设为 true,可能会丢数据;设为 false,提高数据一致性
unclean.leader.election.enable=false

# 最小同步副本数(也可在 Topic 级别设置)
min.insync.replicas=1

5.2 Topic 级别配置

# 创建 Topic 时设置
bin/kafka-topics.sh \
  --bootstrap-server localhost:9092 \
  --create \
  --topic my-topic \
  --partitions 3 \
  --replication-factor 3 \
  --config min.insync.replicas=2

# 修改现有 Topic
bin/kafka-topics.sh \
  --bootstrap-server localhost:9092 \
  --alter \
  --topic my-topic \
  --config min.insync.replicas=2

5.3 Producer 级别配置

// Producer 配置影响 ISR 的使用
Properties props = new Properties();

// 一致性要求高的场景
props.put("acks", "all"); // 等待所有 ISR 确认
props.put("retries", 3); // 重试次数
props.put("max.in.flight.requests.per.connection", 1); // 保证顺序

// 性能优先的场景
props.put("acks", "1"); // Leader 确认即可
props.put("retries", 0); // 不重试

六、ISR 的实际应用场景

6.1 场景一:Leader 选举

// 当 Leader 宕机时,Kafka 的选举逻辑
public class LeaderElection {
    public void electNewLeader(Partition partition) {
        // 1. 获取当前 ISR 列表
        List<Replica> isr = partition.getInSyncReplicas();
        // 2. 优先从 ISR 中选举
        if (!isr.isEmpty()) {
            // 选择 ISR 中的第一个作为新 Leader
            Replica newLeader = isr.get(0);
            partition.setLeader(newLeader);
        } else {
            // 如果 ISR 为空,根据配置决定
            if (uncleanLeaderElectionEnabled) {
                // 允许从 OSR 中选举(可能丢数据)
                Replica newLeader = chooseFromOSR();
                partition.setLeader(newLeader);
            } else {
                // 不可用
                throw new NoReplicaAvailableException();
            }
        }
    }
}

6.2 场景二:生产者的可靠性保证

// 需要高可靠性的生产者配置
public class ReliableProducer {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("acks", "all");
        props.put("retries", Integer.MAX_VALUE);
        props.put("max.in.flight.requests.per.connection", 1);
        props.put("enable.idempotence", "true"); // 开启幂等性

        // 还需要 Topic 配置 min.insync.replicas=2
        KafkaProducer<String, String> producer = new KafkaProducer<>(props);

        // 发送消息
        producer.send(new ProducerRecord<>("my-topic", "key", "value"), (metadata, exception) -> {
            if (exception != null) {
                // 如果 ISR 不足,会收到 NotEnoughReplicasException
                handleException(exception);
            }
        });
    }
}

6.3 场景三:监控 ISR 变化

# 监控 ISR 收缩和扩张
bin/kafka-topics.sh \
  --bootstrap-server localhost:9092 \
  --describe \
  --topic my-topic \
  --under-replicated-partitions

# 查看所有未完全同步的分区
bin/kafka-topics.sh \
  --bootstrap-server localhost:9092 \
  --describe \
  --under-replicated-partitions

七、面试高频问题

Q1:ISR 和 AR 分别代表什么?

答:

  • AR:分区的所有副本集合(包括 Leader 和所有 Follower)
  • ISR:与 Leader 保持同步的副本集合(包括 Leader 和同步的 Follower)

Q2:副本被踢出 ISR 的条件是什么?

答:Follower 超过 replica.lag.time.max.ms(默认 30 秒)没有向 Leader 拉取消息,就会被踢出 ISR。这表示该 Follower 已经落后太多,不能保证数据一致性。

Q3:为什么 Leader 选举只能从 ISR 中选?

答:因为 ISR 中的副本数据与 Leader 基本一致,选它们做 Leader 不会丢失数据。如果从 OSR 中选举,选出的 Leader 可能缺少大量数据,导致数据不一致。

Q4:min.insync.replicas 的作用是什么?

答:当 Producer 设置 acks=all 时,消息必须写入 ISR 中至少 min.insync.replicas 个副本才算成功。这个参数保证了最小的数据冗余度,防止在 ISR 数量不足时仍然写入成功导致数据风险。

Q5:什么是 unclean leader election?有什么风险?

答:当 ISR 为空时,是否允许从 OSR(不同步副本)中选举 Leader。如果允许(unclean.leader.election.enable=true),可能会选出数据落后的副本作为 Leader,导致数据丢失。这是用一致性换可用性。

八、总结

8.1 核心概念关系

root(Kafka 副本集合)
├── AR(所有副本)
│   ├── Leader(读写)
│   └── Follower(同步)
│       ├── ISR(同步副本)-> 数据一致,可被选举
│       └── OSR(落后副本)-> 数据落后,不能选举

8.2 关键公式

AR = ISR ∪ OSR ISR ⊆ AR Leader ∈ ISR

8.3 一句话总结

ISR 是 Kafka 保证数据一致性的核心机制,它圈定了"可用且可靠"的副本集合,是 Leader 选举和数据确认的基准。

目录

  1. Kafka ISR与AR深度解析:副本同步机制核心概念
  2. 一、核心概念定义
  3. 1.1 AR:分区的所有副本
  4. 1.2 ISR:与 Leader 保持同步的副本
  5. 1.3 官方定义
  6. 二、ISR 的判定标准
  7. 2.1 同步的判断条件
  8. 2.2 关键参数
  9. Kafka Broker 配置
  10. 1. 副本落后最大时间阈值
  11. 默认 30 秒
  12. 如果 Follower 超过 30 秒没有拉取消息,就会被踢出 ISR
  13. 2. 最小同步副本数
  14. Topic 级别或 Broker 级别配置
  15. 生产者在 acks=all 时需要 ISR 中至少有这么多个副本
  16. 2.3 ISR 的动态变化
  17. 三、ISR 的核心作用
  18. 3.1 作用一:Leader 选举的选民池
  19. 3.2 作用二:消息确认的基准
  20. 3.3 作用三:保证数据一致性
  21. 四、AR 与 ISR 的关系图解
  22. 4.1 集合关系图
  23. 4.2 公式表示
  24. 4.3 动态变化示例
  25. 查看副本状态
  26. 输出示例
  27. Topic: my-topic Partition: 0 Leader: 0 Replicas: 0,1,2,3,4 Isr: 0,1,2,3
  28. AR: [0,1,2,3,4]
  29. ISR: [0,1,2,3]
  30. OSR: [4]
  31. 五、ISR 相关的关键配置
  32. 5.1 Broker 级别配置
  33. server.properties
  34. Follower 落后多长时间被踢出 ISR(默认 30 秒)
  35. 是否允许不在 ISR 中的副本被选举为 Leader
  36. 如果设为 true,可能会丢数据;设为 false,提高数据一致性
  37. 最小同步副本数(也可在 Topic 级别设置)
  38. 5.2 Topic 级别配置
  39. 创建 Topic 时设置
  40. 修改现有 Topic
  41. 5.3 Producer 级别配置
  42. 六、ISR 的实际应用场景
  43. 6.1 场景一:Leader 选举
  44. 6.2 场景二:生产者的可靠性保证
  45. 6.3 场景三:监控 ISR 变化
  46. 监控 ISR 收缩和扩张
  47. 查看所有未完全同步的分区
  48. 七、面试高频问题
  49. Q1:ISR 和 AR 分别代表什么?
  50. Q2:副本被踢出 ISR 的条件是什么?
  51. Q3:为什么 Leader 选举只能从 ISR 中选?
  52. Q4:min.insync.replicas 的作用是什么?
  53. Q5:什么是 unclean leader election?有什么风险?
  54. 八、总结
  55. 8.1 核心概念关系
  56. 8.2 关键公式
  57. 8.3 一句话总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 产品经理指南:面试百人后的角色认知与转型路径
  • CentOS 6.8 部署 Zabbix 3.2 监控服务完整流程
  • IntelliJ IDEA 项目配置与 Web 部署完全指南
  • 前端虚拟列表实现:优化万级 DOM 渲染性能
  • Java 动态代理原理与实现
  • Arduino BLDC 机器人 IMU 角度读取与 PID 互补滤波控制
  • 夸克网盘精选技术资源与学习资料合集
  • AI 人才薪资飙升:硕士年薪 50 万,博士超 200 万,缺口千万
  • 网络通讯核心协议:TCP、UDP 与 HTTP/HTTPS 详解
  • 2025 开源大模型生态回顾与趋势
  • JDK 安装与环境配置实战指南
  • LLaMA-Factory 微调:如何选择正确的精度类型
  • IntelliJ IDEA 集成 GitHub Copilot 辅助编程指南
  • AgentScope Java 智能体框架入门与进阶
  • 自然语言处理在社交媒体分析中的实战应用
  • FastGPT 集成 MCP 协议构建工具增强型 AI Agent
  • Java 并发工具类:CyclicBarrier 使用详解
  • 钉钉 Webhook 集成与 @ 用户通知实战指南
  • 机器人路径规划:D* Lite算法应对动态障碍物与Python实现
  • CUDA 12.4 内存层次、异构编程与计算能力

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online