Skip to content

CAP理论

定义

CAP理论:一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。

  • 一致性(Consistency) :等同于所有节点访问同一份最新的数据副本;
  • 可用性Availability):每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据;
  • 分区容错性Partition tolerance):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择;(简单解释:分区容错性是尽管任意数量的消息被节点间的网络丢失或者延迟,系统仍然是正确运行的!)

为什么只能三选二

当没有网络分区或网络波动是,无需为了P而舍弃C和A中的一个。但是在分布式系统中不可能没有网络波动,所以为了保证P,也就是让整个分布式系统可用,就要舍弃C和A中的一个。

例如:存在三个副本,则对于这三个副本的写入有两种可能的方案:

  • W=1(一写):向三个副本写入,只要一个副本返回写入成功即认为成功;

    由于只要有一个副本写入成功即可返回成功;当存在网络分区后(如上图S1的网络和其他节点中断),三台机器的数据就可能出现不一致的情况,因此无法保证C;但是由于可以正常的返回写入成功,所以A可以保证!

  • W=3(三写):向三个副本写入,必须三个副本都写入成功才认为成功;

    此方案要求三个副本都要写入成功才可以返回成功;

    当出现网络分区后,由于无法保证三个节点都写入成功,因此最终会返回错误;

    所以此时失去了A,但是由于数据没有被成功写入,因此保证了C!

CAP理论在分布式数据库下的场景

对于NoSQL数据库,更加注重可用性,所以会是一个AP系统。

对于分布式关系型数据库,必须要保证一致性,所以会是一个CP系统。

我们可以将关系型数据库看作是 CP + HA(Hign Availability) 的系统,因此产生了两个重要且广泛使用的指标:

  • RPO(Recovery Point Objective,恢复点目标):指数据库在灾难发生后会丢失多长时间的数据,对于分布式数据库基本上 RPO=0;
  • RTO(Recovery Time Objective,恢复点时间):指数据库在灾难发生后到整个系统恢复正常所需要的时间,对于分布式数据库通常情况下 RTO<几分钟;

CAP理论下目前成熟的分布式方案

Quorum Replication

Quorum Replication 主要包括三个部分:

  • N:副本数;
  • W:写入成功副本数;
  • R:读取成功副本数;

当 N=3 时有两种设计:

  • W=1,R=3:写可用AP,读一致CP,如:记录流水系统,需要快速写入但是可以暂时无法读取,并且不可以读到老旧的错误流水;
  • W=3,R=1:写一致CP,读可用AP,如:电子商务系统,商家修改商品金额,可以容许暂时失败,但是会有大量客户去查看商品,需要保证读可用;

Consensus

在共识算法中,各个副本之间存在交互;

通常情况下,整个集群中会选举出一个 leader(例如:raft、paxos算法),所有操作由leader提供(读写操作);

  • 当 leader 没有出现故障的情况下,整个集群的 CA 都可以得到保障!
  • 当 leader 由于部分原因宕机,集群选举新的 leader,而此时系统在选举的短暂过程中不可用;

因此,共识算法通常都是一个 CP + HA 的系统;

Released under the MIT License.