前言
对于分布式概念就不详细介绍了,分布式简单理解就是:一个业务分拆多个子业务,部署在不同的服务器上。
- 一般来说,一个子业务我们称为节点。
Content
首先,我们来看一下CAP分别代表的是什么意思:
C:数据一致性(consistency)
- 所有节点拥有数据的最新版本
A:可用性(availability)
- 数据具备高可用性
P:分区容错性(partition-tolerance)
- 容忍网络出现分区,分区之间网络不可达。
下面有三个节点(它们是集群的),此时三个节点都能够相互通信:
如果出现故障
由于我们的系统是分布式的,节点之间的通信是通过网络来进行的。只要是分布式系统,那很有可能会出现一种情况:因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。
- 数据就散布在了这些不连通的区域中,这就叫分区
- 现在出现了网络分区后,此时有一个请求过来了,想要注册一个账户。
- 此时我们节点一和节点三是不可通信的,这就有了抉择:
如果允许当前用户注册一个账户,此时注册的记录数据只会在节点一和节点二或者节点二和节点三同步,因为节点一和节点三的记录不能同步的。
- 这种情况其实就是选择了可用性(
availability
),抛弃了数据一致性(consistency
)
- 这种情况其实就是选择了可用性(
如果不允许当前用户注册一个账户(就是要等到节点一和节点三恢复通信)。节点一和节点三一旦恢复通信,我们就可以保证节点拥有的数据是最新版本。
- 这种情况其实就是抛弃了可用性(
availability
),选择了数据一致性(consistency
)
- 这种情况其实就是抛弃了可用性(
再次梳理一下CAP理论
一般我们说的分布式系统,P:分区容错性(partition-tolerance
)这个是必需的,这是客观存在的。
CAP是无法完全兼顾的,从上面的例子也可以看出,我们可以选AP,也可以选CP。但是,要注意的是:不是说选了AP,C就完全抛弃了。不是说选了CP,A就完全抛弃了!
在CAP理论中,C所表示的一致性是强一致性(每个节点的数据都是最新版本),其实一致性还有其他级别的:
弱一致性:弱一致性是相对于强一致性而言,它不保证总能得到最新的值;
最终一致性(eventual consistency):放宽对时间的要求,在被调完成操作响应后的某个时间点,被调多个节点的数据最终达成一致
可用性的值域可以定义成0到100%的连续区间。
所以,CAP理论定义的其实是在容忍网络分区的条件下,“强一致性”和“极致可用性”无法同时达到。
举例
Eureka就是采用了AP,放弃了C(只是暂时放弃了最终一致性而已)
Zookeeper是采用了CP,放弃了A(在宕机的时候,需要重新选举,选举途中是不可用的)
参考资料:
CAP理论中的P到底是个什么意思?https://www.zhihu.com/question/54105974
浅谈分布式系统的基本问题:可用性与一致性:https://m.aliyun.com/yunqi/articles/2709
分布式系统的CAP理论:http://www.hollischuang.com/archives/666
为什么CAP理论在舍弃P的情况下,可以有完美的CA?https://www.zhihu.com/question/285878189
不懂点CAP理论,你好意思说你是做分布式的吗?http://www.yunweipai.com/archives/8432.html
扩展阅读: