Kafka 小白最容易混淆的 8 个概念:Broker、Topic、Partition、Replica、ISR、acks、Consumer Group 一次讲清

0 阅读11分钟

这篇文章不是从“官方定义”硬讲,而是按照一个初学者最容易混乱的提问路径,一步一步把 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=3min.insync.replicas=2acks=all 到底意味着什么?

这是一个经典组合。

假设某个 Partition 有 3 个副本:

  • A:leader
  • B:follower
  • C:follower

并且配置是:

  • replication.factor=3
  • min.insync.replicas=2
  • acks=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

那么这条消息的流程就是:

  1. Producer 把消息发给 P1 的 leader
  2. leader 先写入本地
  3. 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=3
  • replication-factor=2

这表示:

  • Topic 有 3 个 Partition
  • 每个 Partition 有 2 份副本

如果启用了自动创建 Topic,那么也可能来自 Broker 默认配置,比如:

  • num.partitions
  • default.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.

同一个消费者组内,分区是拿来分工的;不同消费者组之间,是各自独立消费一遍。


每天进步一点点

如果这篇文章对你有帮助,欢迎点赞收藏~ 🚀