Kafka 核心概念
本文详细介绍了 Broker、Topic、副本 (Replica)、分区 (Partition)、offset 等关键术语,帮助你更好地理解 Kafka 体系。
1. Broker
1.1 定义
- Broker 是 Kafka 中的一台服务器(或一个节点)的称呼。可以简单理解为:Kafka Broker = Kafka Server。
- 整个 Kafka 集群由一台或多台 Broker 组成,Broker 之间通过网络协作,对外提供消息分发与存储服务。
1.2 功能
- 接收 Producer 发送的消息并将其写入本地磁盘进行持久化。
- 为 Consumer 提供拉取接口 (
poll()
),将已存储的消息返回给消费者。 - 维护 Topic / Partition 的元数据(例如:哪个分区在哪些 Broker 上,有哪些副本,Leader 是谁等)。
- 在需要时执行 Leader 选举、副本同步、日志清理等管理任务。
1.3 部署
- 一般生产环境会至少部署 3 台 Broker,以保证可靠性;也可以更多以扩容存储和提升吞吐量。
- 每个 Broker 都有一个唯一的 ID(如
broker.id=1
、broker.id=2
),Kafka 集群通过 ZooKeeper(旧版)或自身的元数据管理(新版)来追踪这些 Broker。
2. Topic
2.1 定义
- Topic 是 Kafka 中对消息进行分类或命名的逻辑概念。
- 类似于“消息主题”或“消息类别”。生产者把消息发送到某个 Topic,消费者可以订阅并消费该 Topic 下的消息。
2.2 特点
- 无限量存储:只要集群容量足够,Topic 可以承载海量消息。
- 分区化存储:物理上,一个 Topic 会被切分为一个或多个分区(Partition)来存储。
- 灵活扩展:可以随时增加分区数量来提升并发和吞吐量。
2.3 示例
- 可能有一个 Topic 叫
user_activity
用来存储用户行为日志;另一个 Topic 叫order_events
存储订单变更消息。 - 当你需要更多种类的消息时,只需新建新的 Topic 进行区分。
3. 副本 (Replica)
3.1 背景
- Kafka 是一个分布式系统,支持冗余来防止数据丢失和单点故障。
- 因此,每个分区 (Partition) 都可以配置多个 副本 (Replica) 来进行数据冗余。
3.2 定义
- 副本:同一个分区的数据会被复制到多个 Broker 上,这些拷贝就叫做副本。
- 副本数 (Replication Factor) 常见配置为 3(即每个分区在集群中存有 3 份数据)。
3.3 角色:Leader 与 Follower
- Leader:同一个分区在任意时刻只有一个 Leader 副本,负责对外读写。
- Follower:其他副本跟随 Leader 进行数据复制(同步),不直接提供读写服务。
- 如果 Leader 宕机或不可用,Kafka 会自动在 Follower 中选举新的 Leader,保证可用性。
3.4 意义
- 保证数据可靠性:一台 Broker 崩溃时,其他副本可以继续提供服务,避免数据丢失。
- 如果生产者设置
acks=all
且满足min.insync.replicas
,就可以获得更高的消息可靠性。
4. 分区 (Partition)
4.1 定义
- 分区 是 Topic 的一个物理子集,用于存储实际的消息数据。
- 每个分区在文件系统中对应一系列日志文件(
.log
),消息会被顺序追加到这些日志文件中。
4.2 重要性
-
并行读写
- 拥有多个分区可以让多个 Producer/Consumer 对不同分区进行并行处理,从而提升整体吞吐量。
- 在同一个 Consumer Group 内,同一分区只能被一个消费者实例消费,但多个分区就可以被多个实例同时消费。
-
扩展性
- 当一个 Topic 的数据或流量变大时,可以增加分区数量来提升并发能力。
- 有时会在系统运行中对 Topic 进行“分区扩容”。
-
有序性
- Kafka 只保证 同一分区内 消息的 offset 按顺序递增;跨分区之间不保证严格顺序。
- 如果业务需要强顺序性,可能需要在生产者端进行特定分区策略或只用一个分区。
5. offset
5.1 定义
- offset 是一条消息在其所属分区日志中的位置编号(通常从 0 或 1 开始,递增)。
- 在同一分区内部,offset 单调递增并且是唯一的;但同一个数字在不同分区中可能代表不同消息。
5.2 作用
- 用来标记和追踪消息的位置,消费者依赖 offset 知道自己“读到哪儿了”。
- 消费者发生故障重启时,可以从上次提交的 offset 恢复,避免丢消息或乱序。
5.3 意义
- 可回放:只要消息还在保留期内(默认 7 天等),消费者可以指定某个 offset 从头或指定位置重新消费。
- 顺序消费:通过 offset 的递增,Kafka 保证分区内部的消息时序一致性。
- 不同消费语义:在“at-least-once”、“at-most-once”、“exactly-once”语义下,offset 都起到关键作用(比如 offset 提交与事务结合)。
6. 关系总结
下图是一个示意性的关系图,帮助理解这些概念之间的关联:
| Kafka Cluster |
| (由多台 Broker 组成, 每台Broker有ID) |
+----------------------+-------------+
|
+-----------+-----------+ ... (可能有多个 Topic)
| Topic A |
+-----------+
| Partition-0 (Leader on Broker1; Follower on Broker2, Broker3)
| offset 0, offset 1, offset 2, ...
|
| Partition-1 (Leader on Broker2; Follower on Broker1, Broker3)
| offset 0, offset 1, offset 2, ...
|
| Partition-2 (Leader on Broker3; Follower on Broker1, Broker2)
| offset 0, offset 1, offset 2, ...
+--------------------------+
在这里插入代码片