广州网站建设定制设计,网页制作是什么专业学的,做网站首选九零后网络,淘宝佣金推广网站建设历史
这个定理起源于柏克莱加州大学University of California, Berkeley的计算机科学家埃里克布鲁尔在2000年的分布式计算原则研讨会#xff08;Symposium on Principles of Distributed Computing#xff08;PODC#xff09;#xff09;上提出的一个猜想。 在2002年…历史
这个定理起源于柏克莱加州大学University of California, Berkeley的计算机科学家埃里克·布鲁尔在2000年的分布式计算原则研讨会Symposium on Principles of Distributed ComputingPODC上提出的一个猜想。 在2002年麻省理工学院MIT的赛斯·吉尔伯特和南希·林奇发表了布鲁尔猜想的证明使之成为一个定理。
吉尔伯特和林奇证明的CAP定理比布鲁尔设想的某种程度上更加狭义。定理讨论了在两个互相矛盾的请求到达彼此连接不通的两个不同的分布式节点的时候的处理方案。
CAP介绍
在理论计算机科学中CAP定理CAP theorem又被称作布鲁尔定理Brewers theorem它指出对于一个分布式计算系统来说不可能同时满足以下三点
一致性Consistency 等同于所有节点访问同一份最新的数据副本可用性Availability每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据分区容错性Partition tolerance以实际效果而言分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性就意味着发生了分区的情况必须就当前操作在C和A之间做出选择
根据定理分布式系统只能满足三项中的两项而不可能满足全部三项。理解CAP理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致即丧失了C性质。如果为了保证数据一致性将分区一侧的节点设置为不可用那么又丧失了A性质。除非两个节点可以互相通信才能既保证C又保证A这又会导致丧失P性质。
CAP证明 我们现在有两个网络N1和N2每个网络中都存在一个服务用于从db获取数据初始状态下db中存储的数据都是V0。 image.png 正常情况下在网络N1通过服务A更新V0到V1更新成功后发送消息M使N2 db中的V0变为V1此时我们通过服务B获取数据时获取到V1。 此时为CA没有分区 但是一旦发生了网络分区(分区容错性强制拥有)此时我们通过服务A更新数据到V1后由于网络错误V1值同步不到N2网络中去此时我们调用服务B去请求数据的时候我们必须从C和A选一个如果选择C我们需要等到数据同步到N2但是从服务B获取数据肯定是失败了失去了A。如果选择A那么从B我们获取到的数据不是最新的失去了C。 分区后P满足只能CA之间选择 CAP应用
CAP存在的问题
在CAP理论中有一点很理想化它没有考虑网络延迟他认为C都是立刻生效的实际上同步这个操作肯定存在延迟。因此对于分布式系统我们一般都采用AP。
CA取舍 从上面这张图我们可以看到我们的分布式应用分为三个状态一致状态分区状态分区恢复状态。
对于分布式系统来讲避免不了分区状态和分区恢复状态一旦进入我们必须在C和A之间做出妥协这个妥协也不是说你只选择C而完全不考虑A可以在CA的实现比例上进行权衡比如主A辅C实现基本可用最终一致。BASE理论就是用来解决这个问题。
BASE理论
BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性)三个短语的缩写是对 CAP 中 AP 的一个扩展。 基本可用分布式系统在出现故障时允许损失部分可用功能保证核心功能可用。 软状态允许系统中存在中间状态这个状态不影响系统可用性这里指的是 CAP 中的不一致。 最终一致最终一致是指经过一段时间后所有节点数据都将会达到一致。
BASE 解决了 CAP 中理论没有网络延迟在 BASE 中用软状态和最终一致保证了延迟后的一致性。 BASE 和 ACID 是相反的它完全不同于 ACID 的强一致性模型而是通过牺牲强一致性来获得可用性并允许数据在一段时间内是不一致的但最终达到一致状态。 BASE理论的意义在于我们不必在A或C中做出选择可以实现部分的A和C 应用CAP分析
应用类型其他MysqlCA主从模式为APZooKeeperCP在分区后对于A只有分区内节点大于quorum才对外服务EurekaAP最终一致性Redis哨兵/集群模式AP最终一致性单体肯定是CARocketMQ主从AP最终一致性分布式事务-2pcCP锁住资源,该资源其他请求阻塞分布式事务-TCCAP最终一致性分布式事务-最大努力尝试AP最终一致性
总结
个人认为CAP定理的核心在于在网络分区的情况下我们需要对C和A做出相应的妥协我们不可能完全满足CA但是我们可以合理控制C和A之间的比例让我们的应用/中间件正常提供服务。
下面是我公众号大家可以关注下。
相关文章: