Nacos简介—2.Nacos的原理简介
大纲
1.Nacos集群模式的数据写入存储与读取问题
2.基于Distro协议在启动后的运行规则
3.基于Distro协议在处理服务实例注册时的写路由
4.由于写路由造成的数据分片以及随机读问题
5.写路由 + 数据分区 + 读路由的CP方案分析
6.基于Distro协议的定时同步机制
7.基于Distro协议的心跳校验下的数据同步补偿机制
8.基于Raft协议实现的弱CP模式
9.Nacos集群模式下的lookup寻址机制
1.Nacos集群模式的数据写入存储与读取问题
使用Nacos进行服务注册时,需要解决如下问题:
一.应该找集群里的哪个节点来发起服务注册?
二.服务实例数据应该存储在集群的哪个节点?
三.应该找集群里的哪个节点来发起服务发现?
2.基于Distro协议在启动后的运行规则
(1)Nacos集群启动后会按如下规则运行
(2)Distro协议 + 定时数据同步与AP + 心跳检验与网络分区
(1)Nacos集群启动后会按如下规则运行
一.Nacos集群的每个节点都可以处理写请求
Nacos集群节点收到写请求后:首先根据要注册的服务实例的IP:端口 + 路由算法,计算出所属集群节点。然后把服务实例注册请求转发到负责该服务实例数据的集群节点中。接着负责该服务实例数据的集群节点就会解析请求,把数据存储到内存里。同时会定期执行同步任务,把本节点负责的数据同步到其他节点。最终每个节点都会存储全量的服务实例数据。
二.新加入Nacos集群的节点会拉取全量数据
新加入Nacos集群的节点会轮询Nacos集群的所有节点,然后发送请求出去拉取各节点的数据,所以Nacos集群的每个节点上都会有所有已注册的服务实例的数据。
三.每个节点都会定期发送心跳给其他节点
Nacos集群的节点通过心跳请求进行数据校验,主要是交换数据的校验值。如果发现其他节点上的数据与自己的不一致,就会全量拉取数据进行补齐。
四.Nacos集群的每个节点都可以处理读请求
因为每个节点都有全量数据,所以每个节点都可以处理读请求。
(2)Distro协议 + 定时数据同步与AP + 心跳检验与网络分区
Distro协议兼顾了CAP中的AP。在这个协议下,所有节点通过定期数据同步 + 心跳校验实现数据最终一致。这个协议能让每个节点都有全量数据。
如果出现某节点宕机,不影响集群可用性。如果出现网络分区,同样不影响集群可用性。因为不同的网络分区只会读写分区中的Nacos节点,此时只是没办法同步数据而已。虽然数据会不一致,但一旦分区恢复后,心跳校验机制运作起来,数据会自动补齐。
3.基于Distro协议在处理服务实例注册时的写路由
首先,服务实例会随机选择Nacos集群中的一个节点发起注册请求。
然后,Nacos集群节点收到写请求后:会根据要注册的服务实例的IP:端口 + 路由算法,计算出所属的集群节点。
接着,把服务实例注册请求转发到负责该服务实例数据的集群节点中。负责该服务实例数据的节点会解析请求,缓存服务实例数据到内存中。
4.由于写路由造成的数据分片以及随机读问题
由于Nacos集群节点收到写请求后:会根据要注册的服务实例的IP:端口 + 路由算法,计算出所属的集群节点。所以会导致数据分片,即每个节点仅负责管理一部分的服务实例数据。
服务实例进行服务发现时,只能随机选择一个Nacos节点来读取数据。对Nacos集群节点进行随机读的时候,由于每个节点只负责处理部分数据,所以可能出现读取不到刚向集群注册的数据的随机读问题。
5.写路由 + 数据分区 + 读路由的CP方案分析
在数据分区 + 随机读的情况下,此时为了读取到数据,有两种解决方案。
方案一:让随机选择的节点重新进行读路由
方案二:让随机选择的节点也拥有全部数据
如果采用方案一,也就是写路由 + 数据分片 + 读路由的架构设计。那么读写某个服务实例的数据,只能由Nacos集群中的其中一个节点处理。如果节点宕机,那么对应的该服务实例数据就不可用。虽然该节点的数据不可用,但也是对所有用户都不可用,视图是一致的。视图是一致的,说明要么都能读到数据,要么都读不到数据。所以这种方案会存在可用性的问题,但优点是数据是强一致的。也就是牺牲了CAP中的A,没有了可用性,但保证了CP。
Nacos的Distro协议则使用了方案二。某个节点宕机后,该节点的数据不会全部不可用,可能会丢失部分数据。也就是牺牲了CAP中的C,不能确保强一致性,但保证了AP。加上Distro协议的同步机制,可以让各节点的数据实现最终一致性。
6.基于Distro协议的定时同步机制
Nacos集群中的每个节点,虽然通过写路由只写入由自己处理的数据,但同时也会定期执行同步任务,把本节点负责的数据同步到其他节点,最终每个节点都会存储全量的集群数据。
同步机制的存在保证了各节点的数据最终是一致的。
7.基于Distro协议的心跳校验下的数据同步补偿机制
Nacos集群的节点通过心跳请求进行数据校验,主要是交换数据的校验值。如果发现其他节点上的数据与自己的不一致,就会全量拉取数据进行补齐。
当出现网络分区时,两分区间的节点无法通信,此时自然就无法定时同步。但当分区恢复后,节点之间通过心跳校验机制,数据可以快速自动补齐。
8.基于Raft协议实现的弱CP模式
Nacos集群节点在启动时会选举出一个Leader节点,由Leader节点负责数据的写入,并将数据同步给其他节点。Leader节点成功写入数据的判断依据是,过半节点都成功同步数据了。
9.Nacos集群模式下的lookup寻址机制
(1)单机寻址
(2)文件寻址
(3)地址服务器寻址
寻址就是Nacos各节点启动时如何找到其他节点。
(1)单机寻址
Nacos通过"-m standalone"模式来启动时,会读取自己本机的IP:端口,然后构造对象放入到ServerMemberManager,它是专门负责管理所有节点信息的组件。
(2)文件寻址
cluster.conf里会写入各个节点地址,节点启动时会读取这个文件的内容。同时节点会针对这个文件施加监听器,如果发现文件有变动,会进行重新读取。但是需要手工维护每个节点的cluster.conf文件,比较适合常规的、三节点、小规模的生产集群部署。
(3)地址服务器寻址
如果Nacos需要进行大规模的集群部署,一般会采用这个方案。也就是使用一个Web服务器来维护一份cluster.conf,然后所有的Nacos都定时请求这个Web服务器获取最新的地址列表。
Nacos简介—2.Nacos的原理简介的更多相关文章
- storm 原理简介及单机版安装指南——详细版【转】
storm 原理简介及单机版安装指南 本文翻译自: https://github.com/nathanmarz/storm/wiki/Tutorial 原文链接自:http://www.open-op ...
- Java进阶(二十四)Java List集合add与set方法原理简介
Java List集合add与set方法原理简介 add方法 add方法用于向集合列表中添加对象. 语法1 用于在列表的尾部插入指定元素.如果List集合对象由于调用add方法而发生更改,则返回 tr ...
- kafka原理简介并且与RabbitMQ的选择
kafka原理简介并且与RabbitMQ的选择 kafka原理简介,rabbitMQ介绍,大致说一下区别 Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和 ...
- InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)
上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢? 测试代码 p ...
- Nginx 负载均衡原理简介与负载均衡配置详解
Nginx负载均衡原理简介与负载均衡配置详解 by:授客 QQ:1033553122 测试环境 nginx-1.10.0 负载均衡原理 客户端向反向代理发送请求,接着反向代理根据某种负载机制 ...
- Nginx 反向代理工作原理简介与配置详解
Nginx反向代理工作原理简介与配置详解 by:授客 QQ:1033553122 测试环境 CentOS 6.5-x86_64 nginx-1.10.0 下载地址:http://nginx. ...
- Linux DNS原理简介及配置
Linux DNS原理简介及配置 DNS简介 DNS原理 域名解析的过程 资源记录 DNS BIND安装配置 一.简介 一般来讲域名比IP地址更加的有含义.也更容易记住,所以通常用户更习惯输入域名来访 ...
- Oracle Golden Gate原理简介
Oracle Golden Gate原理简介 http://www.askoracle.org/oracle/HighAvailability/20140109953.html#6545406-tsi ...
- Linux SSH基于密钥交换的自动登陆原理简介及配置说明
一.原理简介 SSH证书认证登录的基础是一对唯一匹配密钥: 私钥(private key)和公钥(public key).公钥用于对数据进行加密,而且只能用于加密.而私钥只能对使用所匹配的公钥,所加密 ...
- Socket通信原理简介
Socket通信原理简介 字数1011 阅读1766 评论2 喜欢11 何谓socket 计算机,顾名思义即是用来做计算.因而也需要输入和输出,输入需要计算的条件,输出计算结果.这些输入输出可以抽象为 ...
随机推荐
- .Net Core报“‘GB2312‘ is not a supported encoding name. For information on defining a custom encod”的错误
1.问题描述 在.Net Core中使用Encoding.GetEncoding("GB2312")报如下错误: System.ArgumentException:"'G ...
- linux mint下安装截图工具
在linux下尝试了多款截图工具,综合下来,觉得shutter是最好用的,推荐大家使用. Shutter 是一个强大的截图工具,强大的功能集成到一个直观的简洁界面,应用程序自带多个区域截图(如全屏,选 ...
- Luogu P10842 Piggy and Trees 题解 [ 绿 ] [ 拆边 ] [ 贡献思维 ] [ 组合数学 ]
Piggy and Trees:把路径拆成边的思维题. 思路 一看到这题的路径,就想到了 Luogu P3177 树上染色 这题化路径为边的贡献,分别计算的思维. 那么对于此题,先来观察题目里式子的意 ...
- HT-014 Div3 扫雷 题解 [ 绿 ] [ 二维差分 ]
分析 观察到是曼哈顿距离 \(\le r\) 的范围可以扫到,联想到如下图形: 左边是 \(r=1\) 可以扫到的范围,右边是 \(r=2\) 可以扫到的范围. 于是,我们只要对这样的图形在 \(10 ...
- 百万架构师第四十二课:Nginx:Nginx 的初步认识|JavaGuide
百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 公众号:不止极客 Nginx 的初步认识及配置 课程目标 Nginx 在分布式架构中的应用分析 常用的 Web ...
- Java8 stream 提取对象 List 中的某一字段生成新的 List
//输出List StudentInfo.printStudents(studentList); //从对象列表中提取一列(以name为例) List<String> nameList = ...
- C# Lambda || Linq 效率问题
255条数据 static void Main() { List<IPEndPoint> list = new List<IPEndPoint>(); for (int i = ...
- 【BUUCTF】Easy MD5
[BUUCTF]Easy MD5 (SQL注入.PHP代码审计) 题目来源 收录于:BUUCTF BJDCTF2020 题目描述 抓包得到提示 select * from 'admin' where ...
- 开箱即用的go-zero示例
一.概述 开箱即用的 go-zero 示例,内置 api.scheduler.queue.script 服务. 框架初始版本基于 go-zero 框架的 1.5.5 版本,后续会参考 go-zero ...
- Qt Qss 设置QPushButton图标和背景
文章目录 Qt QSS 设置 QPushButton的图标叠加背景 前言 解决方法 background-repeat.background-position 最终样式 Qt QSS 设置 QPush ...