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原则的更多相关文章

  1. javascript的api设计原则

    前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...

  2. 让姑姑不再划拳 码农也要有原则 : SOLID via C#

    “姑娘,别这样.我们是有原则的.” “一个有原则的程序猿是不会写出 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去.” “对,是时候和那些只会滚键盘的麻瓜不同了, ...

  3. java面向对象六原则一法则

    1. 单一职责原则:一类只做它该做的事. 2. 里氏替换原则:子类必须能够替换基类(父类),否则不应当设计为其子类. 3. 依赖倒换原则:设计要依赖于抽象而不是具体化. 4. 接口隔离原则:接口要小而 ...

  4. SOLID 设计原则

    SOLID 原则基本概念: 程序设计领域, SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象 ...

  5. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  6. Atitit.研发团队的管理原则---立长不立贤与按资排辈原则

    Atitit.研发团队的管理原则---立长不立贤与按资排辈原则 1. 组织任命原则概述1 2. 历史的角度看,大部分组织使用的立长不立贤原则1 3. 论资排辈 立长不立贤原则1 3.1. 资格和辈分是 ...

  7. DIP原则、IoC以及DI

    一.DIP原则 高层模块不应该依赖于底层模块,二者都应该依赖于抽象. 抽象不应该依赖于细节,细节应该依赖于抽象. 该原则理解起来稍微有点抽象,我们可以将该原则通俗的理解为:"依赖于抽象&qu ...

  8. TDD原则

    TDD 介绍 测试驱动开发,或者叫 TDD,是一个敏捷方法,通过确保在代码是先前手动编写测试用 例,用测试来驱动开发,从而翻转开发生命周期(它不只是作为一种校验工具). TDD 的原则很简单的: 只有 ...

  9. 【PRINCE2是什么】PRINCE2认证之七大原则(7)

    我们先来回顾一下,PRINCE2七大原则分别是持续的业务验证,经验学习,角色与责任,按阶段管理,例外管理,关注产品,剪裁 第七个原则:根据项目环境剪裁 PRINCE2的价值在于它是一个通用的项目管理方 ...

随机推荐

  1. C# JavaScriptSerializer 自定义序列化

    虽然,我个人建议使用Json.Net. 但大家需求不同.遇到一个朋友,他有个需求JavaScriptSerializer并且序列化时,隐藏基类成员. 这里我采用自定义序列化来实现: public st ...

  2. express 的路由学习

    使用步骤 - :获取路由中间件对象 `let router = express.Router();` - :配置路由规则 `router.请求方式(URL,fn事)` - fn中参数有req,res, ...

  3. Qt 【关于控件样式,鼠标进入、离开、点击】

    比如举以下这个例子: QPushButton * okBtn; okBtn->setstylesheet("QPushButton{border-image:url(:/image/h ...

  4. 特种设备TSG 认证流程

    特种设备许可,也叫安全注册(原为AZ安全注册认可),现为TS.国家为了防止和减少事故,保障人民群众生命和财产安全,促进经济发展而强制实施的安全监察.它的作用相当于欧盟的“CE”认证,但比“CE”认证更 ...

  5. selenium基本元素定位-findElement(By.*)

    selenium基本元素的定位和操作 一. 查找元素 1.1 findElement(By.id) // by——>定位器——>以某种方式去找元素 driver.findElement(b ...

  6. js 将字符串当作js表达式执行方法

    听同事说了一个需求.他有一个数据对象obj,接口会给他返回一个索引key,这个key长度不固定,根据这个key去修改obj对应的值. 举个例子: let obj={"level1" ...

  7. 一个类似indexOf()的功能的函数

    之前面试的时候遇到了这样的一道题,不过写的时候有些细节没注意到,现在重新写了一下. 写一个类似indexOf()的功能的函数 var str = "dafdfgvdahjfbhyuyvtur ...

  8. java程序中线程cpu使用率计算

    原文地址:https://www.imooc.com/article/27374 最近确实遇到题目上的刚需,也是花了一段时间来思考这个问题. cpu使用率如何计算 计算使用率在上学那会就经常算,不过往 ...

  9. JBoss、Tomcat、JBoss EAP、JBoss AS、wildfly,JBoss EAP安装部署,JBoss各个版本下载,JBoss允许远程访问

    感谢: https://www.cnblogs.com/invlong/p/5983334.html https://blog.csdn.net/mooncarp/article/details/78 ...

  10. C++——代码风格

    google代码风格 1.使用安全的分配器(allocator),如scoped_ptr,scoped_array 2.测试用的,其他的不能用: 2.1 友元 2.2 C++异常 2.3 RTTI 3 ...