CAP理论
CAP理论又称布鲁尔定理( Brewer's theorem ), 是分布式计算领域公认的一个定理.
CAP是数据一致性( data Consistency ), 服务可用性( service Availability ) 和网络分区容错性( network Partition Tolerence )的缩写. CAP理论是说, 分布式系统中这三个基本需求, 最多只能同时满足其中的两项.
数据一致性data Consistency
在分布式环境中, 一致性是指数据在多个副本之间是否能保持一致的特性.在一致性的需求下, 当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一致的状态.
对于在一个将数据副本分布在不同分布式节点上的系统来说, 如果对第一个节点的数据进行了更新操作并且更新成功后,却没有使得第二个节点上的数据得到相应的更新,于是在对第二个节点的数据进行读取操作时, 获取的依然是老数据(或称为脏数据), 这就是典型的分布式数据不一致情况. 在分布式系统中, 如果能够做到针对一个数据项的更新操作执行成功后,所有的用户都可以读取到其最新的值,那么这样的系统就被认为具有强一致性(或严格的一致性).
服务可用性 service Availability
指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果.
有限的时间内是指, 对于用户的一个操作请求, 系统必须能够在指定的时间(即响应时间)内返回对应的处理结果,如果超过了这个时间,那么系统就被认为是不可用的. 另外, "有限的时间内"是一个在系统设计之初就设定好的系统运行指标, 通常不同的系统之间会有很大的不同. 如: google搜索引擎,通常在0.5内做出反应. 而一个尿检可能需要30分钟或更长时间(只是举个例子而已...). 而一个BTC交易确认时间可能需要10分钟, 而换成EOS会快很多.
用户对于一个系统的请求响应时间的期望值不尽相同, 但无论系统之间的差异有多大, 唯一相同的一点就是对于用户请求, 系统必须存在一个合理的响应时间, 否则用户便会对系统感到失望. 可以想像, 如果EOS交易速度和BTC一样... 那谁还卖柚子...
返回结果它要求系统在完成对用户请求的处理后, 返回一个正常的响应结果. 正常的响应结果通常能够明确地反映出对请求的处理结果,即成功或失败, 而不是一个让用户感到困惑的返回结果.
比如,搜索引擎返回"out of service" 或 "404" 等提示语, 表明系统此时不可用.
网络分区容错性network Partition Tolerence
网络分区: 组成一个分布式系统的每个节点的 加入与退出 都可以看作是一个特殊的网络分区.
网络分区容错性约束了一个分布式系统需要具有如下特性:
在遇到任何网络分区故障的时候, 仍需要能够保证对外提供满足一致性和可用性的服务, 除非是整个网络环境都发生了故障.
网络分区是指在分布式系统中, 不同的节点分布在不同的子网络(机房或异地网络等)中, 由于一些特殊的原因导致这些子网络之间出现网络不连通的状况, 但各个子网络的内部网络是正常的, 从而导致整个系统的网络环境被切分成了若干个孤立的区域.
比如: 淘宝的光缆虽然被挖断, 但影响的只有一个小部分用户.
| 放弃CAP定理 | 说明 |
|:--------------------| ---:--- |
| 放弃 P | 如果希望能够避免系统出现分区容错性问题, 简单的做法是将所有的数据( 或者 仅仅是那些与事务相关的数据 ) 都放在一个分布式节点上. 此做法虽无法 100%保证系统不会出错, 但至少不会碰到由于网络分区带来的负面影响. 但同时需要的是, 放弃P的同时也意味着放弃了系统的可扩展性. |
| 放弃 A | 相对于放弃"分区容错性"来说, 放弃可用性则正相反, 其做法是一旦系统遇到网络分区或其他故障时, 那么受到影响的服务需要等待一定的时间, 因此在等待期间系统无法对外提供正常的服务, 即不可用. |
| 放弃C | 此处的放弃一致性,并不是完全不需要数据一致性, 如果真这样, 那么系统的数据就没有意义了, 整个系统没有存在的价值. 事实上, 放弃一致性指的是放弃数据的强一致性, 但是能够承诺的是, 数据最终会达到一个一致的状态. 这就引入了一个时间窗口的概念, 具体多久能够达到数据一致性取决于系统的设计, 主要包括数据副本在不同的节点之间的复制时间长短. |
从CAP的定理看出, 一个分布式系统不可能同时满足 数据一致性, 服务可用性和网络分区容错性这三个需求.
另一方面, 需明确的是网络分区容错性是分布式系统的一个最基本要求. 因为, 分布式系统必然被部署到不同的节点, 否则就不是分布式了, 因此必然出现子网络. 对于分布式系统而言, 网络问题又是一个必定会出现的异常情况. 因此网络分区容错性就成为了一个分布式系统必然需要面对和解决的问题. so, 系统架构师往往需要把精力花在如何根据业务特点在C(数据一致性)和A(服务可用性)之间寻求平衡.
网友评论