Nacos 集群通过 Raft 协议与 Distro 协议的混合设计实现不同场景下的数据一致性保障,具体机制如下:
一、Raft 协议(强一致性,CP 模式)
1. 核心机制
- Leader 选举:
- 节点通过投票机制选出 Leader,只有 Leader 能处理写请求。
- 选举依据 Term(任期)和日志完整性,确保数据连续性。
- 日志复制:
- 写操作先追加到 Leader 的日志中,广播给所有 Follower。
- 多数派确认:当超过半数节点(含 Leader)确认日志后,数据才提交生效。
- 数据持久化:
- 日志写入本地 WAL(Write-Ahead Log)文件,定期生成快照存储于
raft/snapshot
目录。 - 故障恢复时通过日志重放恢复数据。
- 日志写入本地 WAL(Write-Ahead Log)文件,定期生成快照存储于
2. 一致性保障
- 强一致性:所有读请求由 Leader 响应,保证客户端始终读取最新数据。
- 容错性:允许最多 (N-1)/2 个节点故障(N 为集群节点数)。
- 适用场景:配置管理、持久化实例存储等对一致性要求高的场景。
二、Distro 协议(最终一致性,AP 模式)
1. 核心机制
- 分片与路由:
- 每个节点负责部分数据分片,客户端请求通过哈希算法路由到负责节点。
- 节点间通过心跳同步分片元数据,动态调整路由表。
- 异步批量同步:
- 数据变更先写入本地内存,随后批量异步复制到其他节点。
- 采用 Gossip 协议传播变更事件,减少网络开销。
- 健康检查与补偿:
- 节点间定时互发心跳,检测存活状态。
- 发现数据不一致时,触发增量同步(如 MD5 校验差异)。
2. 一致性保障
- 最终一致性:数据变更在秒级内传播至所有节点。
- 去中心化:无单点故障,任意节点均可处理读写请求。
- 适用场景:服务注册发现等临时实例管理,强调高可用性。
三、协议对比与协同设计
维度 | Raft 协议 | Distro 协议 |
---|---|---|
一致性模型 | 强一致性(CP) | 最终一致性(AP) |
数据存储 | 全量副本(所有节点存储完整数据) | 分片存储(节点仅存储部分数据) |
写性能 | 较低(需多数节点确认) | 较高(本地写入 + 异步传播) |
容错性 | 依赖 Leader 存活 | 容忍网络分区与节点故障 |
典型应用模块 | 配置中心、持久化实例 | 服务注册发现(临时实例) |
协同策略:
- 模块隔离:配置管理(Raft)与服务发现(Distro)独立运行,避免协议冲突。
- 混合部署:同一集群可同时运行两种协议,通过元数据标识数据类型(如
ephemeral
字段区分实例类型) 。 - 兜底同步:Distro 协议定期全量数据校验,Raft 协议通过快照修复极端不一致场景 。
四、硬件与网络依赖
- 网络基础:需开放 7848(Raft 通信)、8848(HTTP API)、9848(gRPC)等端口,保证节点间低延迟通信 。
- 存储要求:
- Raft 依赖本地磁盘存储日志(SSD 推荐),Distro 数据暂存内存(需足够 RAM) 。
- 持久化数据(如配置)可外接 MySQL 集群增强可靠性 。
五、设计哲学总结
- 场景驱动:
- Raft:优先满足配置管理的强一致性需求,牺牲部分可用性。
- Distro:优先保障服务发现的可用性,接受短暂数据不一致。
- 性能平衡:
- Raft 通过日志批处理提升吞吐,Distro 通过分片降低单节点压力。
- 扩展性:
- Distro 支持动态扩缩容,Raft 通过 Leader 代理简化客户端交互。
通过上述设计,Nacos 在微服务架构中实现了 配置强一致 与 服务高可用 的协同,成为兼顾 CP/AP 特性的典型中间件。源码实现可参考:
- Raft 核心:
com.alibaba.nacos.core.cluster.raft.RaftCore
- Distro 同步:
com.alibaba.nacos.naming.consistency.ephemeral.distro.DistroProtocol