Distro为阿里巴巴自研的AP一致性协议算法,目前主要应用在Nacos框架中。Distro 参考了内部 ConfigServer 和开源 Eureka,重点做了一些逻辑的优化和性能的调优。
Distro 协议被定位为临时数据的一致性协议:该类型协议,不需要把数据存储到磁盘或者数据库,因为临时数据通常和服务器保持一个session会话,该会话只要存在,数据就不会丢失。Distro 协议保证写必须永远是成功的,即使可能会发生网络分区。当网络恢复时,把各数据分片的数据进行合并。
一、核心思想
类一致性Hash算法:
Distro将数据分为多个block,每个server节点负责处理其中一个block中的数据。同时server节点会通过数据同步来实现数据最终一致性。
二、特性
数据同步
- 服务端节点都存储所有数据,但每个节点只负责其中一部分服务。在接收到客户端的“写”(注册、心跳、下线等)请求后服务端节点判断请求的服务是否为自己负责,如果是则处理,否则交由负责的节点处理。
- 负责的节点在接收到服务注册、服务心跳等写请求后将数据写入后即返回,后台异步地将数据同步给其他节点。
健康检查
- 注册成功后每隔一段时间向服务端发送一次心跳(心跳包需要带上注册服务的全部信息)。在客户端看来服务端节点对等,所以请求的节点是随机的,如果请求失败则换一个节点重新发送请求。
- 服务端在接收到客户端的服务心跳后,如果该服务不存在,则将该心跳请求当做注册请求来处理。
- 服务端如果长时间未收到客户端心跳,则下线该服务。
- 每个服务端节点主动发送健康检查到其他节点,响应的节点被该节点视为健康节点。
AP
- 节点在收到读请求后直接从本机获取后返回,无论数据是否为最新。
三、节点寻址
Distro协议服务端节点发现使用寻址机制来实现服务端节点的管理。在Nacos中,寻址模式有三种:
1、单机模式:StandaloneMemberLookup
2、文件模式:FileConfigMemberLookup
利用监控cluster.conf文件的变动实现节点的管理。核心代码如下:

3、服务器模式
AddressServerMemberLookup – 使用地址服务器存储节点信息,服务端节点定时拉取信息进行管理

核心代码如下: 
四、数据同步
1、全量同步
请求Node
响应Node

2、增量同步
请求Node

新增数据使用异步广播同步:
- DistroProtocol 使用 sync() 方法接收增量数据
- 向其他节点发布广播任务
- 调用 distroTaskEngineHolder 发布延迟任务
- 调用 distroTaskEngineHolder 发布延迟任务
- 调用 DistroDelayTaskProcessor.process() 方法进行任务投递:将延迟任务转换为异步变更任务
- 执行变更任务 DistroSyncChangeTask.run() 方法:向指定节点发送消息
- 调用 DistroHttpAgent.syncData() 方法发送数据
- 调用 NamingProxy.syncData() 方法发送数据
- 调用 DistroHttpAgent.syncData() 方法发送数据
- 异常任务调用 handleFailedTask() 方法进行处理
- 调用 DistroFailedTaskHandler 处理失败任务
- 调用 DistroHttpCombinedKeyTaskFailedHandler 将失败任务重新投递成延迟任务。
- 调用 DistroFailedTaskHandler 处理失败任务
响应Node
3、数据校验
请求Node
响应Node


