Nacos 集群中,Leader 节点和 Follower 节点分别负责什么?
在 Nacos 集群中,Leader(领导者) 和 Follower(跟随者) 的概念主要存在于其使用 Raft 一致性协议 的场景中。
Nacos 的核心功能分为两大块:配置中心 (Config) 和 注册中心 (Naming)。
- 配置中心:始终使用 Raft 协议(强一致性),因此严格区分 Leader/Follower。
- 注册中心:
- 如果是持久化服务(CP模式),使用 Raft 协议,区分 Leader/Follower。
- 如果是临时服务(AP模式,默认 Spring Cloud 方式),使用 Distro 协议(对等协议),不区分严格的 Leader/Follower(每个节点都是自己负责数据的 Leader)。
以下主要针对 Raft 协议场景(配置中心及 CP 模式注册中心) 来详细解释两者的职责:
1. Leader 节点(领导者)
Leader 是集群中的核心主导节点,通过选举产生,通常一个 Raft Group 中只有一个 Leader。
主要职责:
- 处理所有写请求(Write):
- 这是 Leader 最核心的职责。所有的数据变更(如发布配置、修改配置、注册持久化服务)请求,必须由 Leader 处理。
- 如果 Client 将写请求发送给了 Follower,Follower 会将请求转发给 Leader。
- 日志复制(Log Replication):
- Leader 接收到写请求后,会将数据变更生成日志条目(Log Entry)。
- Leader 负责将这些日志同步复制给所有的 Follower 节点。
- 只有当大多数(Quorum,即 N/2 + 1) 节点确认接收并持久化了日志后,Leader 才会提交该事务,并返回成功给客户端。
- 维持心跳(Heartbeat):
- Leader 会周期性地向所有 Follower 发送心跳包。
- 这不仅是为了同步数据,更是为了宣示主权:“我还活着,不要发起新的选举”。
2. Follower 节点(跟随者)
Follower 是 Leader 的备份和潜在的接班人。
主要职责:
- 处理读请求(Read):
- Follower 可以直接处理客户端的查询(读)请求(在 Nacos/JRaft 的实现中,为了保证线性一致性读,Follower 处理读请求时通常也会向 Leader 确认当前数据是否最新,或者直接由 Leader 处理读)。
- 转发写请求:
- 如果 Follower 接收到了客户端的“写”请求(如修改配置),它不能直接处理,而是必须将其转发给当前的 Leader 节点。
- 数据同步与持久化:
- 被动接收来自 Leader 的日志复制请求(AppendEntries)。
- 将日志写入本地磁盘,并向 Leader 发送确认(ACK)。
- 当收到 Leader 的提交指令后,将日志应用到状态机(使数据生效)。
- 参与选举(Failover):
- 如果 Follower 在一定时间内(超时时间)没有收到 Leader 的心跳,它会认为 Leader 挂了。
- 此时,Follower 会将自己转变为 Candidate(候选人),发起新一轮的投票选举,试图成为新的 Leader。
3. 总结对比表
| 特性 | Leader (领导者) | Follower (跟随者) |
|---|---|---|
| 写请求 (增删改) | 直接处理,并同步给其他节点 | 不能处理,需转发给 Leader |
| 读请求 (查询) | 可以处理 | 可以处理 (需保证一致性) |
| 数据一致性 | 数据源头,负责发起同步 | 数据副本,被动接收同步 |
| 集群地位 | 拥有决策权,维持集群心跳 | 听从指令,监控 Leader 状态 |
| 故障处理 | 自身故障会导致集群重新选举 | 自身故障不影响集群运行 (只要存活节点 > 半数) |
特别补充:AP 模式(Distro 协议)
如果你使用的是 Nacos 作为 服务发现(Service Discovery),且注册的是临时实例(Ephemeral Instances,例如 Spring Cloud Alibaba 默认配置):
- 此时 Nacos 使用 Distro 协议。
- 没有全局的 Leader。
- Peer-to-Peer(点对点):每个节点都是平等的。
- 每个节点负责一部分服务的读写(分片机制)。
- 如果一个节点挂了,其他节点会接管其负责的服务,保证高可用(AP),但不保证强一致性。
一句话总结:当你问 Leader/Follower 时,通常是指 Nacos 的配置中心功能,或者 CP 模式下的服务注册功能。Leader 负责写和统筹,Follower 负责读和备份。