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服务注册原理分析
在分布式服务中,原来的单体服务会被拆分成一个个微服务,服务注册实例到注册中心,服务消费者通过注册中心获取实例列表,直接请求调用服务. 服务是如何注册到注册中心,服务如果挂了,服务是如何检测?带着这些问 ...
随机推荐
- 在uniapp中,定义导航栏左侧,右侧按钮
在page.json中 代码: { "path": "pages/pandian", "style": { "navigation ...
- 音视频技术入门课- 05 使用FFmpeg与OBS进行直播推流
做直播推流的前提是要有直播服务器接收直播流,所以需要我们自己建设一个流媒体服务器. 流媒体服务器SRS SRS是一个简单高效的实时视频服务器,支持RTMP/WebRTC/HLS/HTTP-FLV/SR ...
- vue组件之间的传参
vue组件之间传参有三种传参方式'父传子','子传父','非父子组件之间传值' 父传子 父组件 <template> <CounterCom :num="5"&g ...
- SVN安装配置手册
1.官网下载相关的服务端的安装包 SVN(版本控制器): SVN-客户端:TortoiseSVN SVN-服务端:VisualSVN 下载地址: TortoiseSVN:https://tortois ...
- Codeforces Round #781 (Div. 2) - D. GCD Guess
GCD + 位运算 [Problem - 1665D - Codeforces](https://codeforces.com/problemset/problem/1627/D) 题意 交互题,有一 ...
- 函数调用_通过apply和call方法调用
不同类型函数调用之间的主要区别在于:最终作为函数上下文(可以通过this参数隐式引用到)传递给执行函数对象不同.对于方法而言,即为所在的对象:对于函数而言是window或是undefined(取决于是 ...
- ABAP 选择屏幕内的组件以及使用
选择屏幕组件 主要记录了ABAP编程中选择屏幕常用的组件 选择框 范围选择框 radio单选 check选择 单行展现 配合radio和check使用较多 下拉框 自定义下拉框 按钮 文件框 文字帮助 ...
- 怎么解决CMD下执行Go出现中文乱码问题?
目录 1.报错信息如下 2.原因分析 3.解决方法 4.封装处理乱码方法 5.解决乱码完整代码 1.报错信息如下 2.原因分析 因为Go的编码是UTF-8,而CMD的活动页是cp936(GBK),因此 ...
- python web学习
Web http.server 最简单的,一句命令搞定: # python -m http.server 8001 然后一个常见的文件目录下载竟然就搞定了,太神奇了: WSGI接口 Web Serve ...
- predixy安装
#predixy安装#下载predixy-1.0.5-bin-amd64-linux.tar.gz,这个是编译好的,下载就可以使用tar -xzvf predixy-1.0.5-bin-amd64-l ...