当前位置: 首页 > backend >正文

深入理解 Kafka 核心:主题、分区与副本的协同机制

目录

      • 1. 主题(Topic)
        • 定义
        • 物理存储
      • 2. 分区(Partition)
        • 定义
      • 分区策略
        • 核心特性
      • 3. 副本(Replica)
        • 定义
        • ISR(In-Sync Replicas)
        • Unclean 领导者选举(Unclean Leader Election)
      • 4. 三者关系图解
      • 5. 工作机制详解
        • (1)生产者写入流程
        • (2)消费者读取流程
        • (3)故障转移机制
      • 6. 配置参数详解
      • 7. 最佳实践
        • (1)分区数规划
        • (2)副本数配置
        • (3)Key 设计
      • 总结

Kafka 的 主题(Topic)、分区(Partition)和副本(Replica) 是构建分布式消息系统的核心概念,三者协同工作实现高吞吐量、水平扩展和数据冗余。以下从定义、关系、工作机制和配置等方面进行详解:

1. 主题(Topic)

定义
  • 主题是 Kafka 中数据的逻辑分类:类似于数据库中的表或文件系统中的文件夹,用于组织消息流。
  • 生产者向主题写入消息消费者从主题读取消息
  • 主题是多订阅者模式:一个主题可以有零个、一个或多个消费者订阅其数据。
物理存储
  • 主题在物理上被划分为多个分区,数据分散存储在不同分区中。

2. 分区(Partition)

定义
  • 分区是主题的物理细分单元:一个主题由一个或多个分区组成,每个分区是一个有序的、不可变的消息日志。
  • 分区内消息有序:每个消息在分区内有唯一的偏移量(Offset)。
  • 分区分布在不同 Broker:同一个主题的分区可以分布在不同 Kafka 服务器上,实现负载均衡。

分区策略

所谓分区策略就是决定生产者将消息发送到哪个分区的算法。
Kafka 为我们提供了默认的分区策略,同时它也支持你自定义分区策略。
如果要自定义分区策略,你需要显式地配置生产者端的参数partitioner.class。

  • 轮询策略
  • 随机策略
  • 按消息键保序策略(优化-使用单个分区保持消息顺序性)
  • 基于地理位置的分区策略
核心特性
  • 水平扩展:通过增加分区数量提升吞吐量。
  • 顺序保证:Kafka 仅保证分区内消息有序,跨分区无法保证。
  • 分区分配
    • 生产者可通过 Key 哈希轮询将消息路由到指定分区。
    • 消费者组中的消费者通过协调器动态分配分区(每个分区只能被组内一个消费者消费)。

3. 副本(Replica)

在这里插入图片描述

定义
  • 副本是分区的冗余备份:每个分区可以有多个副本,分布在不同 Broker 上,提高可用性。

  • Leader 副本:负责处理读写请求,每个分区有且仅有一个 Leader。

  • Follower 副本:从 Leader 同步数据,不直接处理客户端请求。当 Leader 故障时,从 ISR 中选举新 Leader。

  • 第一,在 Kafka 中,副本分成两类:领导者副本(Leader Replica)和追随者副本(Follower Replica)。每个分区在创建时都要选举一个副本,称为领导者副本,其余的副本自动称为追随者副本。

  • 第二,Kafka 的副本机制比其他分布式系统要更严格一些。在 Kafka 中,追随者副本是不对外提供服务的。这就是说,任何一个追随者副本都不能响应消费者和生产者的读写请求。所有的请求都必须由领导者副本来处理,或者说,所有的读写请求都必须发往领导者副本所在的 Broker,由该 Broker 负责处理。追随者副本不处理客户端请求,它唯一的任务就是从领导者副本异步拉取消息,并写入到自己的提交日志中,从而实现与领导者副本的同步。

  • 第三,当领导者副本挂掉了,或者说领导者副本所在的 Broker 宕机时,Kafka 依托于 ZooKeeper 提供的监控功能能够实时感知到,并立即开启新一轮的领导者选举,从追随者副本中选一个作为新的领导者。老 Leader 副本重启回来后,只能作为追随者副本加入到集群中。

ISR(In-Sync Replicas)
  • 与 Leader 保持同步的副本集合:只有 ISR 中的副本才能被选举为新 Leader。
  • 通过 min.insync.replicas 配置 ISR 最小副本数,确保数据持久性。

Kafka 引入了 In-sync Replicas,也就是所谓的 ISR 副本集合。ISR 中的副本都是与 Leader 同步的副本,相反,不在 ISR 中的追随者副本就被认为是与 Leader 不同步的。那么,到底什么副本能够进入到 ISR 中呢?

我们首先要明确的是,Leader 副本天然就在 ISR 中。也就是说,ISR 不只是追随者副本集合,它必然包括 Leader 副本。甚至在某些情况下,ISR 只有 Leader 这一个副本

这个标准就是 Broker 端参数 replica.lag.time.max.ms 参数值。这个参数的含义是 Follower 副本能够落后 Leader 副本的最长时间间隔,当前默认值是 10 秒。这就是说,只要一个 Follower 副本落后 Leader 副本的时间不连续超过 10 秒,那么 Kafka 就认为该 Follower 副本与 Leader 是同步的,即使此时 Follower 副本中保存的消息明显少于 Leader 副本中的消息。

在这里插入图片描述

Unclean 领导者选举(Unclean Leader Election)

既然 ISR 是可以动态调整的,那么自然就可以出现这样的情形:ISR 为空。因为 Leader 副本天然就在 ISR 中,如果 ISR 为空了,就说明 Leader 副本也“挂掉”了,Kafka 需要重新选举一个新的 Leader。可是 ISR 是空,此时该怎么选举新 Leader 呢?

Kafka 把所有不在 ISR 中的存活副本都称为非同步副本。通常来说,非同步副本落后 Leader 太多,因此,如果选择这些副本作为新 Leader,就可能出现数据的丢失。毕竟,这些副本中保存的消息远远落后于老 Leader 中的消息。在 Kafka 中,选举这种副本的过程称为 Unclean 领导者选举。Broker 端参数 unclean.leader.election.enable 控制是否允许 Unclean 领导者选举

开启 Unclean 领导者选举可能会造成数据丢失,但好处是,它使得分区 Leader 副本一直存在,不至于停止对外提供服务,因此提升了高可用性。反之,禁止 Unclean 领导者选举的好处在于维护了数据的一致性,避免了消息丢失,但牺牲了高可用性。

4. 三者关系图解

[主题 my_topic (3个分区, 2个副本)]
├── 分区0
│   ├── Leader (Broker 1)
│   └── Follower (Broker 2)
├── 分区1
│   ├── Leader (Broker 2)
│   └── Follower (Broker 3)
└── 分区2├── Leader (Broker 3)└── Follower (Broker 1)
  • 生产者根据路由策略将消息发送到对应分区的 Leader。
  • 消费者从分区 Leader 读取数据。
  • 副本同步:Follower 向 Leader 发送 Fetch 请求,拉取最新消息。

5. 工作机制详解

(1)生产者写入流程
  1. 消息路由:根据 Key 或轮询确定目标分区。
  2. 发送到 Leader:生产者直接将消息发送到分区 Leader。
  3. ISR 同步:Leader 将消息写入本地日志,Follower 从 Leader 拉取消息。
  4. ACK 确认:根据 acks 参数决定何时返回成功响应:
    • acks=0:无需等待确认,吞吐量最高但可能丢数据。
    • acks=1:Leader 写入本地日志后确认,默认配置。
    • acks=all:ISR 中所有副本都写入成功后确认,强一致性。
(2)消费者读取流程
  1. 消费者组协调:组内消费者通过协调器分配分区。
  2. 从 Leader 读取:每个消费者从分配到的分区 Leader 拉取消息。
  3. 偏移量管理:消费者提交消费偏移量(Offset),记录已消费位置。
(3)故障转移机制
  • Leader 选举:当 Leader 所在 Broker 故障时,Kafka 控制器从 ISR 中选举新 Leader。
  • ISR 动态调整:如果 Follower 长时间未同步数据,会被移出 ISR;恢复同步后重新加入。

6. 配置参数详解

参数名含义默认值
主题级参数
num.partitions创建主题时的默认分区数1
default.replication.factor分区的默认副本数1
分区级参数
min.insync.replicasISR 中至少需要的副本数,确保数据持久性1
unclean.leader.election.enable是否允许非 ISR 中的副本成为 Leader(可能导致数据丢失)false
生产者参数
acks确认机制:0(不等待)、1(Leader 确认)、all(ISR 全部确认)1
retries发送失败时的重试次数2147483647
消费者参数
group.id消费者组 ID,相同组内消费者共享分区-
auto.offset.reset当偏移量无效时的策略:earliest(从头开始)、latest(从最新开始)latest

7. 最佳实践

(1)分区数规划
  • 公式:分区数 = max(预期吞吐量 / 单分区吞吐量, Broker 数量, 最大消费者数)
  • 示例:若单分区吞吐量为 10MB/s,预期总吞吐量 100MB/s,则至少需要 10 个分区。
(2)副本数配置
  • 生产环境建议副本数 ≥ 3:确保容忍 2 个 Broker 同时故障。
  • 结合 min.insync.replicas:设置为 2 时,需至少 2 个副本同步成功才确认,避免脑裂。
(3)Key 设计
  • 需要顺序保证的消息使用相同 Key:例如同一用户的操作日志。
  • 避免数据倾斜:确保 Key 分布均匀,防止个别分区成为热点。

总结

  • 主题是数据的逻辑分类,分区是物理存储单元,副本是分区的冗余备份。
  • 分区数决定吞吐量上限副本数决定容错能力
  • 合理规划分区和副本是 Kafka 高性能、高可用的关键,需结合业务场景和集群规模综合考量。
http://www.xdnf.cn/news/15553.html

相关文章:

  • Scalefusion 与 EasyControl 对比:轻量级方案与全功能 IoT MDM 的深度碰撞
  • spring容器的bean是单例还是多例的?线程安全吗?
  • AI编程神器 Claude Code 安装及使用体验
  • SQLSERVER清理日志
  • 【28】MFC入门到精通——MFC串口 Combobox 控件实现串口号
  • Python面向对象编程(OOP)详解:通俗易懂的全面指南
  • HTTP vs HTTPS
  • Linux驱动基础:阻塞、休眠、poll、异步通知
  • 探究Netty 4.2.x版本
  • 增程式汽车底盘设计cad【9张】三维图+设计说明书
  • 单列集合顶层接口Collection
  • 医疗AI“全栈原生态“系统设计路径分析
  • 【游戏引擎之路】登神长阶(十八):3天制作Galgame引擎《Galplayer》——无敌之道心
  • 用AI做带货视频评论分析进阶提分【Datawhale AI 夏令营】
  • LLM大语言模型不适合统计算数,可以让大模型根据数据自己建表、插入数据、编写查询sql统计
  • 加速度传感器的用途与应用
  • es启动问题解决
  • 【C#】实体类定义的是long和值识别到的是Int64,实体类反射容易出现Object does not match target type
  • 高性能架构模式——高性能NoSQL
  • 【MySQL基础】MySQL事务详解:原理、特性与实战应用
  • 用PyTorch手写透视变换
  • 嵌入式学习-PyTorch(5)-day22
  • Towards Low Light Enhancement with RAW Images 论文阅读
  • ASP.NET Core Hosting Bundle
  • Debian 12中利用dpkg命令安装MariaDB 11.8.2
  • C++11迭代器改进:深入理解std::begin、std::end、std::next与std::prev
  • 在 kubernetes 上安装 jenkins
  • 数据结构自学Day7-- 二叉树
  • I3C通信驱动开发注意事项
  • PHP连接MySQL数据库的多种方法及专业级错误处理指南