谈谈CAP定理
谈一谈系统领域经典的CAP定理。
在传统的系统设计中,提升体系的性能有两种方式:
- 优化程序的设计,例如I/O从线程并发改为协程并发。
- 提升硬件资源。
现在的系统设计通常采用第三种方式:水平扩展。但水平拓展的设计更复杂。基于水平扩展设计的分布式系统需要考虑三个因素:
- 一致性
- 可用性
- 区分容错性
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。