概念

在研究CAP理论之前,我们首先要明确一下这三个名词都代表什么含义:

一致性 Consistency

不同于数据库事务ACID中C的含义,此处的一致性指的是所有的操作要看起来是顺序执行的,即后发生的读请求应该能看到它前面完成的写请求的结果。

可用性 Availability

可用性是指对系统中还在工作的节点发出的请求,在一定时间内服务端都应该做出响应,也就是说服务端不能忽略这个请求。

分区容错性 Partition Tolerance

首先,分区指的是一个节点发给另一个节点的信息全部丢失了,即两个节点之间无法同步数据,而分区容错性是指系统要能够允许这种情况发生。

什么是CAP理论

CAP理论是指在一个分布式系统中,一致性(Consistency),可用性(Availability)和分区容错性(Partition Tolerance)最多只能同时满足两项。
因为在现实世界中,网络分区可以说是必然发生的一件事情,所以一般分布式系统只能在满足分区容错性的基础上选择一致性或者可用性,即常说的CP或者AP。

证明

假设我们有一个非常简单的分布式系统,它只有两台机器A和B,并且发生了网络分区,即A和B之间不能互相通信。
此时,客户端向A发起了一个写请求,并且收到了成功的响应。接着客户端又对B发起了一次读请求,因为B没有收到来自A的同步信息,所以B只有两种选择:要么返回自身已知但已过时的信息,这就违背了一致性;要么不做出响应,这就违背了可用性。

应用场景

优先保证一致性(CP)

这种场景一般是对数据准确性要求较高的情况,如许多分布式数据库或者管理元数据、分布式锁的应用。如zookeeper会在选举leader期间停止对外提供服务,以此来保证一致性。
对于这种场景,最好能将各个节点部属在一个可靠的网络中,来尽量降低网络分区发生的可能性。

优先保证可用性(AP)

对于用户能够容忍一些不一致的场景,可以优先保证可用性。典型的案例是web缓存,相比于长时间加载不出来网页,用户看到没有更新的网页可能更容易接受。
在优先保证可用性的前提下,一般也会做到弱一致性,即一段时间后各个节点的信息还是会更新到同步状态。

动态调节一致性和可用性(TACT)

Tunable Availability and Consistency Tradeoffs,简称TACT,是Haifeng Yu和Amin Vahdat提出的一个概念。在这种场景下,不再将一致性和可用性看成非此即彼的关系,而是根据将其看作一个连续的变量,根据实际的需要在其中做选择。如飞机的订票系统,在余票较多的情况下可以优先保证可用性,而随着余票数量的下降,系统的一致性会越来越重要。例如Cassandra就使用了这种设计思路,可以在读写数据时设置consistency level,根据consistency level来调整系统提供更高的可用性还是一致性。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐