所有讨论分布式一致性的文章和书籍,无一例外都会提到“CAP原理”。然而很少有人真的把CAP原理说清楚,大部分只是无意义的复制粘贴,亦或是含混不清地一笔带过,然后再也不提。那么究竟什么是CAP原理?它有什么意义?我们为什么要讨论它?在查阅了大量资料后,本文试图给出我自己的理解。
什么是分布式系统?
首先,我们需要定义什么是系统。系统是指能够完成一定功能的软件和硬件的集合。系统的边界依赖于人的定义。
系统有两种架构和部署方式:集中式和分布式。所谓集中式,是指整个系统的所有业务单元部署于同一个中心节点上。
在《分布式系统概念与设计》一书中,对分布式系统做了如下定义:
分布式系统是一个硬件或软件组件分布式在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。
以上定义涵盖了各种各样的分布式系统。但CAP原理讨论的,是数据共享式系统。
CAP原理的来源
CAP原理内容
Consistency:一致性——强一致性。注意这是从客户端视角来看的强一致性。
Availability:可用性——每个节点只要不挂,就都可读可写
Partition tolerance:分区容忍性——系统内数据可以有多个副本存储于不同节点上,当各节点出现通信不畅时,系统能够正常对外提供服务。在分布式环境下,由于网络问题,要么节点暂时无法通信,要么通信存在延迟,所以一旦有多个数据副本,那么就一定会存在分区。故分区容忍性也可称为“系统数据可以有多个副本,且允许它们并不时时刻刻都同步”。
CA:这种情况下,数据不可有多个副本。实质上就退化成了集中式系统。
CP:这种情况下,要提供给客户端强一致性,就不可能允许客户端随时访问任意节点 。即不可能满足A。
AP:放弃强一致性,则数据可以有副本,且每个节点都可用。
通常,在分布式系统中,我们必须满足P,因为目的就是减少数据库的单点压力。因此,就只能在CP和AP之间做取舍。
CAP原理的意义
CAP原理是为了说明在构建分布式系统时需要做出的取舍。或者更直白一点,强一致性和节点可用性是不可兼得的,你总得牺牲一个。而具体牺牲哪一个,要由业务场景而定。
CAP原理就像一座天平,天平的底座是分区容忍性(P),而天平的两端是强一致性(C)和节点可用性(A)。分区容忍性是必然存在的。
- 如果要应用对外表现出强一致性,那么所有节点就并不是随时都可用。因为在某个节点发生数据变更后,所有节点都需要停止服务、等待数据同步。
- 如果要保证所有节点都随时可用,那么应用就不可能对外表现出强一致性。
BASE理论
CAP原理限制很严格,只有0和1两种选择,要么选择强一致性,要么选择节点可用性。这对于数据访问量极大的互联网应用来说,并不好用。而BASE理论则给出了一种中间政策。简单说,就是通过各种要求没那么严的最终一致性来代替严格的强一致性,来换取更多节点的可用性。比如因果一致性、读写一致性等。关于这一点,这篇文章介绍的很好;https://www.yuque.com/watermoonlx/ovauax/guzg7h.以一场棒球比赛为例,不同的人,对于一致性的要求是不同的,由此我们可以指定不同的一致性策略。
参考资料
An Illustrated Proof of the CAP Theorem
CAP 定理的含义
Understanding the CAP Theorem
Replicated Data Consistency Explained Through Baseball
https://www.microsoft.com/en-us/research/wp-content/uploads/2011/10/ConsistencyAndBaseballReport.pdf
Eventually Consistent - Revisited
