当前位置: 首页 > news >正文

CAP理论

为什么80%的码农都做不了架构师?>>>   hot3.png

1. CAP概念

CAP(Consistency,Availability,Partition Tolerance theorem)理论被很多人拿来作为分布式系统设计的金律。

最初的cap理论解释

  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
  • 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

Consistency(强一致性):其实就是数据库系统中提到的ACID的另一种表述:一个用户请求要么成功、要么失败,不能处于中间状态(Atomic);一旦一个事务完成,将来的所有事务都必须基于这个完成后的状态(Consistent);未完成的事务不会互相影响(Isolated);一旦一个事务完成,就是持久的(Durable)

Availability(可用性):指的是对于一个系统而言,所有的请求都应该‘成功’并且收到‘返回’

Partition-tolerance(分区容错性):所指就是分布式系统的容错性。节点crash或者网络分片都不应该导致一个分布式系统停止服务。

2. CAP理论

CAP的证明基于异步网络,异步网络也是反映了真实网络中情况的模型。真实的网络系统中,节点之间不可能保持同步,即便是时钟也不可能保持同步,所有的节点依靠获得的消息来进行本地计算和通讯。这个概念其实是相当强的,意味着任何超时判断也是不可能的,因为没有共同的时间标准。

CAP的证明很简单,假设两个节点集{G1, G2},由于网络分片导致G1和G2之间所有的通讯都断开了,如果在G1中写,在G2中读刚写的数据, G2中返回的值不可能G1中的写值。由于A的要求,G2一定要返回这次读请求由于P的存在,导致C一定是不可满足的。

3. CAP的实际应用

CAP的证明使用了一些很强的假设,比如纯粹的异步网络,强的C、A、P要求。事实上,我们可以放松某些条件,从而达到妥协。

首先 —— 弱异步网络模型

弱异步网络模型中所有的节点都有一个时钟,并且这些时钟走的步调是一致的,虽然其绝对时间不一定相同,但是彼此的相对时间是固定的,这样系统中的节点可以不仅仅根据收到的消息来决定自己的状态,还可以使用时间来判断状态,比如超时什么的。

在这种场景下,CAP假设依旧是成立的,证明跟上面很相似。

不可能的尝试 —— 放松Availability或者Partition-tolerance

放弃Partition-tolerance意味着把所有的机器搬到一台机器内部,或者放到一个要死大家一起死的机架上(当然机架也可能出现部分失效),这明显违背了我们希望的scalability。

放弃Availability意味着,一旦系统中出现partition这样的错误,系统直接停止服务,这是不能容忍的。

最后的选择 —— 放松一致性

我们可以看出,证明CAP的关键在于对于一致性的强要求。在降低一致性的前提下,可以达到CAP的和谐共处,这也是现在大部分的分布式存储系统所采用的方式:Cassandra、Dynamo等。“Scalability is a bussness concern”是我们降低一致性而不是A和P的关键原因。

CAP理论在现实中是无法全部实现的,实际应用基本上就是三选二:

高可用、数据一致是很多系统设计的目标,但是分区又是不可避免的事情:

  • CA without P:如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但其实分区不是你想不想的问题,而是始终会存在,因此CA的系统更多的是允许分区后各子系统依然保持CA。
  • CP without A:如果不要求A(可用),相当于每个请求都需要在Server之间强一致,而P(分区)会导致同步时间无限延长,如此CP也是可以保证的。很多传统的数据库分布式事务都属于这种模式。
  • AP wihtout C:要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。现在众多的NoSQL都属于此类。

http://www.cnblogs.com/hxsyl/p/4381980.html 

转载于:https://my.oschina.net/shyl/blog/858403

相关文章:

  • HDU 2501 Tiling_easy version
  • 透明代理Transparent Proxy
  • linux 配置软连接的需要注意的一个问题
  • zookeepr集群环境搭建
  • 排球比赛积分规则---三层架构
  • [译] 看动画,学 RxJS
  • (zhuan) 一些RL的文献(及笔记)
  • java 的底层通信--Socket
  • java.util.concurrent.CountDownLatch用方法
  • PSI分析
  • Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释...
  • maven的基本原理和使用
  • cocos2d-x -Lua 字符串
  • [系统资源攻略]IO第一篇-磁盘IO,内核IO概念
  • 深入理解CSS中的margin
  • 深入了解以太坊
  • [case10]使用RSQL实现端到端的动态查询
  • 【面试系列】之二:关于js原型
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Javascript 原型链
  • JavaScript实现分页效果
  • JSONP原理
  • Laravel 中的一个后期静态绑定
  • MaxCompute访问TableStore(OTS) 数据
  • Python学习之路16-使用API
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 批量截取pdf文件
  • 前端学习笔记之观察者模式
  • 使用parted解决大于2T的磁盘分区
  • 微信小程序实战练习(仿五洲到家微信版)
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • raise 与 raise ... from 的区别
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 通过调用文摘列表API获取文摘
  • ​MySQL主从复制一致性检测
  • # 达梦数据库知识点
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (第27天)Oracle 数据泵转换分区表
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (学习日记)2024.01.19
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)iOS字体
  • (转)visual stdio 书签功能介绍
  • (轉貼) UML中文FAQ (OO) (UML)
  • **python多态
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [Android View] 可绘制形状 (Shape Xml)