Zookeeper_CAP原则
CAP原则
简单介绍CAP
想要进行分布式事务控制,CAP理论是我们必须要知道的;
CAP原则:也叫CAP定理,指的是在一个分布式系统中,一致性、可用性、分区容错性三者不可兼得
一致性(Consistency)
分布式系统中的所有主机在同一时刻是否可以保证具有完全相同的数据备份,若具有,则该分布式系统具有一致性
可用性(Availability)
在集群中,部分节点发生故障后,是否会影响对客户端读写请求的响应,注意,若在短时间内会影响,其也不具有这里说说的"可用性"
分区容错性(Partition tolerance
分布式系统中的一台主机称为一个分区,分布式系统中各个主机无法保证数据的一致性,即不具有一致性是一种错误;分布式系统无法及时响应客户端请求,即不具有可用性也是一种错误;对于分布式系统,必须要具有对这些错误的"包容性",即容错性,这是必须得
为什么不能面面俱到
上面已经说明,分区容错性是分布式系统必须考虑的,此外,当我们想要保证高可用的时候,无非就是增加很多的节点,高可用的确是满足了,但带来的问题是,这么多的节点之间的数据同步是一个很多的消耗,极其容易造成数据不一致,当我们强调一致性的时候,节点越少,数据同步的消耗就小,但带来的节点少却又造成服务的可用性差,所以一致性和可用性是不可兼顾的,他们处于一个对立面;
CAP的组合
CA :不是分布式架构,就使用这种,关系数据库按照CA进行设计 ,放弃分区容错性,因为没有分区呀!!
AP:加强可用性和分区容错性,放弃立即一致性(强一致性),追求最终一致性,比如Eureka
比如微信提现,提示两个小时到账,而不是马上到账
CP:强调强一致性和分区容错性,放弃可用性,比如Zookeeper,master在宕机后选举Leader期间不提供服务
比如跨行转账,就是立即到账,你这边转出,那边收进,方认为一个事务才算完成
简单说说:先说结论,在分布式系统中AP运用的最多,因为他放弃的是强一致性,追求的是最终一致性,性价比最高,比如12小时内退款,微信2小时内提现到账,只要在用户的可接受范围内,保证一致性即可
三二原则
对于分布式系统,在CAP原则中分区容错性P是必须保证的,但其并不能同时保证一致性和可用性,因为现在的分分布式系统在满足一致性的前提下,会牺牲可用性,在满足了可用性的前提下,会牺牲一致性,所以CAP原则对于一个分布式系统来说,只可能满足两项,要么CP,要么AP,这就是CAP的三二原则
ZK与CP的缘分
ZK遵循的是CP原则,即一致性和分区容错性,牺牲了可用性,具体牺牲在哪里呢?
当Leader宕机以后,集群机器马上会进去到新的Leader选举中,但是选举时长在30s — 120s之间,这个选取Leader期间,是不提供服务的,不满足可用性,所以牺牲了可用性
经过上面的简单讲解,会射门选举时长会长达半分钟到2分钟呢?
当然是为了保证一致性,为了保证集群中各个节点数据的一致性,ZK做了两类数据同步,初始化同步和更新同步。
1:当新的Leader选举出来后,各个Follower需要将新的Leader的数据同步到自己的缓存中,这就是初始化同步
2:当Leader数据被客户端修改后,其会向Follower发出广播,然后各个Follwer会竹筒去同步更新的数据,这是更新同步
无论是初始化同步还是更新同步,ZK集群为了保证数据的一致性,若发现超过半数的Follower同步超时,则其会再次进行同步,而这个过程中ZK集群同样出去不可用状态
由于ZK采用的是CP原则,所以其可用性降低,这是其致命的问题,Spring Cloud集成的Eureka采用的就是AP原则,牺牲了一致性,但是保证了可用性
Zookeeper_CAP原则的更多相关文章
- javascript的api设计原则
前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...
- 让姑姑不再划拳 码农也要有原则 : SOLID via C#
“姑娘,别这样.我们是有原则的.” “一个有原则的程序猿是不会写出 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去.” “对,是时候和那些只会滚键盘的麻瓜不同了, ...
- java面向对象六原则一法则
1. 单一职责原则:一类只做它该做的事. 2. 里氏替换原则:子类必须能够替换基类(父类),否则不应当设计为其子类. 3. 依赖倒换原则:设计要依赖于抽象而不是具体化. 4. 接口隔离原则:接口要小而 ...
- SOLID 设计原则
SOLID 原则基本概念: 程序设计领域, SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象 ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- Atitit.研发团队的管理原则---立长不立贤与按资排辈原则
Atitit.研发团队的管理原则---立长不立贤与按资排辈原则 1. 组织任命原则概述1 2. 历史的角度看,大部分组织使用的立长不立贤原则1 3. 论资排辈 立长不立贤原则1 3.1. 资格和辈分是 ...
- DIP原则、IoC以及DI
一.DIP原则 高层模块不应该依赖于底层模块,二者都应该依赖于抽象. 抽象不应该依赖于细节,细节应该依赖于抽象. 该原则理解起来稍微有点抽象,我们可以将该原则通俗的理解为:"依赖于抽象&qu ...
- TDD原则
TDD 介绍 测试驱动开发,或者叫 TDD,是一个敏捷方法,通过确保在代码是先前手动编写测试用 例,用测试来驱动开发,从而翻转开发生命周期(它不只是作为一种校验工具). TDD 的原则很简单的: 只有 ...
- 【PRINCE2是什么】PRINCE2认证之七大原则(7)
我们先来回顾一下,PRINCE2七大原则分别是持续的业务验证,经验学习,角色与责任,按阶段管理,例外管理,关注产品,剪裁 第七个原则:根据项目环境剪裁 PRINCE2的价值在于它是一个通用的项目管理方 ...
随机推荐
- Python3:_pickle使用方法
常遇到的问题: python3使用pickle读取文件提示TypeError或者UnicodeDecodeError的解决办法 “ModuleNotFoundError: No module name ...
- 利用Process类创建多个子进程对象执行任务,主进程负责调度
import time from multiprocessing import Process def run1(): for i in range(5): print("sunck is ...
- pip配置阿里云源
Windows:打开计算机,在地址栏输入%appdata%,回车,进入用户文件夹,新建文件夹,命名为pip 在pip下新建pip.ini,输入以下内容 [global] timeout=6000ind ...
- Java之数据库连接池
未使用数据库连接池,需要从底层申请数据库连接来访问数据库,访问结束之后需要把链接丢弃.长此以往浪费时间. 数据库连接池就是用容器来申请访问,容器里有很多连接对象,用户来容器里拿一个连接对象一起访问数据 ...
- js实现复制|剪切指定内容到粘贴板--clipboard
这是著名开源项目 clipboard.js 的 README.md,里面讲解的更加详细,有兴趣的同学可以了解一下.项目地址:https://github.com/zenorocha/clipboard ...
- fastDFS配置文件 fdfs_client.conf
# connect timeout in seconds# default value is 30sconnect_timeout=30 # network timeout in seconds# d ...
- spring 对JDBC的支持 (8)
目录 一.jdbc的简介 二.jdbcTemplate 的使用 2.1 maven 引入spring - jdbc ,c3p0 ,数据库mysql驱动 2.2 配置 数据源以及jdbcTemplate ...
- ios移动输入框被软键盘遮挡
页面输入框会出现被软键盘挡住的问题: 解决方法:获取input点击事件设置body高度 $('input').bind('click',function(e){ var $this = $(this) ...
- (14)centos7 进程管理
一.查询进程 1. 进程显示 ps -a 显示当前所有的进程信息 -u 以用户的格式显示进程信息 -x 显示后台进程运行的参数 ps -aux #通常查看内存 USER #执行进程的用户 PID #进 ...
- System.getenv()和System.getProperty()
System.getenv() 方法是获取指定的环境变量的值. System.getenv(String str) 接收参数为任意字符串,当存在指定环境变量时即返回环境变量的值,否则返回null. S ...