这是一个非常精准的问题。Kafka 的节点(Broker)角色确实存在“主”和“从”的概念,但它并不是简单的“整台机器的主从”,而是在分区(Partition)级别实现的 Leader-Follower 模型。
为了让你看清它的运作方式,我们可以从三个维度来拆解:
1. 分区级别的主从(数据读写)
在 Kafka 中,数据是存储在 Partition(分区) 里的。
-
Leader (主):每个 Partition 都会从副本集中选出一个 Leader。所有的生产者写入和消费者读取,默认都只跟这个 Leader 打交道。
-
Follower (从):其他的副本都是 Follower。它们唯一的任务就是从 Leader 那里“拉取”数据,保持同步。
-
为什么要这么设计? 这样可以把流量分散到不同的 Broker 上。比如 Topic A 有 3 个分区,Broker 1 可能是分区 0 的 Leader,而 Broker 2 可能是分区 1 的 Leader,从而实现负载均衡。
2. 集群级别的主(管理控制)
虽然每个分区有自己的 Leader,但整个集群也需要一个“大脑”来管理,这就是 Controller。
-
Controller 节点:集群中会有一个 Broker 被选举为 Controller。
-
职责:它负责管理分区的状态、处理副本故障、并在 Leader 宕机时主持“选秀”,从 Follower 中挑出新的 Leader。
-
高可用:如果 Controller 挂了,其他 Broker 会立刻竞选出新的 Controller。
3. ISR 机制:谁有资格当“主”?
Kafka 有一个非常核心的概念叫 ISR (In-Sync Replicas),即“保持同步的副本集合”。
-
只有在 ISR 里的 Follower 才有资格被选为 Leader。
-
如果一个 Follower 同步太慢(掉队了),它会被踢出 ISR。
-
ACK 机制:当你发消息时,可以设置
acks=all,这意味着只有当 ISR 中所有的 Follower 都同步成功了,Kafka 才会告诉生产者“这条消息存好了”。
总结:Kafka 与 Redis/MySQL 主从的区别
| 维度 | 传统主从 (如 Redis/MySQL) | Kafka 主从 |
| 粒度 | 实例级:一台机器是主,其他是从 | 分区级:一台机器既是 A 的主,又是 B 的从 |
| 读写分离 | 通常主写从读 | 默认全在 Leader 读写(Follower 仅备份) |
| 一致性 | 异步或半同步 | 通过 ISR 机制严格控制 |
补充一点:虽然旧版本只能在 Leader 读,但 Kafka 2.4+ 引入了“从跟随者读取”(Follower Fetching),在某些跨数据中心场景下,消费者也可以从最近的 Follower 读取数据以节省带宽。
你想看看当一个 Broker 突然宕机时,Kafka 是如何自动完成“主从切换”的吗?