Kafka-ISR机制#
一句话答案#
ISR(In-Sync Replicas)是与 Leader 保持同步的副本集合,Kafka 通过 ISR + HW(高水位)机制保证数据一致性:消息只有被 ISR 中所有副本确认后才对消费者可见。
核心要点
ISR 是什么#
Partition 的副本集合:
AR (All Replicas) = ISR + OSR
ISR: 与 Leader 同步的副本(包括 Leader 自己)
OSR: 落后太多被踢出的副本plaintext副本进出 ISR 的条件#
被踢出 ISR: Follower 超过 replica.lag.time.max.ms(默认 30s)没有向 Leader 发送 Fetch 请求。
重新加入 ISR: Follower 追上 Leader 的 LEO。
LEO 和 HW#
| 概念 | 含义 |
|---|---|
| LEO(Log End Offset) | 每个副本的日志末端偏移量 |
| HW(High Watermark) | ISR 中所有副本的最小 LEO |
Leader: [0][1][2][3][4] LEO=5
Follower1: [0][1][2][3] LEO=4
Follower2: [0][1][2] LEO=3
HW = min(5, 4, 3) = 3
消费者只能读到 offset 0~2(HW 之前)plaintextISR 与 acks 的配合#
| acks | 等谁确认 | 安全性 |
|---|---|---|
| 0 | 不等 | 最低 |
| 1 | Leader | 中等 |
| all | ISR 所有副本 | 最高 |
陷阱: acks=all 只等 ISR 中的副本。ISR 只有 Leader → 等于 acks=1。
解决: min.insync.replicas=2。
Leader 选举#
Leader 宕机 → 从 ISR 中选新 Leader。ISR 为空时:
unclean.leader.election.enable=false(默认)→ 分区不可用=true→ 从 OSR 中选,可能丢数据
核心配置#
replica.lag.time.max.ms=30000
min.insync.replicas=2
replication.factor=3
unclean.leader.election.enable=falseproperties面试回答(2分钟版)
ISR即In-Sync Replicas,是Kafka中与Leader保持同步的副本集合,Leader本身也在ISR中。Follower通过不断向Leader发Fetch请求拉取数据保持同步,如果超过replica.lag.time.max.ms默认30秒没有Fetch请求就会被踢出ISR进入OSR,追上后可以重新加入。ISR配合两个关键概念:LEO是每个副本的日志末端偏移量,HW高水位是ISR中所有副本LEO的最小值,消费者只能读到HW之前的消息,这保证了已提交消息的一致性。ISR和acks参数配合使用,acks=0不等确认最快但最不安全,acks=1只等Leader确认,acks=all等ISR中所有副本确认最安全。但这里有个陷阱,acks=all只等ISR中的副本,如果ISR只剩Leader一个节点就等于acks=1,所以必须配合min.insync.replicas=2保证至少有两个同步副本才允许写入。Leader宕机时从ISR中选新Leader,如果ISR为空且unclean.leader.election.enable=true则从OSR选可能丢数据。生产环境推荐三件套配置:replication.factor=3、min.insync.replicas=2、unclean.leader.election.enable=false。
追问与易错
追问方向:
- “HW 什么时候更新?”→ Follower Fetch 时 Leader 计算新 HW 并返回
- “min.insync.replicas=2 但只有 2 副本?”→ 任一 Follower 宕机即无法写入
易错点:
- ❌ “acks=all 等所有副本”——只等 ISR,不等 OSR
- ❌ “HW 等于 Leader 的 LEO”——HW 是 ISR 所有副本的最小 LEO