CAP理论简介
CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency
(一致性)、 Availability
(可用性)、Partition tolerance
(分区容错性),三者不可得兼,只能三选二
。
- 一致性(C): 在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
- 可用性(A):保证每个请求不管成功或者失败都有相应。
- 分区容忍性(P):系统中任意信息的丢失或失败不会影响系统的继续运作。
CAP实际场景介绍
C:一致性
对分布式系统所有节点进行写请求(对数据的增删改)完成后,不同节点的读请求在同一时刻读取到的数据要一致,读取到的都是写请求发生变化后的数据。
A:可用性
对分布式系统发起读请求或是写请求后,系统必须响应该请求返回结果。
必须满足如下2个条件:
- 1.返回结果必须在合理的时间以内。这个合理的时间是根据业务来定的。
当业务设计改请求在100毫秒内响应时,合理的时间就是100毫秒内;如果超过设定的100毫秒,如200毫秒才响应,那么这个系统就不满足可用性。 - 2.需要系统内能正常接收请求的所有节点都可返回结果。这涵盖了2层含义:
- 2.1如果部分节点不能正常接收请求了,比如宕机了、系统崩溃了,而其他节点依然能正常接收请求并相应,那么该系统依然是可用的,不影响可用性指标。
- 2.2如果节点能正常接收请求,但是节点的数据有问题:各节点的数据并不一致,那么也须响应该请求,与数据是否一致无关。比如,系统内有2个正常节点A与B,节点A的数据是1小时前的,节点B的数据是1分钟之前的;如果一个读请求发送到节点A上,则在明知道节点A是1小时前的旧数据的前提下,仍然必须响应返回1小时前的旧数据,不能拒绝响应。
P:分区容忍性
- 首先,什么是分区?
分布式系统有很多节点,这些节点之间的通讯基于网络传输。而网络是不可靠的,是人为无法100%保证不出问题的。当网络出现问题时,节点之间通讯中断,此时系统出现了物理意义上的分区。注意:分区并完全都是由于网络问题引起,如机器故障也会导致节点通讯出现问题,系统出现分区现象。
综上,可以知道在分布式系统中,只要节点通信出现了问题,那么就出现了分区。 - 那么,分区容忍性指什么?
它是说,如果出现了分区问题,我们的分布式系统还要继续运行,响应请求。
不能因为出现了分区问题,整个分布式系统的所有节点全部停止,不响应请求。
为什么CAP原理在分布式系统中只能三选二,不可兼得?
在CAP原理简介中,已经说明了分布式系统只能设计成满足CAP三原理中的二种。
为什么?
经过CAP实际场景介绍,我们知道在一个分布式系统中,分区现象是无法100%完全避免的。如果不考虑分区容忍性,一旦系统发生分区现象,整个系统就无法使用了,这是不符合实际需要的。所以P在设计分布式系统时已经是默认的,必须考虑满足的一种特性!
在满足分区容忍性的前提下,为什么不能同时一致性和可用性呢?
为了满足数据一致性,则会导致当有写请求发生时,数据需要全部同步到所有节点,读请求必须等到所有节点数据都更新一致后,才能响应,响应之前所有读请求阻塞!响应超时或超出业务定义的响应时间,破坏可用性。
而为了提高可用性,则会在系统中部署多个节点,节点越多,系统可用性越高,为了各节点响应及时,数据一致性就越难满足
综上,分布式系统在保证分区容忍性时,如果保证可用性,则不能保证一致性;如果保证一致性,则不能保证可用性
。