CAP 理论
1. CAP 理论简介
CAP 最早由 Eric Brewer在2000年提出,主要内容为:
在一个分布式系统中,以下三个特性最多只能同时满足两个:
- 一致性(Consistency):任何读请求要么获取到最新的值,要么获取到错误
- 可用性(Availability):任何读请求一定会获取一个响应,但可能不是最新的值
- 分区容错性(Partition Tolerance):系统在网络分区的情况下,仍然可以继续运行
由于网络问题发生在系统外部,充满了不可控因素,因此分区容错性是必须满足的。当我们提到 CAP 理论时,更多地是去讨论如何在 C 与 A 之间权衡,即实现 CP 系统还是 AP 系统。
2. CP 与 AP
2.1 CP 系统
CP 系统要求每个读请求都会获取最新的值,或者返回错误。换个角度讲,对于每一个写请求,只有当写入的数据被复制到所有的节点后,系统才会返回成功。
在数据从写入节点同步到其他节点时,读请求不会获取到最新的结果。如果请求该值,可能会返回错误。也就是在数据同步的过程中,系统会牺牲可用性。
由此可见,CP 适用于对数据一致性要求较高的场景,比如银行系统,订单系统,库存管理等等。
2.2 AP 系统
AP 系统要求每个读请求都会获取一个响应,但可能不是最新的值。也就是说,系统会尽可能地提供服务,而不是返回错误,虽然可能返回的是过期的数据。
AP 并不是不保证数据的一致性,一个写入请求写入的数据最终还是会同步给其他节点。但是在同步过程中,读请求可能会访问到尚未同步的节点,导致读取到过期的数据。
相对于 CP 系统,AP 系统更加强调系统能够返回响应,因此适用于对数据一致性要求不是那么高,但是对服务可用性要求较高的场景,比如社交网络,搜索引擎等等。
2.3 CP 与 AP 的取舍
CP 与 AP 的主要区别,就在于修改操作在同步到所有节点之前,是否能够被外部访问。因为多了等待同步到其他节点的步骤,CP 系统的写入 速度会低于 AP 系统。这也是一种比较常见的权衡,如果追求速度的话,势必会牺牲一些其他的特性,分布式系统中就是一致性。
3. 一致性模型
CAP 是一个理论模型,然而在实际的系统设计中,C 与 A 并不是严格对立的两级。不论是 CP 还是 AP,分布式系统最终都需要实现数据的一致性,业务场景的不同,对于 C 与 A 的需求也不尽相同。
根据对 C 与 A 的侧重,对于一致性的实现,从强到弱,可以分为以下几种模型:
3.1 强一致性
在强一致性模型中,每个操作都会关联上时间戳,所有的节点都会按照时间戳的顺序,同步所有的操作。
举例来说,假设有两个分布式节点 N1 与 N2 负责写入,N3 节点需要同步 N1 与 N2 写入的数据。N1 与 N2 执行了以下操作:
1. T1 时刻 N1 执行了操作 P1
2. T2 时刻 N2 执行了操作 P2
3. T3 时刻 N1 执行了操作 P3
4. T4 时刻 N2 执行了操作 P4
按照时间顺序 T1 < T2 < T3 < T4。
N3 在同步上述操作时,考虑到时间戳先后关系,需要按照 P1, P2, P3, P4 的顺序执行。
可以发现,线性一致性模型要求最高,相应地,执行效率也是最低的。
3.2 顺序一致性
所有的节点都以相同的顺序看到所有的操作,但是不一定以相同的时间顺序来执行。
回到刚才的例子,在顺序一致性模型下,N3 在同步上述操作时,P1 操作一定会在 P3 之前,P2 操作一定会在 P4 之前,但是 P1 与 P2 的顺序无需保证。
3.3 因果一致性
因果一致性模型要求,如果一个操作 B 是由操作 A 引起的,那么 B 的执行一定在 A 之后。
最简单的例子,也是因果一致性较为常见的应用场景──评论系统。
假设用户 A 在 T1 时刻发表了一个帖子 ,用户 B 在 T2 时刻回复了帖子。
在因果一致性模型下,同步此篇帖子的发帖与评论操作,用户 B 的回复操作一定在用户 A 的发帖操作之后;但是对于同步其他帖子,不同节点同步的顺序可能不同。
3.4 最终一致性
顾名思义,最终一致性只要求所有的节点最终会达到一致性的状态,也就是 N1 节点的写入操作 P1,最终会被 N2 等其他节点看到,但是需要多长时间能够被 N2 看到,这个不做保证。
因为只需要保证最终写入操作会被其他节点看到,当前节点写入后,即可返回成功,无需等待其他节点的同步,因此最终一致性模型的写入效率是最高的。
对于可用性要求较高的场景,最终一致性模型是一个不错的选择。
常见的使用最终一致性模型的系统包括 CDN,DNS 等。
3.5 强一致性与弱一致性
通常,线性一致性模型与顺序一致性模型被称为「强一致性」模型,因果一致性模型与最终一致性模型被称为「弱一致性」模型。
从线性一致性到最终一致性,一致性程度逐渐减弱,可用性逐渐增强,是一个从 C 到 A 的演进过程。
4. 总结
CAP 理论是分布式系统的理论根基。由于写入操作总是要同步到其他 的节点上,并且网络分区是不可避免的,那么分布式系统的一致性(Consistency)与可用性(Availability)就不可兼得。
在系统设计的过程中,最重要的就是根据实际的业务场景,选择合适的模型。对于数据一致性要求较高的场景,比如交易系统、库存系统等,侧重于设计为 CP 系统;对于服务可用性要求较高的场景,比如社交网络、搜索引擎等,则侧重于实现 AP 系统。
然而 CAP 是一个理论基础,在实际过程中,C 与 A 并非完全对立的两面,根据对可用性与一致性的需求不同,从一致性的强到弱,又衍生出了一系列一致性模型:线性一致性、顺序一致性、因果一致性、最终一致性。
根据业务的场景不同,对数据的一致性要求不同,在系统设计时,需要选择合适的一致性模型,可以更好地在一致性与可用性之间,找到一个平衡点。