论文 Consistency Tradeoffs in Modern Distributed Database System Design
CAP原则
2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP。之后,CAP理论正式成为分布式计算领域的公认定理。
在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),最多只能同时三个特性中的两个,三者不可兼得。
- 一致性(Consistency): all nodes see the same data at the same time, 即所有节点在同一时刻的数据完全一致。
- 客户端:多并发访问时如何获取更新过的数据;
- 服务端:如何将数据更新分布到整个系统,以保证数据最终一致。
- 可用性(Availability): Reads and writes always succeed,即服务一直可用,而且响应时间正常,不会访问失败或超时。
- 分区容忍性(Partition tolerance): the system continues to operate despite arbitrary message loss or failure of part of the system,网络故障导致节点间无法通信而分成多个分区,系统还能正常对外服务。
经典例子:
上图是CAP的一个基本场景,网络中有两个节点N1和N2,他们之间网络连通,N1中有一个应用程序A,和一个数据库V,N2有一个应用程序B和一个数据库V。现在,A和B是分布式系统的两个部分,V是分布式系统的数据存储的两个子数据库。
- 一致性:N1和N2中的数据是一样的,V0=V0。
- 可用性:用户不管是请求N1或者N2,都会得到立即响应。
- 分区容错性:N1和N2有任何一方宕机,或者网络不通的时候,都不会影响N1和N2彼此之间的正常运作。
上图是分布式系统正常运转的流程
- 用户向N1机器请求数据更新,程序A更新数据库Vo为V1
- 分布式系统通过同步操作M,将V1的数据同步的N2中V0,使得N2中的数据V0也更新为V1
- N2中的数据V1再响应N2的请求。
但是现实往往没有这么顺利,作为一个分布式系统,它和单机系统的最大区别就在于网络,N1和N2之间的网络中断是很常见的故障,分布式系统必须要能够应对这种网络故障,也就是说要满足分区容错性,在这种情况下再进一步考虑是否还能满足一致性和响应性。
假设在N1和N2之间网络断开的时候有用户向N1发送数据更新请求,那N1中的数据V0将被更新为V1。由于网络是断开的,所以无法进行同步操作M,N2中的数据依旧是V0;这个时候,有用户向N2发送数据读取请求,由于数据还没有进行同步,应用程序没办法立即给用户返回最新的数据V1,怎么办呢?这种情况下有两种选择:
- 牺牲数据一致性:响应旧的数据V0给用户;
- 牺牲可用性:阻塞等待,直到网络连接恢复,数据更新操作M完成后,再给用户响应最新的数据V1
总的来说:CAP理论在分布式系统中,只能实现其中两个特性。而分区容忍性(P)必须要实现,所以我们多数情况下需要在一致性(C)和可用性(A)之间进行权衡。要么是CP,要么是AP。
CP系统是牺牲可用性的系统。相当于每个请求都需要在服务器之间保持强一致,而P(分区)会导致同步时间无限延长(也就是等待数据同步完才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统。CP类型的系统有 MongoDB, HBase, Zookeeper等。
AP系统是牺牲一致性的系统。要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。AP类型的系统有 Couch DB,Cassandra,Amazon Dynamo等。
CAP原则的局限性:
CAP理论仅仅只是在遇到某些类型故障时才会约束系统,正常运行期间并不会限制系统的任何功能。然而实际上,网络分区很少发生,所以当网络分区不发生时,CAP就不起作用了。
在此情况下,论文引出CAP理论的扩展,即PACELC理论。
简单来说就是
- 如果有网络分区(P),系统就必须在availability(A)和consistency(C)之间取得平衡;
- 如果没有网络分区,系统则需要在latency(L)和consistency(C)之间取得平衡。
论文将CAP和延迟(L)与一致性(C)之间的权衡合并起来得到公式PACELC。
一致性与延迟之间的权衡(tradeoff)
无论是否发生网络分区,都需要在一致性与延迟之间进行权衡。
原因: 一致性 → 系统需要备份数据→ 数据复制导致延迟→ 延迟过大会导致低可用性
一致性与延迟之间的权衡取决于数据备份的方式。