【kafka系列】Topic 与 Partition
Kafka 的 Topic(主题) 和 Partition(分区) 是数据组织的核心概念,它们的映射关系及在 Broker 上的分布直接影响 Kafka 的性能、扩展性和容错能力。以下是详细解析:
一、Topic 与 Partition 的映射关系
- Topic 是逻辑分类,Partition 是物理分片
-
- Topic:消息的逻辑分类(例如
order_events
、user_logs
),类似于数据库中的表。 - Partition:每个 Topic 被划分为多个 Partition,每个 Partition 是一个有序的、不可变的消息队列。
- Topic:消息的逻辑分类(例如
-
-
- 消息在 Partition 内按顺序追加(有序),但全局无序(不同 Partition 的消息顺序不保证)。
- Partition 数量在 Topic 创建时指定,后续可增加(但不能减少)。
-
- 分区的核心作用
-
- 并行处理:多个 Consumer 可同时消费不同 Partition,提升吞吐量。
- 水平扩展:通过增加 Partition 数量,可突破单机性能瓶颈。
- 容错性:每个 Partition 的副本分布在多个 Broker 上,避免单点故障。
- 消息写入规则
-
- 生产者通过
Partitioner
决定消息写入哪个 Partition,默认策略:
- 生产者通过
-
-
- 轮询(Round Robin):无 Key 时均匀分配。
- 哈希 Key(Hash-based):有 Key 时按 Key 的哈希值选择 Partition,保证相同 Key 的消息进入同一 Partition。
-
二、Partition 在 Broker 上的分布
1. Partition 副本机制
- 每个 Partition 有多个副本(Replica),分为两类:
-
- Leader 副本:处理所有读写请求,是唯一对外服务的副本。
- Follower 副本:异步从 Leader 同步数据,不处理客户端请求。
- 副本数(Replication Factor):创建 Topic 时指定(例如
replication-factor=3
表示每个 Partition 有 3 个副本)。
2. Partition 分布策略
Kafka 会尽量将 Partition 的副本均匀分布在不同的 Broker 上,规则如下:
- 第一副本分配:
首个副本的分配策略有两种(由 Broker 参数broker.rack
决定):
-
- 无机架感知:轮询或随机选择一个 Broker。
- 有机架感知:优先选择不同机架的 Broker。
- 后续副本分配:
其他副本按顺序分配到与前一副本不同的 Broker(尽量分散)。
示例:
假设一个 Kafka 集群有 3 个 Broker(Broker 0、1、2),创建一个 Topic test
,参数为 partitions=3
、replication-factor=2
。
可能的分布如下:
Partition 0: Leader=Broker0, Replicas=[Broker0, Broker1]
Partition 1: Leader=Broker1, Replicas=[Broker1, Broker2]
Partition 2: Leader=Broker2, Replicas=[Broker2, Broker0]
3. 查看 Partition 分布
使用 Kafka CLI 工具查看 Topic 的 Partition 分布:
bash bin/kafka-topics.sh --describe --topic test --bootstrap-server localhost:9092
# 输出示例:
Topic: test PartitionCount: 3 ReplicationFactor: 2
Topic: test Partition: 0 Leader: 0 Replicas: 0,1 Isr: 0,1
Topic: test Partition: 1 Leader: 1 Replicas: 1,2 Isr: 1,2
Topic: test Partition: 2 Leader: 2 Replicas: 2,0 Isr: 2,0
Replicas
:该 Partition 的所有副本所在的 Broker ID。Leader
:当前处理请求的副本所在的 Broker ID。Isr
(In-Sync Replicas):与 Leader 保持同步的副本集合。
三、设计 Partition 分布的关键原则
- 均匀分布:
-
- Partition 的 Leader 应均匀分布在所有 Broker 上,避免单个 Broker 成为性能