这篇文章不是从“官方定义”硬讲,而是按照一个初学者最容易混乱的提问路径,一步一步把 Kafka 里最常见、最容易绕晕的概念讲清楚。 如果你也经常分不清 broker、topic、partition、replica、leader/follower、ISR、acks、consumer group,这篇文章可以从头顺一遍。
一、先说结论:Kafka 到底最容易混在哪里?
初学 Kafka 时,最容易把下面这些概念搅在一起:
- Topic
- Partition
- Replica
- Leader / Follower
- ISR
- acks
- Broker
- Consumer Group
- Consumer 实例
真正的难点,不是每个词的单独定义,而是:
这些概念之间到底是什么关系。
所以这篇文章不打散讲,而是按关系讲。
二、Kafka 最核心的一个认知:副本是“分区级别”的,不是 Topic 级别的
这是最关键的一句话:
副本(Replica)是 Partition 级别的,不是 Topic 级别的。
很多人一开始会误以为:
- 一个 Topic 有几个副本
- 或者一个 Topic 有一套 leader / ISR
实际上不是。
正确理解是:
- Topic 下面有多个 Partition
- 每个 Partition 都有自己的一组副本
- 每个 Partition 都有自己的 leader、follower、ISR
也就是说:
- P0 有自己的 leader / ISR
- P1 有自己的 leader / ISR
- P2 有自己的 leader / ISR
所以 Kafka 讨论可靠性时,本质上都是在讨论:
某一个 Partition 的副本同步情况。
三、Broker 是什么?
一句话:
Broker 就是一台 Kafka 服务器实例。
如果你有 3 台 Linux 服务器,每台都部署了一个 Kafka 实例,那么你就有:
- Broker1
- Broker2
- Broker3
它们组成了一个 Kafka 集群。
Broker 的职责很简单:
- 存储消息
- 承载 Partition 的副本
- 当某些 Partition 的 leader
- 接收 Producer 写入
- 给 Consumer 提供读取
最容易记住的理解
- Topic:消息分类
- Partition:Topic 的逻辑分片
- Replica:Partition 的副本
- Broker:存放这些副本的 Kafka 服务器
四、Partition 到底怎么理解?
很多人会问:
分区是在 Broker 的上层吗?
更准确的说法不是“上层下层”,而是:
- Partition 是逻辑上的数据分片
- Broker 是物理上的承载节点
- Replica 是 Partition 在 Broker 上的具体落点
可以这样理解
Topic 像一个大的消息分类,比如:
order-topic
这个 Topic 下面可以切成多个 Partition:
- P0
- P1
- P2
每个 Partition 本质上都是一条独立的日志。
所以 Partition 有三个非常重要的作用:
1)并行单位
多个 Partition 可以让生产和消费并行起来。
2)顺序单位
Kafka 只保证 单个 Partition 内有序,不保证整个 Topic 全局有序。
3)存储单位
消息不是直接存在 Topic 里,而是存在某个具体的 Partition 里。
五、3 个 Broker、3 个 Partition、3 副本,到底是什么关系?
假设:
- Topic:
order-topic - Partition 数:3
- 副本因子:3
- Broker 数:3
那么逻辑上是:
Topic: order-topic
├── Partition0
├── Partition1
└── Partition2
物理上可能是:
Broker1
├── P0 Leader Replica
├── P1 Follower Replica
└── P2 Follower Replica
Broker2
├── P0 Follower Replica
├── P1 Leader Replica
└── P2 Follower Replica
Broker3
├── P0 Follower Replica
├── P1 Follower Replica
└── P2 Leader Replica
这时你应该这样看:
- Topic 是逻辑名字
- Partition 是逻辑分片
- Replica 是分片的拷贝
- Broker 是承载这些拷贝的机器
六、Leader 算不算副本?
算。
Leader 本身就是副本的一种。
如果某个 Partition 的副本因子是 3,那表示这个 Partition 总共有 3 个副本,其中:
- 1 个是 leader
- 其余的是 follower
比如:
- Broker1:leader
- Broker2:follower
- Broker3:follower
这就已经是 3 个副本 了,不是 “1 个 leader + 3 个 follower”。
七、ISR 是什么?跟副本是什么关系?
ISR 全称是:
In-Sync Replicas,也就是“同步副本集合”。
含义是:
- 某个 Partition 的所有副本里
- 当前那些 跟得上 leader 的副本
- 才会被放进 ISR
比如某个 Partition 有 3 个副本:
- A:leader
- B:follower
- C:follower
如果 B 正常跟上 leader,但 C 因为网络慢、磁盘慢等原因落后太多,那么 ISR 可能就是:
ISR = {A, B}
这里要注意一个非常重要的点:
C 掉出 ISR,不代表 C 这个副本没了。
它仍然存在,只是:
- 它暂时落后
- 暂时不算“同步合格副本”
- 所以
acks=all时不会等它确认
如果后面 C 把数据追上了,它是可以重新进入 ISR 的。
八、acks 是什么?和 ISR 到底啥关系?
acks 是 Producer 的参数,表示:
发消息后,需要 Kafka 给到什么级别的确认。
常见有三种:
1)acks=0
发出去就不管了,不等任何回应。
特点:
- 延迟低
- 吞吐高
- 最不可靠
2)acks=1
只要 leader 写成功,就返回成功。
特点:
- 性能和可靠性折中
- 但 leader 刚写完还没同步给 follower 就挂了,消息可能丢
3)acks=all(或 -1)
要等“满足条件的同步副本”确认后,才返回成功。
这里最容易误解:
acks=all 不是等所有副本,而是等 ISR 中满足要求的副本。
所以它和 ISR 是强相关的。
一句话总结两者关系
ISR 决定谁有资格参与确认,acks 决定要不要等这些副本确认。
九、replication.factor=3、min.insync.replicas=2、acks=all 到底意味着什么?
这是一个经典组合。
假设某个 Partition 有 3 个副本:
- A:leader
- B:follower
- C:follower
并且配置是:
replication.factor=3min.insync.replicas=2acks=all
那么它的含义是:
至少要有 2 个 ISR 副本确认成功,生产者才会收到成功响应。
而这 2 个副本里:
- leader 算一个
- 所以通常就是:leader + 至少 1 个 follower
三种情况
情况 1:ISR = {A, B, C}
正常写入,没问题。
情况 2:ISR = {A, B}
C 掉队了,但 A 和 B 还在 ISR,仍然可以写成功。
情况 3:ISR = {A}
只剩 leader 自己,虽然 leader 还活着,但因为不满足 min.insync.replicas=2,写入会失败。
这套配置的本质
可以理解成一句话:
这条消息不能只存在 leader 一台机器上,至少还得再有一台同步副本也拿到,才算真正写成功。
十、Producer 往 Topic 发消息时,到底是发给 Topic、Partition,还是多个副本?
Producer 表面上是发给 Topic,但 Kafka 内部一定会先决定:
这条消息最终进入哪个 Partition。
关键点
- 一条消息不会同时写入多个 Partition
- 它只会先进入 一个确定的 Partition
- 然后复制到 这个 Partition 的多个副本
比如:
- Topic:
order-topic - 有 3 个 Partition:P0、P1、P2
- 某条消息被路由到了 P1
那么这条消息的流程就是:
- Producer 把消息发给 P1 的 leader
- leader 先写入本地
- P1 的 follower 再从 leader 同步
所以同一条消息会存在多个地方,但这个“多个地方”指的是:
同一个 Partition 的多个副本上
而不是多个 Partition 上。
十一、分区数到底是怎么决定的?
这也是特别容易误解的点。
很多人会以为:
- 3 台服务器 = 3 个分区
- 或者 3 台 Broker 就自动 3 分区
其实不是。
正确结论
Broker 数量 ≠ Partition 数量 ≠ Replication Factor
这三个是独立概念,只是互相有约束。
1)Broker 数量
表示 Kafka 集群里有几个节点。
2)Partition 数量
表示某个 Topic 被切成几份。
3)Replication Factor
表示某个 Topic 的每个 Partition 有几份副本。
分区数从哪来?
通常是 创建 Topic 时指定的。
例如:
partitions=3replication-factor=2
这表示:
- Topic 有 3 个 Partition
- 每个 Partition 有 2 份副本
如果启用了自动创建 Topic,那么也可能来自 Broker 默认配置,比如:
num.partitionsdefault.replication.factor
所以本质上仍然是 配置决定,不是“几台服务器自动决定”。
十二、只有 1 个 Kafka 实例时,1 个分区和 2 个分区有区别吗?
有,而且是有实际区别的。
即使现在只有 1 个 Broker:
- 1 个 Partition
- 2 个 Partition
仍然会有明显差别。
区别主要体现在 4 个方面
1)并行消费能力
- 1 个分区:同一个 Consumer Group 内,最多 1 个 Consumer 实例有效工作
- 2 个分区:同一个 Consumer Group 内,最多可以 2 个 Consumer 实例并行消费
2)顺序性
- 1 个分区:顺序语义最清晰
- 2 个分区:只保证每个分区内部有序,不保证 Topic 全局有序
3)高可用
单 Broker 下,分区变多 不会提升高可用。
因为所有分区还是都在同一台机器上。
4)复杂度
- 1 个分区更简单
- 2 个分区在路由、排查、顺序理解上会更复杂一点
实用建议
如果只是:
- 本地开发
- 小流量
- 跑通流程
那 1 个分区通常就够了。
如果你已经明确需要:
- 并行消费
- 模拟多消费者
- 不要求 Topic 全局顺序
那可以考虑 2 个或更多分区。
十三、2 个分区,是不是就要 2 个消费者组?
不是。
这是另一个非常常见的误区。
正确理解
分区数决定的是:同一个消费者组内,最多能有多少个消费者实例并行消费。
不是说有 2 个分区,就必须配 2 个消费者组。
例子
假设:
- Topic 有 2 个分区
- 1 个 Consumer Group
情况 A:组里只有 1 个消费者实例
那么它会同时消费 2 个分区。
情况 B:组里有 2 个消费者实例
那么它们可以并行分摊:
- Consumer1 -> P0
- Consumer2 -> P1
情况 C:组里有 3 个消费者实例
那也只有 2 个能分到活,另一个会空闲。
所以要区分两个概念
Consumer Group
代表“一个消费团队”,组内是分工合作关系。
Consumer 实例
代表组里的具体成员。
十四、一个消费者组消费多个 Topic,和消费一个 Topic,有区别吗?
有,但 Kafka 的本质分配单位不是 Topic,而是:
Partition
所以:
- 一个消费者组消费 1 个 Topic,本质是消费这个 Topic 的所有 Partition
- 一个消费者组消费多个 Topic,本质是消费这些 Topic 的所有 Partition
区别主要在:
1)总分配单元更多
多个 Topic 订阅后,Group 内要分配的 Partition 总数会变多。
2)并行度取决于总 Partition 数
不是 Topic 数量越多越快,而是 总 Partition 数越多,并行空间越大。
3)业务耦合度
一个 Group 同时消费多个 Topic,业务处理代码可能更耦合。
4)Rebalance 影响范围更大
因为这个 Group 订阅到的所有 Partition 都可能受影响。
十五、一个 Topic、2 个分区、1 个消费者组:1 个消费者实例和 2 个消费者实例,哪个性能更好?
一般来说:
2 个消费者实例通常性能更好,但不是绝对。
原因
因为这时可以做到并行消费:
- Consumer1 -> P0
- Consumer2 -> P1
而如果只有 1 个消费者实例,它要同时扛 2 个分区。
什么时候后者明显更好?
- 单条消息处理比较重
- 有数据库写入
- 有网络调用
- 有第三方接口调用
- 两个分区负载都不低
什么时候差异可能不大?
- 单条消息处理特别轻
- 两个分区负载极不均衡
- 本机资源已经成瓶颈
- 下游系统本身已经成瓶颈
一个很实用的判断方式
看:
- 单条消息平均处理耗时
- 消费 Lag 是否堆积
- CPU / 内存是否吃满
- 数据库或外部接口是否成瓶颈
十六、把这些概念一次串成一张脑图
你可以把 Kafka 想成下面这个关系:
Kafka Cluster
├── Broker1
├── Broker2
└── Broker3
Topic: order-topic
├── Partition0
│ ├── Replica on Broker1 (Leader)
│ ├── Replica on Broker2 (Follower)
│ └── Replica on Broker3 (Follower)
│
├── Partition1
│ ├── Replica on Broker2 (Leader)
│ ├── Replica on Broker1 (Follower)
│ └── Replica on Broker3 (Follower)
│
└── Partition2
├── Replica on Broker3 (Leader)
├── Replica on Broker1 (Follower)
└── Replica on Broker2 (Follower)
Producer 发消息时:
- 一条消息先进入一个 Partition
- 再写到这个 Partition 的 Leader
- 再同步到这个 Partition 的 Follower
Consumer Group 消费时:
- 消费的是 Partition
- 同组内多个 Consumer 实例分摊这些 Partition
- 每个 Partition 在同一个组内,同一时刻只能被一个 Consumer 实例消费
十七、最后,用最短的话总结整篇文章
如果你只想记住最关键的几句话,那就是下面这些:
1.
Broker 是 Kafka 服务器实例。
2.
Topic 是消息分类,Partition 是 Topic 的逻辑分片。
3.
Replica 是 Partition 的副本,Leader 也是副本的一种。
4.
副本是 Partition 级别的,不是 Topic 级别的。
5.
ISR 是当前跟得上 Leader 的副本集合。
6.
acks=all 不是等所有副本,而是等 ISR 中满足要求的副本。
7.
min.insync.replicas 决定了 acks=all 时,至少需要多少个 ISR 副本在线。
8.
一条消息只会进入一个 Partition,但会存在于这个 Partition 的多个副本上。
9.
分区数决定并行度上限,不是 Broker 数决定。
10.
同一个消费者组内,分区是拿来分工的;不同消费者组之间,是各自独立消费一遍。
每天进步一点点
如果这篇文章对你有帮助,欢迎点赞收藏~ 🚀