当前位置: 首页 > news >正文

Nacos架构篇 - Distro协议

Distro

它是 Nacos 社区自研的一种 AP 分布式协议(也是最终一致性协议)。它面向临时实例,保证了在某些 Nacos 节点宕机后,整个临时实例处理系统依旧可以正常工作。作为一种有状态的中间件应用的内嵌协议,Distro 保证了各个 Nacos 节点对于海量注册请求的统一协调和存储。

设计思想如下:

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

数据初始化

源码参考 DistroConsistencyServiceImpl

新加入的 Distro 节点会进行全量数据拉取。轮询所有的 Distro 节点,通过向其它机器发送请求拉取全量数据。

在全量拉取操作完成之后,Nacos 的每台机器上都维护了当前的所有注册的临时实例数据。

数据校验

源码参考 TimedSync

在 Distro 集群启动之后,每台机器会定期发送心跳。心跳信息主要为各个机器上的所有数据的元数据。这种数据校验会以心跳的形式进行,即每台机器在固定时间间隔(默认 5 秒)会向其它机器发起一次数据校验请求。

一旦在数据校验过程中,某台机器发现其它机器上的数据与本地数据不一致,则会发起一次全量拉取请求,将数据补齐。

写数据

源码参考 DistroConsistencyServiceImpl、DistroFilter、TaskScheduler

对于一个已经启动的 Distro 集群,在一次客户端发起写操作的流程中,当注册临时实例的写请求打到某台 Nacos 服务器时,Distro 集群的处理流程如下:

  • 前置的 Filter 拦截请求,并根据请求中的包含的 IP 和 port 信息计算其所属的 Distro 责任节点。当该节点接收到不属于该节点负责的实例的写请求时,将在集群内部路由,转发给对应的节点,从而完成读写。

  • 责任节点上的 Controller 将写请求进行解析。

  • Distro 协议定期执行 sync 任务,将本机所负责的所有实例信息同步到其它节点上。

读数据

由于每台机器上(数据存储在缓存中)都存放了全量数据,因此在每一次读操作中,Distro 机器会直接从本地拉取数据,快速响应。这种机制保证了 Distro 协议可以作为一种 AP 协议,对于读操作可以及时响应,即使出现网络分区的情况下,也能正常返回。等到网络恢复时,各个 Distro 节点会把各数据分片的数据进行合并恢复。这一段暂时没有找到对应的源码。

关于一致性的操作抽离在 ConsistencyService 接口上,并且在实现具体的一致性协议时实现了插件可插拔的形式。

public interface ConsistencyService {/*** Put a data related to a key to Nacos cluster.** @param key   key of data, this key should be globally unique* @param value value of data* @throws NacosException nacos exception*/void put(String key, Record value) throws NacosException;/*** Remove a data from Nacos cluster.** @param key key of data* @throws NacosException nacos exception*/void remove(String key) throws NacosException;/*** Get a data from Nacos cluster.** @param key key of data* @return data related to the key* @throws NacosException nacos exception*/Datum get(String key) throws NacosException;/*** Listen for changes of a data.** @param key      key of data* @param listener callback of data change* @throws NacosException nacos exception*/void listen(String key, RecordListener listener) throws NacosException;/*** Cancel listening of a data.** @param key      key of data* @param listener callback of data change* @throws NacosException nacos exception*/void unListen(String key, RecordListener listener) throws NacosException;/*** Tell the status of this consistency service.** @return true if available*/boolean isAvailable();
}
http://www.lryc.cn/news/22980.html

相关文章:

  • 和月薪3W的聊过后,才知道自己一直在打杂...
  • 关于Ubuntu18.04 root账户登录的问题
  • 基于jeecgboot的flowable的H5版本在演示系统发布
  • 【代码训练营】day44 | 完全背包理论 518. 零钱兑换 II 377. 组合总和 Ⅳ
  • ICA简介:独立成分分析
  • ②【Java 组】蓝桥杯省赛真题解析 [振兴中华] [三部排序] 持续更新中...
  • PostgreSql 视图
  • 【PAT甲级题解记录】1150 Travelling Salesman Problem (25 分)
  • vue生命周期
  • 排查解决Java进程占用内存过高
  • 一个基于 LKM 的 Linux 内核级 rootkit 的实现
  • CAN工具 - ValueCAN - 基础介绍(续)
  • 一个Laravel+vue免费开源的基于RABC控制的博客系统
  • 从 B 站出发,用 Chrome devTools performance 分析页面如何渲染
  • Java异常Throwable的分类
  • 【mybatis的#和$使用和区别】
  • 感知趋势,洞察发展:2023(第十届)趋势与预测大会成功举办
  • Spring-Aop核心技术
  • webpack常用优化原理剖析
  • 【现在努力还不晚】--MySQL数据库的数据模型
  • 二手商品交易网站
  • 第三阶段04-同步请求和异步请求,get/post,Josn,pojo,Session/Cookie,过滤器Filter
  • Spark学习:spark相似算子解析
  • MySQL操作数据表-----------创建数据表(一)
  • Java “框架 = 注解 + 反射 + 设计模式” 之 注解详解
  • 特斯拉4D雷达方案首次曝光!高阶智驾市场比拼安全冗余
  • Echarts 每个柱子一种渐变色的象形柱状图
  • 叠氮试剂79598-53-1,6-Azidohexanoic Acid,6-叠氮基己酸,末端羧酸可与伯胺基反应
  • Nginx网站服务——编译安装、基于授权和客户端访问控制
  • Spring Boot 版本升级2.2.11.RELEASE至2.7.4