Skip to content

一、理解CAP ​

CAP是Consistency、Availability、Partition tolerance三个词语的缩写,分别表示一致性、可用性、分区容忍性。

为了方便更好的理解CAP定理,我这里使用电商系统商品管理系统来解释执行流程如下:

  • 1、商品服务请求主数据库写入商品信息(添加商品、修改商品、删除商品)
  • 2、主数据库向商品服务响应写入成功
  • 3、商品服务请求从数据库读取商品信息

1、一致性(C - Consistency) ​

一致性是指写操作后的读操作可以读取到最新的数据状态。当数据分布在多个节点上,从任意节点读取到的数据都是最新的状态。商品信息的读写要满足一致性就是要满足如下目标:

  • 1、商品服务写入主数据库成功,则向从数据库查询新数据也成功。
  • 2、商品服务写入主数据库失败,则向从数据库查询新数据也失败。

如何实现一致性?

  • 1、写入主数据库后要将数据同步到数据库。
  • 2、写入主数据库后,在向从数据库同步期间要将从数据库锁定,待同步完成后再释放锁。这样可以避免在新数据写入成功后向从数据库查询到旧数据。

一致性的特点

  • 1、由于存在数据同步的过程,写操作的响应会有一定的延迟。
  • 2、为了保证数据一致性会对资源暂时锁定,待数据同步完成释放锁定资源。
  • 3、如果请求数据同步失败的节点则会返回错误信息,一定不会返回旧数据。

2、可用性(A - Availability) ​

可用性是指任何事务操作都可以得到响应结果,且不会出现响应超时或响应错误。商品信息读取满足可用性就是要实现如下目标:

  • 从节点数据库接收到查询数据的请求则立即能够响应数据查询结果。

  • 从节点数据库不允许出现响应超时或者响应出错。

如何实现可用性?

  • 1、写入主数据库后将数据同步到从节点数据库

  • 2、由于要保证从数据库的可用性,不可将从数据库资源的资源锁定。

  • 3、即使数据还没有从主节点数据库同步到从节点数据库,从节点数据库查询也要返回数据。返回的数据哪怕是旧数据也可以。如果连旧数据也没有,则可以提前约定返回一个默认信息,但不能返回错误或者响应超时。

可用性的特点

  • 所有请求都有响应,且不会出现响应超时或响应错误。

3、分区容错性(P -Partition tolerance) ​

通常分布式系统的各个节点部署在不同的子网(网络分区)。不可避免的会出现由于网络问题而导致节点的通信失败。此时仍可以对外提供服务,这叫分区容错性。

商品信息读写满足分区容错性需要实现以下目标

  • 主数据节点向从数据库节点同步数据失败不影响读写操作

  • 其中一个节点挂掉不影响其他节点对外提供服务

如何实现分区容错性?

  • 尽量使用异步代替同步操作,例如使用异步方式将数据从主数据库节点同步到从数据库节点。这样节点之间能够有效的实现松耦合。

  • 添加多个从数据库节点,其中一个节点挂掉其他从节点提供服务

分区容错性特点

  • 分区容错性是分布式系统必须具备的能力

二、CAP定理的组合详解 ​

1、分布式系统是否同时具备CAP呢? ​

在所有分布式事务场景中不会同时具备CAP三个特性。因为在具备了P的前提下C和A是不能共存的,比如:

1)满足P的场景

主数据库通过网络向从数据同步数据,可以认为主从数据库部署在不同的分区,通过网络交互。当主数据库和从数据库之间的网络出现问题,不影响主数据库和从数据库对外提供服务。其中一个结点挂掉不影响另一个结点对外提供服务。

2)满足C的场景

在数据同步的时候,为防止向从数据库查询不一致的数据,则需要将从数据库数据锁定。待同步完成后解锁。如果同步失败,从数据库要返回错误信息或超时信息。

3)满足A的场景

不管任何时候都可以向从数据查询数据,则不会响应超时或返回错误信息。结论:通过以上分析发现在满足P的前提下C和A存在矛盾性。

2、CAP有哪些组合方式呢? ​

所以在生产中对分布式事务处理时要根据需求来确定满足CAP的哪两个方面。

1)AP

放弃一致性,追求分区容忍性和可用性。这是很多分布式系统设计时的选择。例如:上边的商品管理,完全可以实现AP。前提是只要用户可以接受所查询的到数据在一定时间内不是最新的即可。

通常实现AP都会保证最终一致性,后面讲的BASE理论就是根据AP来扩展的。一些业务场景比如:订单退款,今日退款成功,明日账户到账。只要用户可以接受在一定时间内到账即可。

2)CP

放弃可用性,追求一致性和分区容错性。我们的zookeeper就是追求的强一致。又比如跨行转账,一次转账请求要等待双方银行系统都完成整个事务才算完成。

3)CA

放弃分区容忍性,即不分区,不考虑由于网络不通或结点挂掉的问题,则可以实现一致性和可用性。那么系统将不是一个标准的分布式系统,我们最常用的关系型数据就满足了CA。上边的商品管理,如果要实现CA则架构如下:主数据库和从数据库中间不再同步数据。数据库可以响应每次的查询请求,通过事务隔离级别实现每个查询请求都可以返回最新的数据。

注记:「三选二」是教科书式的经典表述,本文即按此口径讲解。但对"CA/P 三选二"也存在异议(Brewer 本人后续补充):分区并非常态,多数时间里系统可以同时拥有 C 和 A,只在分区发生期间才需要两者取舍。两种说法都对,适用前提不同,详见 分布式理论-BASE 的「CAP的3选2伪命题」一节。

三、总结 ​

CAP是一个已经被证实的理论。一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。它可以作为我们架构设计、技术选型的考量标准。

对于多数大型互联网应用的场景,结点众多、部署分散,而且现在的集群规模越来越大。所以节点故障、网络故障是常态。而且要保证服务可用性达到N个9(99.99...%),并要达到良好的响应性能来提高用户体验。因此一般都会选择:保证P和A,舍弃C强一致,保证最终一致性。