大数据 -63 Kafka 副本机制详解:高可用性、ISR 原理与 Leader 选举全解析

点一下关注吧!!!非常感谢!!持续更新!!!
🚀 AI 篇持续更新中!(长期更新)
AI 炼丹日志-30-新发布【1T 万亿】参数量大模型!Kimi‑K2 开源大模型解读与实践,持续打造实用 AI 工具指南!📐🤖
💻 Java 篇正式开启!(300 篇)
目前 2025 年 08 月 04 日更新到:Java-89 深入浅出 MySQL 搞懂 MySQL Undo/Redo Log,彻底掌握事务回滚与持久化 MyBatis 已完结,Spring 已完结,Nginx 已完结,Tomcat 已完结,分布式服务正在更新!深入浅出助你打牢基础!
📊 大数据板块已完成多项干货更新(300 篇):
包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解

章节内容
上节我们完成了如下的内容,基本都是特性概念相关的:
kafka-topics.sh 的基本参数和基本使用,涉及到创建、查看、修改、主题,增加分区等。
KafkaAdminClient
Kafka 偏移量管理

副本机制

Kafka 通过多副本机制提供了高可用性和数据持久性保障。在集群部署中,Kafka 会在配置数量的服务器上对主题分区进行复制,当集群中某个 Broker 节点发生宕机时,系统可以自动将流量切换到其他可用的副本上,这种机制确保了服务的高可用性且不会造成数据丢失。
以下是关于 Kafka 副本机制的详细说明:
副本类型定义:
将复制因子(replication factor)为 1 的未复制主题称为"单副本主题",这类主题没有数据冗余
复制因子大于 1 的主题称为"多副本主题",这类主题具有数据冗余能力
分区与副本关系:
主题的分区(partition)是复制的最小单元,每个分区可以配置独立的副本数
在正常运行情况下,每个 Kafka 分区由以下副本组成:
1 个 Leader 副本:负责处理所有读写请求
0 个或多个 Follower 副本:与 Leader 保持数据同步
包括 Leader 副本在内的所有副本总数即为该分区的复制因子(replication factor)
读写机制:
所有客户端(生产者和消费者)的读写请求都只由 Leader 副本处理
Follower 副本会持续从 Leader 副本拉取数据,保持与 Leader 的数据同步
当 Leader 副本不可用时,控制器(Controller)会从同步的 Follower 副本中选举新的 Leader
集群资源分配:
通常情况下,集群中的分区数量会远多于 Broker 节点数量
Leader 分区会在集群中的 Broker 之间自动均衡分布,避免单个节点负载过高
副本分配策略会确保同一分区的不同副本分布在不同的 Broker 上
Follower 副本工作机制:
Follower 副本的工作机制类似于普通的 Kafka 消费者:
从 Leader 副本拉取消息数据
将拉取到的消息持久化到自己的日志文件中
支持对消息拉取操作进行批处理以提高效率
Follower 副本会定期向 Leader 发送 Fetch 请求,获取最新的消息数据
只有与 Leader 保持同步的 Follower 副本(in-sync replicas)才能参与 Leader 选举
举例说明:假设一个 Kafka 集群有 5 个 Broker 节点,创建一个名为"orders"的主题,该主题有 10 个分区,复制因子配置为 3。那么:
每个分区会有 1 个 Leader 和 2 个 Follower,共 3 个副本
这些副本会被均匀分布在不同的 Broker 节点上
当某个包含 Leader 副本的 Broker 宕机时,控制器会自动从该分区的 Follower 副本中选举新的 Leader
客户端应用几乎感知不到 Broker 故障,服务可以持续可用
同步节点
节点必须能够维持 ZooKeeper 的会话(通过 ZooKeeper 的心跳机制)
对于 Follower 副本分区,它复制在 Leader 分区上的写入,并且不要延迟太多
Kafka 提供的保证是:只要至少有一个同步副本处于活动状态,提交的消息就不会丢失。
宕机恢复
少副本宕机
当 Leader 宕机了,会从 Follower 选择一个作为 Leader,当宕机重新恢复时,会把之前的 commit 清空,重新从 Leader 中 Pull 数据。
全副本宕机
恢复方式 1:等待 ISR 中的一个恢复后,选为 Leader(时间久,可用性低)
恢复方式 2:选择一个恢复的副本作为新的 Leader,无论是否在 ISR 中(可能未包含提交 commit,会丢失数据)
Leader 选举
3 个分区
3 个 Broker
基础概念

生产者和消费者的请求都由 Leader 副本处理,Follower 副本只负责 Leader 副本的数据和 Leader 保持同步。Leader 副本和 Follower 副本之间的关系并不是固定不变的,在 Leader 所在的 Broker 发生故障的时候,就需要进行分区的 Leader 副本和 Follower 副本之间的切换,需要选举 Leader 副本。
Kafka Leader 选举机制详解
选举触发条件
当某个分区的 Leader 服务器出现以下情况时会触发 Leader 选举:
服务器宕机或网络不可达
服务器长时间无响应(超过参数
replica.lag.time.max.ms
配置的时间)服务器主动下线进行维护
ISR(In-Sync Replica)机制
ISR 是 Kafka 保证数据一致性和高可用的核心机制:
ISR 维护标准:
副本必须能持续与 Leader 保持心跳(默认每 3 秒一次)
副本落后 Leader 的消息数不超过
replica.lag.max.messages
(新版已弃用)副本与 Leader 的时间差不超过
replica.lag.time.max.ms
(默认 10 秒)ISR 动态调整:
当 Follower 副本满足同步条件时会被加入 ISR
当 Follower 副本落后超过阈值时会被移出 ISR
所有变更会实时同步到 ZooKeeper 的
/brokers/topics/[topic]/partitions/[partitionId]/state
节点数据提交确认:
生产者发送的消息必须被 ISR 中所有副本确认后才会被视为"已提交"
生产者可以配置
acks
参数来控制确认级别:acks=0
:不需要确认acks=1
:只需要 Leader 确认acks=all
:需要所有 ISR 副本确认
Leader 选举过程
选举触发:Controller(Kafka 集群中的一个特殊 Broker)检测到 Leader 失效
候选者筛选:从 ZooKeeper 获取当前分区的 ISR 列表
选举规则:
优先选择 ISR 中第一个副本(由
unclean.leader.election.enable
配置决定)如果 ISR 为空且允许"脏"选举,则从所有可用副本中选择
元数据更新:将新 Leader 信息写入 ZooKeeper
状态同步:通知所有 Broker 更新元数据缓存
容错能力分析
Kafka 的容错能力与副本配置直接相关:
典型配置:
3 副本(1 Leader + 2 Follower)可容忍 2 个节点故障
5 副本可容忍 4 个节点故障
可用性权衡:
副本数越多,容错能力越强,但写入延迟越高
一般建议生产环境配置
replication.factor=3
特殊场景处理:
当 ISR 副本数不足
min.insync.replicas
(默认 1)时,生产者会收到 NotEnoughReplicas 异常可以配置
unclean.leader.election.enable=true
允许非 ISR 副本成为 Leader,但可能丢失数据
监控与调优建议
监控关键指标:
ISR 变化频率
Under Replicated Partitions 数量
Leader 选举次数
重要参数调优:
生产环境建议:
对于关键业务 Topic,设置
min.insync.replicas=2
和acks=all
在跨机房部署时,适当增大
replica.lag.time.max.ms
定期检查分区分布,避免 Leader 过度集中
为何不用少数服从多数
少数服从多数(Majority Voting)是一种在分布式系统中被广泛采用的一致性算法和 Leader 选举机制。它的核心原理是:只有在超过半数的节点副本成功同步数据后,系统才会确认数据已经成功写入。同样地,在选举 Leader 时,也需要获得超过半数节点的支持才能当选。
算法特点与实现细节
数据同步机制:
写入操作需要等待(N/2)+1 个节点确认
读取操作需要查询(N/2)+1 个节点以确保获取最新数据
其中 N 代表集群中节点总数
容错能力:
可以容忍最多(N-1)/2 个节点故障
例如 3 节点集群可容忍 1 个节点故障
5 节点集群可容忍 2 个节点故障
资源效率问题
这种算法存在明显的资源效率问题:
冗余需求高:
为实现容错,需要部署大量冗余节点
例如要容忍 1 个节点故障,至少需要 3 个副本
要容忍 2 个节点故障,则需要 5 个副本
资源浪费:
每个写入操作都需要在多个节点上执行
增加了网络带宽和存储空间消耗
在频繁写入的场景下性能开销显著
与 Kafka ISR 机制的对比
Kafka 采用 ISR(In-Sync Replica)机制,在资源利用效率上具有明显优势:
这种差异在实际生产环境中会带来显著的资源节省。例如在一个需要容忍 2 个节点故障的场景中,Kafka 只需要 3 个副本,而传统多数派算法需要 5 个副本,资源消耗减少了 40%。
若 ISR 全部失败时的处理方案与权衡
当 Kafka 的 ISR(In-Sync Replicas)集合中的所有副本都失效时,系统面临数据可用性和一致性的关键抉择。此时需要根据业务需求在以下两种方案中进行选择:
方案一:等待 ISR 副本恢复
工作原理:系统会持续监控并等待 ISR 集合中的副本重新上线
优点:
严格保证数据一致性
避免数据丢失风险
符合消息队列的持久性要求
缺点:
可能导致较长时间的服务不可用(取决于副本恢复时间)
在高可用性要求的场景下可能无法接受
适用场景:
金融交易等对数据一致性要求极高的系统
可以容忍短暂服务中断的业务场景
方案二:启用非 ISR 副本选举(unclean.leader.election.enable=true)
工作原理:系统会从当前可用的副本中选举新的 leader,无论其是否在原有 ISR 集合中
优点:
保证服务的持续可用性
最小化服务中断时间
缺点:
可能导致数据丢失(新 leader 可能缺少最新提交的消息)
存在数据不一致的风险
适用场景:
实时监控等对可用性要求极高的场景
可以容忍少量数据丢失的业务系统
生产环境配置建议
对于关键业务系统,建议保持默认配置(unclean.leader.election.enable=false)
如果启用非 ISR 选举,建议配合监控告警系统,及时发现并处理数据不一致问题
可以通过设置 min.insync.replicas 参数来增加 ISR 的最小副本数,提高系统容错能力
示例配置:
在实际生产环境中,建议根据业务对数据一致性和服务可用性的不同要求,在集群级别或 topic 级别进行差异化配置。同时,完善的监控系统和灾备方案也是处理此类情况的重要保障。
版权声明: 本文为 InfoQ 作者【武子康】的原创文章。
原文链接:【http://xie.infoq.cn/article/98b91ddf8a6c19aef392edae0】。文章转载请联系作者。
评论