Kafka64 条

副本与 ISR 机制

每个分区有一个 Leader 和若干 Follower:Follower 持续从 Leader 拉取并追赶,跟得上的副本构成 ISR(In-Sync Replicas);Leader 故障时优先从 ISR 中选举新 Leader。

副本与 ISR 是什么

Kafka 每个分区都有一个 Leader 副本和若干 Follower 副本,分布在不同的 Broker 上。Follower 持续从 Leader 拉取数据并追赶,那些跟得上、延迟在阈值内的副本构成 ISR(In-Sync Replicas,同步副本集合)。Leader 故障时,新的 Leader 优先从 ISR 中选出。

ISR 收缩意味着什么

某个副本落后太久(超过 replica.lag.time.max.ms)会被移出 ISR,这是保护机制:避免选举出一个数据明显缺失的副本。但如果 ISR 持续收缩或反复抖动,说明 Broker 磁盘 IO、网络或 GC 有瓶颈,需要处理根因,而不是简单重启。

角色对照

角色含义关注点
Leader处理客户端读写请求的副本为 -1 或 none 表示分区不可用
Follower持续拉取 Leader 数据,保持同步落后原因通常是磁盘或网络
ISR与 Leader 保持同步的副本集合短于副本数说明有副本掉队
AR分区的全部副本集合(Assigned Replicas)数量等于创建时设定的副本因子

基本信息

Leader 选举默认从 ISR 中选,保证新 Leader 不会丢数据
ISR 超时replica.lag.time.max.ms 决定多久未同步被移出(较新版本默认 30 秒)
最小同步副本min.insync.replicas 与 acks=all 配合控制写入可用性
非同步选举unclean.leader.election.enable 默认关闭,开启会在副本不足时牺牲数据
观察视角describe 输出的 Isr 与 Replicas 差异

典型使用场景

  • 巡检副本健康:统计 under-replicated 分区数量,观察是否长期不为零
  • Broker 重启与扩容后:跟踪 ISR 是否逐步恢复完整
  • 写入报错排查:ISR 不足导致 acks=all 无法满足时,写入会直接失败
  • 容量评估:副本因子直接放大磁盘与网络占用,规划时不能只算单副本
  • 机架感知配置:确保同一分区的副本分散在不同机架,避免单点故障

观察副本与 ISR

观察副本与 ISR
# 查看分区的 Leader、副本与 ISR
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic orders
# Partition: 0  Leader: 2  Replicas: 2,3,1  Isr: 2,1   ← 3 号副本暂未同步

# 集群级:所有存在副本掉队的分区
kafka-topics.sh --bootstrap-server localhost:9092 --describe --under-replicated-partitions

# 统计掉队分区数量,适合做巡检基线
kafka-topics.sh --bootstrap-server localhost:9092 --describe --under-replicated-partitions | grep -c 'Partition:'

相关 Broker 参数

相关 Broker 参数
# 副本多久未同步会被移出 ISR(较新版本默认 30000 毫秒)
replica.lag.time.max.ms=30000

# 是否允许非同步副本当选 Leader:默认 false,开启后副本不足时会丢数据
unclean.leader.election.enable=false

# 副本拉取线程数与单次拉取大小,节点磁盘与网络越强可适当调大
num.replica.fetchers=4
replica.fetch.max.bytes=1048576
副本落后期间若 Leader 宕机,只有 ISR 内的副本能参选,未同步的那部分数据可能丢失;这正是「acks=all 加副本 3」组合存在的原因——用冗余换掉这段风险窗口。
unclean.leader.election.enable 打开后,当 ISR 为空时允许落后的副本当选 Leader,集群能重新写入,但会丢失尚未同步的数据。对账务类数据应保持默认关闭,宁可暂时不可用。

易错点

  • ISR 持续收缩却只重启 Broker:根因多为磁盘 IO 或网络瓶颈,重启只能暂时掩盖
  • 副本因子为 1 的生产主题:任何单点故障都可能直接丢数据或使分区不可用
  • 为了可用性打开 unclean 选举:副本全部落后时会让数据缺失的副本成为 Leader,造成静默丢数
  • 只按单副本容量做磁盘规划,忽略副本数放大与 ISR 追赶期间的额外写入放大

数据来源与参考

  • Apache Kafka 官方文档:Replication
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌