首页 > 其他分享 >Nacos和Consul的区别

Nacos和Consul的区别

时间:2023-07-15 16:57:08浏览次数:30  
标签:服务 区别 Consul Nacos 一致性 实例 node1 node2

一、CAP理论

在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。

1、CP架构

如下图,当node1发生异常时,node1的i的值为1,而因为node1发生了异常,导致node1和node2之间的复制通道断开,node2中i的值还为2,为了保证数据一致性,即使node2还是正常的,可以访问的,当client客户端调用node2时,node2还是得返回error。这种情况下,在node1发生异常时(Partition Tolerance),系统保证了数据一致性(Consistence),而违背了可用性(Availability)。

2、AP架构

如下图,当node1发生异常时,node1的i的值为1,而因为node1发生了异常,导致node1和node2之间的复制通道断开,node2中i的值还为2,为了保证可用性,即使node2未达到一致性,当client客户端调用node2时,node2还是会返回2。这种情况下,在node1发生异常时(Partition Tolerance),系统保证了可用性(Availability),而违背了数据一致性(Consistence)。注意:这里 N2 节点返回 2,虽然不是一个“正确”的结果,但是一个“合理”的结果,因为2是旧的数据,并不是一个错乱的值,只是不是最新的数据而已。

3、Consul:CP

1. Consul 遵循CAP原理中的CP原则,保证了强一致性和分区容错性,且使用的是Raft算法,比zookeeper使用的Paxos算法更加简单。虽然保证了强一致性,但是可用性就相应下降了,例如服务注册的时间会稍长一些,因为 Consul 的 raft 协议要求必须过半数的节点都写入成功才认为注册成功 ;在leader挂掉了之后,重新选举出leader之前会导致Consul 服务不可用。

2. Consul强一致性(C)带来的是:

a. 服务注册会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认为注册成功

b. Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。

4、Nacos:AP(默认)+CP

一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模。当前主流的服务如Spring cloud和 Dubbo服务,都适用于AP模式。AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。

· URL指令:$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP

二、Nacos雪崩保护

1. yml添加`ephemeral`配置,nacos在服务详情设置保护阈值(例如设置0.5)

2. 这样当此服务宕机后,nacos服务列表还会有此服务实例存在(假如有10个此服务的实例)

3. 假设此时有6台挂掉了(6/10<0.5),那么服务列表显示4台健康、6台不健康。

4. 当新的请求来临时,为了防止所有请求都打到那4台健康服务器,导致那4台服务器被压垮,进而出现服务雪崩。

5. 那么nacos会把部分请求也分配到那6台不健康的服务器上,虽然有些请求会出现错误,但是避免了服务雪崩导致的整体业务不可用。

三、Nacos自动注销实例

ephemeral: false #雪崩保护:true:服务实例以"临时"方式注册,当服务实例意外终止不再发送心跳时,Nacos会将该实例自动注销。false:服务实例以"持久"的方式注册,即使服务实例意外终止或不再发送心跳,Nacos也会保持该实例的注册状态,直到显式注销或服务实例被删除

 

标签:服务,区别,Consul,Nacos,一致性,实例,node1,node2
From: https://www.cnblogs.com/yifanSJ/p/17556476.html

相关文章

  • vue中$set和$forceUpdate强制更新视图层的区别
    $forceUpdate原理:调用notify() 强制视图更新  $set原理:defineReactive(this.data数据,要劫持得数组索引或对象键,默认值)   建立响应式依赖  指定数据更新使用场景:如果data数据的层级过深,导致无法响应式显示解决方法一:$set()this.$set(target,key,value)解......
  • C语言 #ifdef 和 #if defined区别
    注意两者都有个define的作用,区别在于使用方式上。前者的通常用法是:\#ifdefXXX....\#else....\#endif只能在两者中选择是否有定义。对于后者,常用法是:\#ifdefinedxxx1....\#elifdefinedxxx2....\#elifdefinedxxx3....\#endif......
  • 7.null和undefined的区别
    7.null和undefined的区别?首先Undefined和Null都是基本数据类型,这两个基本数据类型分别都只有一个值,就是undefined和null。undefined代表的含义是未定义,null代表的含义是空对象。一般变量声明了但还没有定义的时候会返回undefined,null主要用于赋值给一些可能会返......
  • 122.get和post请求在缓存方面的区别
    122.get和post请求在缓存方面的区别相关知识点:get请求类似于查找的过程,用户获取数据,可以不用每次都与数据库连接,所以可以使用缓存。post不同,post做的一般是修改和删除的工作,所以必须与数据库交互,所以不能使用缓存。因此get请求适合于请求缓存。回答:缓存一般只适用......
  • springcloud启动后读取不到nacos上启动文件
    问题:在确认nacos和jar包都启动成功后,却并没有读取到nacos配置中心的内容。解决:检查java项目的bootstrap.yml配置文件。spring:application:name:testmain:allow-bean-definition-overriding:truecloud:#配置中心config:server-add......
  • python中import和import...from的区别
    今天遇到一个奇怪的问题,如下面的代码:importtkinterastkfromtkinterimportsimpledialogdefpopup():user_input=tk.simpledialog.askstring("输入对话框","请输入你的名字:")ifuser_inputisnotNone:print("你的名字是:",user_input)......
  • python中None与Null的区别
    None是一个对象,而NULL是一个类型。Python中没有NULL,只有None,None有自己的特殊类型NoneType。None不等于0、任何空字符串、False等。在Python中,None、False、0、""(空字符串)、、()(空元组)、(空字典)都相当于False。  ......
  • 什么是STAR法则?什么是PDCA?这两个法则有什么区别和联系?
    STAR法则是一种用于回答面试问题或撰写工作经历的方法。它是指Situation(情境)、Task(任务)、Action(行动)和Result(结果)的缩写。按照STAR法则,回答问题或描述经历时,首先阐述面临的情境或任务,然后描述所采取的具体行动,并最后强调所取得的结果。PDCA是Plan-Do-Check-Act的缩写,也被称为循环......
  • 什么是HTTPS?与HTTP的区别?
    HTTP(HypertextTransferProtocol)和HTTPS(HypertextTransferProtocolSecure)是用于在网络上传输数据的两种协议。它们之间的主要区别在于安全性和数据传输的方式。在本文中,我们将详细解释HTTP和HTTPS的区别,并介绍HTTPS证书的概念、使用方法和作用。一、HTTP的基本概念和工作原理H......
  • window.localStorage.setItem 和 localStorage.setItem 有什么区别
    window.localStorage.setItem和localStorage.setItem有什么区别在JavaScript中,localStorage.setItem和window.localStorage.setItem实际上是相同的,它们是对浏览器的本地存储(LocalStorage)进行操作的方法之一。localStorage是window对象的一个属性,因此可以通过window.loc......