浅谈Nacos中的CAP
浅谈Nacos中的CAP
文章目录
- 浅谈Nacos中的CAP
- 1.前言
- 2.CAP理论和BASE理论
- 3.Nacos中的CAP
- 4.Nacos中AP模式源码分析
- 5.常见的面试题
- 6.结语
1.前言
说起CAP原则,大家都不陌生。只要是个分布式系统,都应该满足。之前写过Zk的CAP,今天来谈谈nacos中是如何实现CAP的。
Zookeeper集群选举机制以及数据同步机制
Nacos源码环境搭建和源码流程图
2.CAP理论和BASE理论
CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳:
- 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
- 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
- 分区容错性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
一般分布式系统中,肯定是优先办证P,剩下的就是C和A的取舍。
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写,BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的结论,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。
简单来说BASE就是CAP的折中,C A P我三个都要,但不用100%保证每一次原则。
3.Nacos中的CAP
首先,nacos保证了P,官方推荐使用A,即AP,保证其高可用。而与之典型的几个注册中心
- zookeeper(CP 集群leader挂了会重新选举,此时暂停对外服务)。
- mysql(单机版CA)
- eureka集群(AP)
- eureka集群(AP)
- redis集群(AP)
看过ribbon源码可知,如果发现连接失败,则会自动切换至其他的节点,只要有一台还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证一致性)
Eureka看明白了这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册时如果发现连接失败,则会自动切换至其他的节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
1.Eureka不再从注册列表中移除因为长时间没有收到心跳而应该过期的服务
2.Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
3.当前网络稳定时,当前实例新的注册信息会被同步到其它节点中 因此,Eureka可以很好的应对因网络故障导致节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。
而nacos和eureka和类似,上文也说过,有服务健康检查和心跳机制,具体请看上一张源码流程图分析。
4.Nacos中AP模式源码分析
5.常见的面试题
- 什么是脑裂:
集群(M-S的情况)通常是发生在节点通信不可达(分区)的情况下,集群会分裂成不同的小集群,小集群各自选举出多个master节点的情况。 - nacos和zookeeper是如何避免脑裂的?
leader选举,要求节点的投票数量>总节点数量/2,即过半数,有这个选举原则保证了集群出现分区,无论如何最多只能有一个小集群选出leader。 - M-S 模式的集群节点个数为何推荐是奇数个?
首先,偶数个节点的集群一旦出现对半分区(比如4个节点分区成两个节点和两个节点的情况),整个集群无法选举出leader,集群无法提供服务。
其次,在容错能力相同的情况下,奇数节点比偶数节约资源。比如,5个节点挂了2个还能选出leader,而6个节点最多也只能挂2个节点才能保证选举出leader。
6.结语
世上无难事,只怕有心人,每天积累一点点,fighting!!!
浅谈Nacos中的CAP相关推荐
- java 中的单元测试_浅谈Java 中的单元测试
单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...
- mybatis与php,浅谈mybatis中的#和$的区别
浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...
- 浅谈CSS3中display属性的Flex布局,关于登陆页面属性框的设置
声明:本文转发自三里屯柯南的浅谈CSS3中display属性的Flex布局http://www.cnblogs.com/xuyuntao/articles/6391728.html 基本概念 采用Fl ...
- python sys模块作用_浅谈Python中的模块
模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...
- python生成器和迭代器作用_浅谈Python中的生成器和迭代器
迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...
- oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念
Nested loop join:
Outer - phpStudy...
浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...
- 浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别
浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别 标签: caffe深度学习CaffeNet 2016-11-02 16:10 1203人阅读 评论(1) ...
- python中 是什么类型_浅谈python中的变量默认是什么类型
浅谈python中的变量默认是什么类型 1.type(变量名),输出的结果就是变量的类型: 例如 >>> type(6) 2.在Python里面变量在声明时,不需要指定变量的类型,变 ...
- 浅谈Java中的Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- 浅谈Linux中ldconfig和ldd的用法
ldd 查看程序依赖库 ldd 作用:用来查看程式运行所需的共享库,常用来解决程式因缺少某个库文件而不能运行的一些问题. 示例:查看test程序运行所依赖的库: /opt/app/todeav1/te ...
最新文章
- Java项目:在线考试系统(java+springboot+vue+jsp+mysql+maven)
- 逻辑回归实例--乳腺癌肿瘤预测
- union all动态表_深入窥探动态链接
- 2017年第八届蓝桥杯 - 国赛 - C/C++大学B组 - A. 36进制
- 【Linux】一步一步学Linux——skill命令(143)
- Windows2008+sqlserver2008集群安装(图文并貌)
- 约三分之二的 DDoS 攻击指向通信服务提供商
- IBASE archive pre-processing report RIBARCHV
- 福州java培训哪里好_南通java培训哪家好
- C++:39---继承中构造函数、析构函数的关系
- mysql获取数据库名_mysql获取数据库名
- css图片上漂浮着文字效果
- php处理har,harviewer har解析工具
- 语音 AI 技术简介
- e430c参数 thinkpad,联想ThinkPad E430c的详细参数
- 电驴怎么显示服务器列表,(转)如何更新电驴服务器列表(eMule Server List)
- tp5 JWT生成token验证接口安全、防止高频请求
- 湖北民院OJ 最少美元付款
- linux、windows nginx启动 重启 关闭命令
- Jira中文包插件,更专业的中文Jira
热门文章
- 周志华----第5章神经网络(误差逆传播算法)
- postgreSQL / MySQL / 达梦 时间查询 ,获取近几天、一周、一月、季度、一年时间内的数据
- 【git】git的删除命令与如何删除仓库文件的方法
- mysql pk什么意思_数据库pk什么意思
- 电脑键盘部分按键失灵_笔记本键盘一部分失灵怎么办(笔记本个别键失灵的解决方法)...
- 看他如何做到4年2个博士学位,做研究、出书挣钱两不误。
- 关于晶圆介绍以及IGBT晶圆的应用
- 稻盛和夫:中国企业如何在萧条中实现大飞跃
- 中心极限定理 central limit theorem
- 用python的matplotlib和numpy库绘制股票K线均线和成交量的整合效果(含量化验证交易策略代码)