Nacos AP/CP 模式切换原理
Nacos 同时支持 AP 和 CP 模式,它是怎么做到的?背后的 Raft 和 Distro 协议各自解决什么问题?
一、注册中心的 CAP 困境
- 1.1 为什么注册中心需要 CAP 选择
- 1.2 Eureka 的 AP 选择——优先可用性
- 1.3 ZooKeeper 的 CP 选择——优先一致性
- 1.4 Nacos 的混合选择——可切换
二、Nacos 的 AP 模式——Distro 协议
- 2.1 Distro 的设计目标——最终一致性 + 高可用
- 2.2 数据同步机制——每个节点都能写入
- 2.3 健康检查——临时实例的心跳检测
- 2.4 Distro 的一致性保证——异步复制 + 对账
三、Nacos 的 CP 模式——Raft 协议
- 3.1 Raft 的基本概念——Leader / Follower / Candidate
- 3.2 Leader 选举过程——Term + Vote
- 3.3 日志复制——过半写入确认
- 3.4 Nacos 中的 Raft 实现——
JRaft
四、临时实例 vs 持久化实例
- 4.1 临时实例——AP 模式,心跳保活
- 4.2 持久化实例——CP 模式,主动健康检查
- 4.3 什么场景用哪个——微服务用临时,DNS/核心服务用持久化
五、健康检查机制
- 5.1 客户端心跳——临时实例的 5 秒心跳
- 5.2 服务端主动探测——TCP/HTTP/MYSQL 探针
- 5.3 保护阈值——防止网络抖动导致全部下线
六、源码核心流程
- 6.1 服务注册——
InstanceController.register() - 6.2 服务发现——
InstanceController.list() - 6.3 Distro 同步——
DistroConsistencyServiceImpl.put() - 6.4 客户端订阅——UDP 推送 + 定时轮询
七、总结
- Nacos 的设计哲学——稳定压倒一切
- 生产环境配置建议
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!