点一下关注吧!!!非常感谢!!持续更新!!!
🚀 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选举
- Follower副本的工作机制类似于普通的Kafka消费者:
举例说明: 假设一个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为空且允许"脏"选举,则从所有可用副本中选择
- 优先选择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副本数不足
监控与调优建议
-
监控关键指标:
- ISR变化频率
- Under Replicated Partitions数量
- Leader选举次数
-
重要参数调优:
# 控制副本落后时间阈值
replica.lag.time.max.ms=10000
# 最小同步副本数
min.insync.replicas=2
# 是否允许非ISR副本成为Leader
unclean.leader.election.enable=false
- 生产环境建议:
- 对于关键业务Topic,设置
min.insync.replicas=2和acks=all - 在跨机房部署时,适当增大
replica.lag.time.max.ms - 定期检查分区分布,避免Leader过度集中
- 对于关键业务Topic,设置
为何不用少数服从多数
少数服从多数(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)机制,在资源利用效率上具有明显优势:
| 容错能力 | 少数服从多数所需副本数 | Kafka ISR所需副本数 |
|---|---|---|
| 1节点故障 | 3个副本 | 2个副本 |
| 2节点故障 | 5个副本 | 3个副本 |
| 3节点故障 | 7个副本 | 5个副本 |
这种差异在实际生产环境中会带来显著的资源节省。例如在一个需要容忍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的最小副本数,提高系统容错能力
示例配置:
# 禁止非ISR副本选举(默认值)
unclean.leader.election.enable=false
# 设置最小同步副本数为2
min.insync.replicas=2
在实际生产环境中,建议根据业务对数据一致性和服务可用性的不同要求,在集群级别或topic级别进行差异化配置。同时,完善的监控系统和灾备方案也是处理此类情况的重要保障。