1.4 高可用之CAP理论

1.4.1 CAP理论

我们都知道高可用的通用办法是冗余设计(或者说集群无单点),多个节点形成集群,一旦形成集群,必定涉及一致性、可用性以及分区容错性等问题,这就涉及CAP理论。因此,CAP理论是学习高可用必须掌握的理论。

由于对系统或者数据进行了拆分,因此我们的系统不再是单机系统,而是分布式系统,针对分布式系统的CAP原理包含如下3个元素(见图1-11):

● C(Consistency):一致性,分布式系统中的所有数据备份在同一时刻具有同样的值,所有节点在同一时刻读取的数据都是最新的数据副本。例如,对某个指定的客户端来说,读操作能返回最新的写操作。对于数据分布在不同节点上的数据来说,在某个节点更新了数据,如果在其他节点都能读取到这个最新的数据,就称为强一致,如果有某个节点没有读取到,就是不一致。

● A(Availability):可用性,非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)。可用性的两个关键:一个是合理的时间,另一个是合理的响应。合理的时间指的是请求不能无限被阻塞,应该在合理的时间给出返回;合理的响应指的是系统应该明确返回结果并且结果是正确的。

● P(Partition Tolerance):分区容错性,当出现网络分区后,系统能够继续工作。在实际场景中,网络环境不可能百分之百不出现故障,比如网络拥塞、网卡故障等都会导致网络故障或不通,从而导致节点之间无法通信,或者集群中的节点被划分为多个分区,分区中的节点之间可通信,分区间不可通信。这种由网络故障导致的集群分区情况通常被称为“网络分区”。

图1-11 CAP理论

CAP原理证明,任何分布式系统只可以同时满足以上两点,无法三者兼顾。在分布式系统中,网络无法100%可靠,分区其实是一个必然现象。也就是说,分区容错性(P)是前提,是必须要保证的。

现在就只剩下一致性(C)和可用性(A)可以选择了,要么选择一致性,保证数据正确;要么选择可用性,保证服务可用。那么CP和AP的含义是什么呢?

对于CP来说,放弃可用性,追求一致性和分区容错性,ZooKeeper其实追求的就是强一致。对于AP来说,放弃一致性(这里说的一致性是强一致性),追求分区容错性和可用性,这是很多分布式系统设计时的选择。

顺便一提,CAP理论中是忽略网络延迟的,也就是当事务提交时,从节点A复制到节点B没有延迟,但是在现实中这明显是不可能的,所以总会有一定的时间是不一致的。同时,CAP中选择两个,比如你选择了CP,并不是叫你放弃A。

注意

在不存在网络分区的情况下,也就是分布式系统正常运行时(这也是系统在绝大部分时候所处的状态),也就是说在不需要P时,C和A能够同时保证。只有当发生分区故障的时候,也就是说在需要P时,才会在C和A之间做出选择。

最后我们来对比分析一下CA、CP以及AP这3种策略,以方便读者记忆和理解,具体如表1-4所示。

表1-4 CA、CP以及AP三种策略对比