Kafka-Leader分区(AR +ISR + OSR)

104 阅读4分钟

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们上一章介绍了中间件:Zookeeper,本章将介绍另外一个中间件:Kafka。目前这2个中间件都是基于JAVA语言的。

上个小节我们介绍了Topic的分区(Partition)和副本(Replica),今天我们这个小节就来详细介绍这个分区的详细信息。

在 Apache Kafka 中,每个分区都有Leader分区和Follower分区,Leader 分区 是负责处理客户端读写请求的主副本,其副本管理机制通过 AR(Assigned Replicas)ISR(In-Sync Replicas)OSR(Out-of-Sync Replicas) 确保数据的高可用性和一致性。以下是详细说明:

1. AR(Assigned Replicas)

AR 是分区的所有副本集合,包括 Leader 和 Follower 副本。这些副本分布在不同的 Broker 上,用于实现数据冗余和容错。由 Kafka 动态分配,确保副本分布在不同的 Broker 上(避免单点故障)。副本数量由 replication.factor 配置决定(默认 1,生产环境建议 ≥3)。

2. Leader 分区

功能定义:每个分区的主副本,负责处理所有客户端(生产者/消费者)的读写请求。维护 ISR 列表,监控 Follower 副本的同步状态。协调副本间的数据复制(Follower 从 Leader 拉取数据)。

选举机制:当 Leader 失效时,Kafka 控制器(Controller)从 ISR 中选举新的 Leader。若 ISR 为空,根据 unclean.leader.election.enable 配置决定是否允许从非 ISR 副本选举(可能丢失数据)。

3. ISR(In-Sync Replicas)

当前与 Leader 保持同步的副本集合。只有 ISR 中的副本才可能被选举为 Leader。Follower 副本的进度(HW, High Watermark)与 Leader 的差距不超过阈值。在 replica.lag.time.max.ms(默认 10 秒)内与 Leader 保持心跳。生产者可通过 acks=all 确保消息被所有 ISR 副本确认后才视为提交。ISR 中的副本是数据一致性和高可用的核心保障。

4. OSR(Out-of-Sync Replicas)

未能及时与 Leader 同步的副本集合。这些副本可能因网络延迟、Broker 故障或高负载暂时落后。Follower 副本在 replica.lag.time.max.ms 内未追上 Leader就是从ISR变成OSR。OSR 中的副本重新追上 Leader 后,会被重新加入 ISR。

5. 核心流程与配置

(1) 数据同步流程

  1. 生产者向 Leader 发送消息。

  2. Leader 将消息写入本地日志。

  3. Follower 副本从 Leader 拉取消息并写入本地。

  4. Leader 更新 HW(所有 ISR 副本已复制的最大偏移量)。

  5. 消费者只能读取到 HW 之前的消息。(Leader LEO = 100,Follower1 LEO = 95,Follower2 LEO = 90 → HW = 90。消费者只能读取到 Offset ≤ 90 的消息)。

(2) 关键配置

配置项

说明

replication.factor

分区副本总数(AR 的数量)。

min.insync.replicas

最小 ISR 副本数,若 ISR 副本数不足,生产者 acks=all 会写入失败。

replica.lag.time.max.ms

Follower 副本最大允许落后时间,超时则移出 ISR(默认 10 秒)。

unclean.leader.election.enable

是否允许从非 ISR 副本选举 Leader(默认 false,避免数据丢失)。

(3) 故障恢复示例

  • 场景:Leader 宕机,ISR 中有副本 A 和 B。

  • 恢复:Kafka 控制器从 ISR(A 或 B)选举新 Leader。

  • 若 ISR 为空:若 unclean.leader.election.enable=true,可能选举 OSR 副本,但可能导致数据丢失。

    #查看Topic详细信息,就可以看到分区,Leader,AR,ISR等信息 ./bin/kafka-topics.sh
    --bootstrap-server 192.168.31.143:9092
    --describe --topic my-topic123

如果不使用--topic my-topic123,则会列出所有Topic详细信息。

Topic: my-topic123	TopicId: ntenNeGLTyeadW58Z9iwPg	PartitionCount: 3	ReplicationFactor: 3	Configs: segment.bytes=1073741824
	Topic: my-topic123	Partition: 0	Leader: 2	Replicas: 2,1,0	Isr: 0,1,2
	Topic: my-topic123	Partition: 1	Leader: 0	Replicas: 1,0,2	Isr: 0,1,2
	Topic: my-topic123	Partition: 2	Leader: 0	Replicas: 0,2,1	Isr: 0,1,2

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。