CAP 定理 (同步网络模型和异步网络模型)
CAP 定理是分布式领域中闻名遐迩的一个基石定理。CAP 定理又叫做布鲁斯定理, 该定理源于埃里克·布鲁尔在2000年的分布式计算原理研讨会上提出的一个猜想, 在2002年麻省理工学院的Gilbert和Lynch发表了证明[1],使之成为一个定理:分布式系统不可能同时保证 一致性(Consistency)、 可用性(Availability) 和 分区容忍性(Partition tolerance)。
这个定理也可以表达为: 在网络分区发生的情况下,分布式系统不能同时保证一致性和可用性。 除非是单节点系统,否则无法同时保证 CA。
一致性 | Consistency
定义:分布式系统中多个节点的数据返回始终一致的性质。(Consistency = two reads return the same value.)
Gilbert 和 Lynch 对一致性的描述是这样的:
Any read operation that begins after a write operation completes must return that value, or the result of a later write operation. All nodes see the same data at the same time.
在一个具有一致性的分布式系统中,一旦一个对任一节点的写入返回成功,后续对这个系统中其他任意节点的读操作都应该可以返回这个更新的值。所有节点在同一时刻的看到的数据是一样的。
分类:
弱一致性: 向系统写入一个值后,后续的读操作可能读出来,也可能读不出来。(After a write, reads may or may not see it.)
最终一致性: 向系统写入一个值后,后续立刻的读操作可能读不出来,但是在某个时间段后,读取一定成功。 例如,读写分离的关系型数据库。(After a write, reads will eventually see it.)
强一致性: 向系统写入一个值后,后续任意时刻的读取一定成功。(After a write, reads will always see it.)
可用性 | Availability
定义: 在分布式系统中,可用性是指每次请求都能获取到非错的响应的性质。(Availability = Reads and writes always succeed.)
Gilbert 和 Lynch 对一致性的描述是这样的:
Every request received by a non-failing node in the system must result in a response. That is, any algorithm used by the service must eventually terminate.
如果客户端发送一个请求给分布式系统中的一个无故障的节点, 这个节点必须回复请求。 就是,系统所用的任何算法都必须最终结束。
怎么样提高可用性:
冗余和故障转移(参考高可用的知识)
分区容忍性 | Partition tolerance
定义:当两个节点之间的网络不再连通,相当于分成了几块分区,所以叫做分区现象。如果不能在通信时限内达成数据一致,就意味着发生了分区。分区容忍性是指即使分区现象发生,系统仍然可以工作的性质。(Continues to function even if there is a “partition”.)
为什么不能同时满足: 一致性 可用性 分区容忍性
原因:网络是不稳定的。 网络中的节点也不稳定,丢包、延迟、中断都糊发生。所以导致分区现象在现实网络中不可避免,也就是说,现实中我们只能在 C 和 A中做选择。
BASE 定理
有eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结:
BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)
基本可用(Basically Available)
基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。
软状态( Soft State)
软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。
最终一致性( Eventual Consistency)
最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。
FLP 定理 (异步网络模型中)
由Fischer、Lynch和Patterson三位科学家于1985年发表的论文《Impossibility of Distributed Consensus with One Faulty Process》:
在网络可靠,但允许节点失效(即便只有一个)的最小化异步模型系统中,不存在一个可以解决一致性问题的确定性共识算法。