Nacos 之 Distro 协议
1. 概述
Distro协议是阿里自研的一个最终一致性协议,继承了 Gossip 以及 Eureka 通信(PeerEurekaNodes)的优点并做进一步优化而出来的:
对于原生的Gossip,由于随机选取发送消息的节点,也就不可避免存在消息重复发送给同一节点的问题,这白白浪费了网络的传输带宽,也给消息节点带来额外的处理负载,Distro算法引入了权威Server的概念,每个节点负责一部分数据以及将自己的数据同步给其他节点,有效降低了消息冗余的问题。
Distro协议保证了在某些Nacos节点宕机后,整个临时实例处理系统依旧可以正常工作,保证了各个Nacos节点对于海量注册请求的统一协调和存储。
2. 设计思想
- Nacos 每个节点是平等的都可以处理写请求, 同时把新数据同步到其他节点。
- 每个节点只负责部分数据, 定时发送自己负责数据的校验值到其他节点来保持数据⼀致性。
- 每个节点独立处理读请求, 及时从本地发出响应。
- 数据存储在缓存中,并且会在启动时进行全量数据同步,并定期进行数据校验。
3. 原理说明
在 Distro 协议的设计思想下, 每个 Distro 节点都可以接收到读写请求。 所有的 Distro 协议的请求场景主要分为三种情况:
1)数据初始化:
新加入的 Distro 节点会进行全量数据拉取。 具体操作是轮询所有的 Distro 节点, 通过向其他的机器发送请求拉取全量数据。

在全量拉取操作完成之后, Nacos 的每台机器上都维护了当前的所有注册上来的非持久化实例数据。
2)数据校验
在Distro集群启动之后,各台机器之间会定期的发送心跳。心跳信息主要为各个机器上的所有数据的元信息(之所以使用元信息,是因为需要保证网络中数据传输的量级维持在⼀个较低水平)。这种数据校验会以心跳的形式进行,即每台机器在固定时间间隔会向其他机器发起⼀次数据校验请求。
⼀旦在数据校验过程中,某台机器发现其他机器上的数据与本地数据不⼀致,则会发起⼀次全量拉取请求,将数据补齐。
3)写操作
对于⼀个已经启动完成的Distro集群,在⼀次客户端发起写操作的流程中,当注册非持久化的实例的写请求打到某台Nacos服务器时,Distro集群处理的流程图如下。

整个步骤包括几个部分(图中从上到下顺序):
① 前置的Filter拦截请求,并根据请求中包含的IP和port信息计算其所属的Distro责任节点,并将该请求转发到所属的Distro责任节点上。
② 责任节点上的Controller将写请求进行解析。
③ Distro协议定期执行Sync任务,将本机所负责的所有的实例信息同步到其他节点上。
4)读操作
由于每台机器上都存放了全量数据,因此在每⼀次读操作中,Distro机器会直接从本地拉取数据,快速响应。

这种机制保证了Distro协议可以作为⼀种AP协议,对于读操作都进行及时的响应。在网络分区的情况下,对于所有的读操作也能够正常返回;当网络恢复时,各个Distro节点会把各数据分片的数据进行合并恢复。
4. 应用场景
1)当该节点接收到属于该节点负责的实例的写请求时, 直接写入。
2)当该节点接收到不属于该节点负责的实例的写请求时, 将在集群内部路由, 转发给对应的节点,从而完成读写。
3)当该节点接收到任何读请求时, 都直接在本机查询并返回(因为所有实例都被同步到了每台机器上) 。
5. 小总结
Distro 协议作为 Nacos 的内嵌临时实例⼀致性协议, 保证了在分布式环境下每个节点上面的服务信息的状态都能够及时地通知其他节点, 可以维持数十万量级服务实例的存储和⼀致性。
Nacos 之 Distro 协议的更多相关文章
- Nacos源码分析-Distro协议概览
温馨提示: 本文内容基于个人学习Nacos 2.0.1版本代码总结而来,因个人理解差异,不保证完全正确.如有理解错误之处欢迎各位拍砖指正,相互学习:转载请注明出处. 什么是Distro协议 今天来分析 ...
- nacos服务注册之服务器端Distro
一致性协议算法Distro阿里自己的创的算法吧,网上能找到的资料很少.Distro用于处理ephemeral类型数据 Distro协议算法看代码大体流程是: nacos启动首先从其他远程节点同步全部数 ...
- 从源码看Nacos的设计
目录 客户端与集群的交互 数据同步 实例信息同步 服务集群信息 关于priv-raft协议 Nacos集群在k8s中的实践 这片博文来源于我在公司部门内的分享,我隐去了和公司项目相关的部分,重新整理, ...
- Nacos学习
Nacos是阿里开源的一个新框架,在分布式的架构中,Nacos同时扮演着服务注册中心和配置中心的角色.今天主要讲的是Nacos作为服务注册中心. 分布式中著名的CAP理论,任何一种服务注册中心都只能实 ...
- nacos服务注册源码解析
1.客户端使用 compile 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2.2.3.RELEASE' compi ...
- SpringCloud Alibaba Nacos注册中心源码浅析
一.前置了解 1.1 简介 Nacos是一款阿里巴巴推出的一款微服务发现.配置管理框架.我们本次对将对它的服务注册发现功能进行简单源码分析. 1.2 流程 Nacos的分析分为两部分,一部分是我们的客 ...
- Nacos注册中心之概要设计
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 前言 在之前的文章中分析了Nacos配置中心,配置中心的核心是配置的创建.读取.推送. 注册中 ...
- Nacos源码系列—服务端那些事儿
点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 nacos,即可免费获取源码 前言 在上节课中,我们讲解了客户端注册服 ...
- Nacos详解
Nacos是什么 欢迎来到Nocos的世界! 组成部分 全称 描述 Na naming/nameServer 即服务注册中心,与 Spring Cloud Eureka 的功能类似. co confi ...
- Nacos服务注册原理分析
在分布式服务中,原来的单体服务会被拆分成一个个微服务,服务注册实例到注册中心,服务消费者通过注册中心获取实例列表,直接请求调用服务. 服务是如何注册到注册中心,服务如果挂了,服务是如何检测?带着这些问 ...
随机推荐
- ConvTranspose的output_padding问题
当stride>=2时,反向传播,由dy, w得到dx的时候,dx的形状不唯一. 例如input_shape (7,7)或者(8,8)在kernel(3,3)上,以stride=2进行卷积, 最 ...
- J V M(三)沙箱安全机制
沙箱安全机制 Java安全模型的核心就是Java沙箱(sandbox)什么是沙箱? 沙箱是一个限制程序运行的环境.沙箱机制就是将Java代码限定在虚拟机(JVM)特定的运行范围中,并且严格限制代码对本 ...
- Python——02.变量及标识符
变量概念: -- 字面量:与字面上显示值一致的量称作字面量,在程序中可直接使用字面量:abc,123, 我是XX,等等 -- 变量:变量可通过赋值保存字面量,变量是可变的,跟随赋值的字面量不同而变化 ...
- gl-ar750 配置
镜像下载https://docs.gl-inet.com/en/3/release_notes/gl-ar750/设置sd卡安装软件https://openwrt.org/docs/guide-use ...
- No.1.4
选择器进阶 [复合选择器]:后代选择器:空格 语法:选择器1 选择器2 {css} 子代选择器:> 语法:选择器1>选择器2 {css} [并集选择器]:, 语法:选择器1 , ...
- The `.update()` method does not support writable nestedfields by default. Write an explicit `.update()` method for serializer `...`, or set `read_only=True` on nested serializer fields.解决办法
原因 Serializers中,外表的字段如source="group.title"不能进行写入操作 解决办法 将外表字段设置为read_only=True,此时可能有人就会问了: ...
- MySQL dump 备份脚本
vim db_all.sh #!/bin/sh logFile=/home/shell/db_backup.log DATE=`date +'%Y%m%d_%H_%M'` cd /home/data ...
- react native android9 axios network error
react native 发布成apk后网络请求会报 network error 是因为android9以后http协议不能用,要用htts协议.需要改成配置能兼容http协议,修改信息如下: and ...
- 打包Assetbundle
using UnityEngine;using System.Collections;using UnityEditor;/// <summary>/// 脚本位置:Editor文件夹下/ ...
- 版图 shrink
先打开模拟部分的版图,然后在ciw 里面执行 dbCreateXFormPCell(geGetEditCellView() "libName") 然后在"libName& ...