作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们上一章介绍了中间件: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) 数据同步流程
-
生产者向 Leader 发送消息。
-
Leader 将消息写入本地日志。
-
Follower 副本从 Leader 拉取消息并写入本地。
-
Leader 更新 HW(所有 ISR 副本已复制的最大偏移量)。
-
消费者只能读取到 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
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。