Nacos一致性协议 CP/AP/JRaft/Distro协议

Nacos因为要支持多种服务类型的注册,并能够具有机房容灾、集群扩展等必不可少的能力,在单个集群中同时运行CP协议和AP协议两种协议。在决定使用CP还是AP⼀致性时,使用⼀个代理,通过可控制的规则进行转发。
目前的⼀致性协议实现,⼀个是基于Raft的CP⼀致性,⼀个是基于自研协议Distro的AP一致性。


Raft协议

Nacosv1.x采用的是Raft协议,v2.x改为JRaft协议。Raft协议不必多言,是CP协议,基于Leader进行写入。


Distro协议

Distro协议是Nacos社区自研的⼀种AP分布式协议,是面向临时实例设计的⼀种分布式协议,其保证了在某些Nacos节点宕机后,整个临时实例处理系统依旧可以正常工作。其数据存储在缓存中,并且会在启动时进行全量数据同步,并定期进行数据校验。每个Distro节点都可以接收到读写请求。

Distro协议的主要设计思想如下:

  1. Nacos每个节点是平等的都可以处理写请求,同时把新数据同步到其他节点。
  2. 每个节点只负责部分数据,定时发送自己负责数据的校验值到其他节点来保持数据⼀致性。
  3. 每个节点独立处理读请求,及时从本地发出响应。

Distro协议工作原理:

  1. 数据初始化,新加入的Distro节点会进行全量数据拉取。具体操作是轮询所有的Distro节点,通过向其他的机器发送请求拉取全量数据。在全量拉取操作完成之后,Nacos的每台机器上都维护了当前的所有注册上来的非持久化实例数据。
  2. 数据校验,在Distro集群启动之后,各台机器之间会定期的发送心跳进行数据校验。如果某台机器校验发现与其他机器数据不一致,则会进行全量拉去请求将数据补齐。
  3. 写操作,当注册非持久化的实例的写请求打到某台Nacos服务器时,首先被Filter拦截,根据请求的IP端口信息转发到对应的Distro责任节点上处理请求。Distro协议还会定期执行Sync任务,将本机所负责的所有的实例信息同步到其他节点上。
  4. 读操作,由于每台机器上都存放了全量数据,因此在每⼀次读操作中,Distro机器会直接从本地拉取数据,快速响应。


服务注册发现采用AP协议

为了保障可用性,尽最大可能保证服务注册发现能力可以对外提供服务,Nacos的服务注册发现采取了心跳可自动完成服务数据补偿的机制。如果数据丢失的话,是可以通过该机制快速弥补数据丢失,并保障最终一致性。


配置管理采用CP协议

配置数据,是直接在Nacos服务端进行创建并进行管理的,必须保证大部分的节点都保存了此配置数据才能认为配置被成功保存了。为了避免丢失配置变更引起严重故障,使用了强⼀致性共识算法,保障集群中大部分的节点是强⼀致的。


配置中心的一致性协议

Server间的⼀致性协议,有DB模式(读写分离架构),⼀致性的核心是Server与DB保持数据⼀致性,从而保证Server数据⼀致。Server之间都是对等的,数据写任何⼀个Server,优先持久化,持久化成功后异步通知其他节点到数据库中拉取最新配置值,并且通知写入成功。
Server间的⼀致性协议,无DB模式Server间采用Raft协议保证数据⼀致性。
SDK与Server的⼀致性协议,通过MD5值是否⼀致实现,如果不⼀致就拉取最新值。

你可能感兴趣的:(中间件,java,Nacos,AP,CP,Distro)