CAP定理
(Wikipedia)
在
理论计算机科学
中,
CAP定理
(CAP theorem),又被称作
布鲁尔定理
(Brewer's theorem),它指出对于一个
分布式计算系统
来说,不可能同时满足以下三点:
- 一致性(Consistence) (等同于所有节点访问同一份最新的数据副本)
- 分区容错性(Partition tolerance)(即系统对 "节点双方一时联系不上对方" 这样一个状态的容错性。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择[3]。)
根据定理,分布式系统只能满足三项中的两项而不可能满足全部三项
[4]
。理解CAP理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。
看第一次就能理解这个定理的老铁不用往下看了,但是第一次就能理解这个定理的老铁也不会搜到这篇文章了
CAP 理论常被解释为一种“三选二”定律,这是一种误解
CAP 定律的前提是 P,当 P 决定后才有 CA 的抉择。因此,简单粗暴地说「三选二」是有一定误导性的。
当系统不存在“
节点双方一时联系不上对方
“的情况时,C和A是可以完美满足的。
当“
节点双方一时联系不上对方
“的情况出现时(实际上一定会出现,通信的网络出现问题,路由器坏了),这时候就必须在C和A之间选择一个,选择C的话就是继续等待直至通信恢复,同步完成再进行操作。选择A的话就相信当前节点的数据库是正确的,等待节点通信恢复后再做检测,差错。
下面有一个实际的例子来说明CPA定理的实际应用:
自动柜员机上的补偿问题:
以自动柜员机(ATM)的设计来说,强一致性看似符合逻辑的选择,但现实情况是可用性远比一致性重要。理由很简单:高可用性意味着高收入。不管怎么样,讨论如何补偿分区期间被破坏的不变性约束,ATM的设计很适合作为例子。
ATM的基本操作是存款、取款、查看余额。关键的不变性约束是余额应大于或等于零。因为只有取款操作会触犯这项不变性约束,也就只有取款操作将受到特别对待,其他两种操作随时都可以执行。
ATM系统设计师可以选择在分区期间禁止取款操作,因为在那段时间里没办法知道真实的余额,当然这样会损害可用性。现代ATM的做法正相反,在stand-in模式下(即分区模式),ATM限制净取款额不得高于k,比如k为$200。低于限额的时候,取款完全正常;当超过限额的时候,系统拒绝取款操作。这样,ATM成功将可用性限制在一个合理的水平上,既允许取款操作,又限制了风险。
分区结束的时候,必须有一些措施来恢复一致性和补偿分区期间系统所造成的错误。状态的恢复比较简单,因为操作都是符合交换率的,补偿就要分几种情况去考虑。最后的余额低于零违反了不变性约束。由于ATM已经把钱吐出去了,错误成了外部实在。银行的补偿办法是收取透支费并指望顾客偿还。因为风险已经受到限制,问题并不严重。还有一种情况是分区期间的某一刻余额已经小于零(但ATM不知道),此时一笔存款重新将余额变为正的。银行可以追溯产生透支费,也可以因为顾客已经缴付而忽略该违反情况。
总而言之,因为通信延迟的存在,银行系统不依靠一致性来保证正确性,而更多地依靠审计和补偿。“空头支票诈骗”也是类似的例子,顾客赶在多家分行对账之前分别取出钱来然后逃跑。
透支的错误过后才会被发现,对错误的补偿也许体现为法律行动的形式