谈一谈系统领域经典的CAP定理。

在传统的系统设计中,提升体系的性能有两种方式:

  1. 优化程序的设计,例如I/O从线程并发改为协程并发。
  2. 提升硬件资源。

现在的系统设计通常采用第三种方式:水平扩展。但水平拓展的设计更复杂。基于水平扩展设计的分布式系统需要考虑三个因素:

  1. 一致性
  2. 可用性
  3. 区分容错性

CAP理论指出,一个分布式系统中,上述三种因素无论什么情况只能满足两种。

背景

  • 分布式系统(Distributed System)是建立在网络上的软件,具有高度的透明性。透明性指每个网络节点对用户应用来说都是透明的,无法区分是本地还是远程。在分布式数据库系统中,用户感觉不到数据是分布的,用户无需关心数据库是否分割、有无副本、具体位于哪个网络节点上。

  • 著名的分布式系统就是万维网(World Wide Web)

  • 分布式系统中各网络节点的协调需要CAP理论做支撑。

CAP概念

CAP理论由Eric Brewer教授在ACM PODC会议上提出的,这个理论是NoSQL数据库的基础。后来由Seth Gilbert和Nancy Lynch两人证明了CAP理论的正确性。

  • 强一致性(Consistency)
    all nodes see the same data at the same time
    分布式系统中,更新操作执行成功后所有用户都读到最新值,表明该系统是强一致性的。
  • 可用性(Availability)
    Reads and writes always succeed
    每个操作总能在一定时间内有返回结果。一定时间指系统的结果必须在给定的时间内返回,如果超时就认为系统不可用。返回结果指操作成功后状态变更信息和操作的目标结果。
  • 区分容错性(Partition Tolerance)
    the system continues to operate despite arbitrary message loss or failure of part of the system
    区分容错性可以理解为系统在存在网络分区的情况下仍然可以接受请求(满足一致性和可用性)网络区分指因故障导致网络分离出孤立的两部分。也可以看做单节点或部分网络动态地连接、断开系统的网络。

CAP理论

在分布式环境中设计和部署系统时所考虑的三个重要的系统需求中,CAP理论表明,数据共享系统只能满足这三个特性中的两个。因此要根据具体的业务情况选择合理的特性组合。具体见特性选择

特性选择

  • 选择组合
序号 选择 例子
1 CA 传统关系数据库
2 CP 分布式数据库、分布式加锁
3 AP DNS、互联网产品微信头像更改
  • 放弃C
    放弃C只是指放弃分布式系统的强一致性,而并不是放弃数据的一致性。系统还是保留最终一致性。举一个直观的例子。电商平台某商品剩余量为一,系统受到两个终端同时下定,那么较晚的订单被告知商品售罄。这样就保持了数据的一致性。
  • 放弃A
    系统一旦遇到区分容错故障,那么受到影响的服务需要等待数据的一致性,在等待期间系统暂时处于不可用状态。具体例子参考CP系统的实现过程以及功能特点。
  • 放弃P
    首先NoSQL一般都把P放在考虑之内。因为数据量太大,考虑扩展性,通常情况下无法放到同一台机器上。放弃P就是传统关系型数据库的做法,把数据放在同一台机器上,避免网络节点出现网络孤岛的情况下带来的负面影响,如数据不一致,数据不完整,数据不存在。
  • 其他选择
    引入BASE。BASE全称是Basically, Availability, Soft-State, Eventually consistency。
    该方法支持最终一致性。具体参考BASE

推广例子

在Google的分布式论文Spanner/F1中提出的数据库存储系统并没有严格按照CAP中的三选二来设计系统。整个系统表现出CP特性,但它是高可用的。详细请看Google的Spanner/F1。