写在前面
本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和文献引用请见100个问题搞定大数据理论体系
解答
分布式系统不可能同时满足一致性(C: Consistency)、可用性(A: Availability)和分区容错性(P: Partition Tolerance),最多只能同时满足其中两项。
补充
C(一致性)
一致性在这里指的是线性一致性(Linearizability Consistency)。
在线性一致性的保证下,所有分布式环境下的操作都像是在单机上完成的一样。
也就是说图中Sever A、B、C的状态一直是一致的。
A(可用性)
可用性的概念比较简单,在这里指的是在分布式系统中,任意非故障的服务器都必须对客户的请求产生响应。
当系统满足可用性的时候,不管出现什么状况(除非所有的服务器全部崩溃),都能返回消息。
也就是说,当客户端向系统发送请求,只要系统背后的服务器有一台还未崩溃,那么这个未崩溃的服务器必须最终响应客户端。
P(分区容错性)
分区容错性分为两个部分,“分区”和“容错”。
在一个分布式系统里,如果出现一些故障,可能会使得部分节点之间无法连通。
由于这些故障节点无法联通,造成整个网络就会被分成几块区域,从而使数据分散在这些无法连通的区域中的情况,你可以认为这就是发生了分区错误。
如图所示,如果你要的数据只在Sever A中保存,当系统出现分区错误,在不能直接连接Sever A时,你是无法获取数据的。
我们要“分区容错”,意思是即使出现这样的“错误”,系统也需要能“容忍”。也就是说,就算错误出现,系统也必须能够返回消息。
分区容错性,在这里指的是我们的系统允许网络丢失从一个节点发送到另一个节点的任意多条消息。
我们知道,在现代网络通信中,节点出现故障或者网络出现丟包这样的情况是时常会发生的如果没有了分区容错性,也就是说系统不允许这些节点间的通讯出现任何错误的话,那我们日常所用到的很多系统就不能再继续工作了。
所以在大部分情況下,系统设计都会保留P属性,而在C和A中二选一。
为什么要CA二选一?
客户端向一台服务器写入数据,写入成功后这台服务器突然因为某种原因宕机,此时将面临两个选择:
- 牺牲可用性,选择一致性,此时就是CP系统。
- 牺牲一致性,选择可用性,此时就是AP系统。
CAP 三大属性都很重要,因为 CAP 定理我们只能 3 取 2,架构师在设计系统的时候要根据实际需求在 3 者之间做取舍。