您现在的位置是:首页 >其他 >架构技能(十一):CAP(下)网站首页其他

架构技能(十一):CAP(下)

棕生 2025-02-16 12:01:04
简介架构技能(十一):CAP(下)

在上一篇文章(《架构技能(十):CAP(上)》)中,聊到了 CAP 定理的几个关键点:

  • C 表示访问分布式系统中任何一个非故障的节点,都可以获取到写入成功的任何数据;

  • A 表示访问分布式系统中任何一个非故障的节点,都可以在合理的时间内获取到合理的结果;

  • P 表示分布式系统中各节点之间在网络中断的情况下,系统仍然要履行它的职责;

分布式系统在同一时空中,C、A、P 三个需求无法同时满足,最多满足其中两者,第三者临时舍弃;而分布式系统在大部分时间里处于 CA 模型状态,只有在很少的时间里,系统处于 CP 模型 或 AP 模型状态。

今天聊一下工程实践中,CA 模型、AP 模型和 CP 模型的实现方案。

CA 模型实现方案

CA 模型,应该是分布式系统在大多数时间里的一种常态,没有发生网络故障,没有分区,系统需要同时满足 C 的需求和 A 的需求。CA 模型在落地时包括数据的强一致性方案,多数一致性方案和最终一致性方案。

(1)强一致性方案

CAP 定理中的 C,理论上是指数据的强一致性,毕竟 “客户端可以从任何一个非故障节点读取到最新写入的数据”,站在客户端的角度,分布式系统就是处于数据强一致性的状态。强一致性方案模型见下图。

  • 分布式系统包括节点1、节点2和节点3;

  • 客户端对节点1执行写操作;

  • 节点1将数据写入本地,并将数据分别同步到节点2和节点3;

  • 当节点1、节点2和节点3数据全部写入成功后,再回复响应给到客户端;

  • 即在一个完整的数据写入事务中,需要所有节点全部写入成功;

  • 此时,客户端可以从任何一个非故障节点读取到写入成功的任何数据,同时得到结果也是合理的。

强一致性方案,能保证所有节点数据在客户端看来是强一致的;挂掉任何一个节点,分布式系统也可以继续提供读写服务;这个方案在生产中,因为需要所有节点全部成功写入,效率极低,除非对数据一致性有非常苛刻的要求,否则一般不会应用。

(2)多数一致性方案

多数一致性方案也可以达到 CAP 定理中 C 的需求,即客户端可以从任何一个非故障节点读取的任何写入成功的数据,只是需要一些中间步骤。多数一致性方案模型见下图。

  • 分布式系统包括节点1、节点2和节点3;

  • 客户端对节点1执行写操作;

  • 节点1将数据写入本地,并将数据分别同步到节点2和节点3;

  • 节点2和节点3数据写入成功后,回复 ack 到节点1;

  • 节点1 判断:只要节点1、节点2和节点3成功写入的节点数达到 2 个(即多数),就回复成功响应给到客户端;

  • 即在一个完整的数据写入事务中,只需要多数的节点写入成功即可。

多数一致性方案的目的在于,分布式系统挂掉任何少数的节点,分布式系统都不会丢失数据。客户端从任何一个节点读数据时,根据实际应用情况:如果对读取到的数据有最新的要求,那就驱动和等待该节点的数据同步到最新的版本后再返回;如果对读取的数据没有最新要求,那就节点直接返回本地数据就可以了。多数一致性方案在数据一致性和操作效率上取到了一个很好的平衡点。大名鼎鼎的分布式协调系统 Zookeeper 就是多数一致性方案的典型代表。

(3)最终一致性方案

最终一致性方案更贴近现实情况,执行效率更高,但是数据达到一致性状态的时间更长,是 CA 模型应用更广泛的实现方案,毕竟现实中对一致性有苛刻要求的系统占少数。最终一致性方案见下图。

  • 分布式系统包括节点1、节点2和节点3;

  • 客户端对节点1执行写操作;

  • 节点1将数据成功写入本地后,就回复成功响应给到客户端;

  • 然后节点1将数据异步同步到节点2和节点3;

  • 即在一个完整的数据写入事务中,只需要1个节点写入成功即可。

最终一致性方案的执行效率是最高的,但严格来讲,最终一致性方案已经无法满足 CAP 模型中的 C 的需求了,客户端从节点 2 和节点 3读数据时,无法保证能读取到最新的写入的数据。所以最终一致性方案可以理解为 0.5CA模型方案,但最终一致性方案却是应用最广的方案,理解与实践是存在一定差距的。

常用的异步同步手段,一般有两种:一是通过消息队列进行数据的异步同步,实现相对复杂,但实时性较高;二是通过数据库同步的方式进行数据的异步同步,实现相对简单,但实时性不高。

AP 模型实现方案

AP 模型是在分区发生后,临时舍弃了 C 的需求,此时系统仍然需要提供读写能力,但为了分区消失后,尽快满足 C 的需求,分布式系统需要做一些额外工作。AP 模型实现方案见下图。

  • 分布式系统包括节点1、节点2和节点3;

  • 节点2与节点3之间发生网络故障,产生了分区;

  • 客户端对节点1执行写操作;

  • 节点1将数据写入本地,并将数据同步到节点2,同时记录数据写入的日志;

  • 当节点1与节点3之间网络恢复后,节点1根据写入日志,再将数据同步到节点3。

分区发生后,节点1仍然继续提供数据的写入能力,节点3也仍然继续提供数据的读取能力;客户端对节点3数据的读取可能不是最新的,但一定是合理的;分区消失后,节点1根据日志将数据同步到节点3,恢复 CA 状态。

CP模型实现方案

CP 模型是在分区发生后,临时舍弃了 A 的写入需求,保证了节点之间数据的一致性,但是分布式系统可以继续提供数据的读取能力,即满足 0.5A 的需求,所以 CP 模型实质是 C0.5AP模型,当然,这里有一个重要的前提是针对强一致性方案的分布式系统。

关于 CAP 的理论解读和实现方案,应该如何结合分布式锁、分布式注册中心、分布式配置中心、分布式缓存、分布式数据库等案例,进行思考和落地呢?

最后,总结文中关键:

  1. CA 模型常见三类实现方案:

    (1)强一致性方案,节点达到一致性的时间最短,性能不好;

    (2)多数一致性方案,节点达到一致性的时间和系统性能做了很好的平衡;

    (3)最终一致性方案,节点达到一致性的时间最长,性能最好,应用普遍。

  2. AP 模型实现方案中,通常基于日志技术,方便分区消失后能尽快恢复 C 的状态;

  3. 在强一致性方案中,CP模型应该是 C0.5AP模型。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。