CAP原则详解

CAP原则又称CAP定理:

指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

C:Consistency

一致性

“all nodes see the same data at the same time ”
更新操作成功并返回客户端完成后, 所有节点在同一时间的数据应该完全一致。
访问所有的节点得到的数据应该是一样的。注意,这里的一致性指的是强一致性,也就是数据更新完,访问任何节点看到的数据完全一致,要和弱一致性,最终一致性区分开来。

A:Availability

“Reads and writes succeed”

服务一直可用,而且是正常响应时间

所有的节点都保持高可用性。注意,这里的高可用还包括不能出现延迟,比如如果节点B由于等待数据同步而阻塞请求,那么节点B就不满足高可用性。

P:Partiton tolerance

分区容错性

“the system continues to operate despite arbitrary message loss or failure of part of the system”

分布式系统在遇到某节点或网络分区故障的时候,仍然能对外提供服务

这里的分区是指网络意义上的分区。由于网络是不可靠的,所有节点之间很可能出现无法通讯的情况,在节点不能通信时,要保证系统可以继续正常服务。

分区容错性实现目标,某一个节点挂掉并不影响另一个节点提供服务

实际开发中的设计选择

以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择

CAP原理说,一个数据分布式系统不可能同时满足C和A和P这3个条件。所以系统架构师在设计系统时,不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。由于网络的不可靠性质,大多数开源的分布式系统都会实现P,也就是分区容忍性,之后在C和A中做抉择。

CAP原则的精髓就是要么AP,要么CP,要么AC,但是不存在CAP。

CAP原理简单证明

假设有节点data1和节点data2,一开始有个数据number=1。之后向data1提交更新,将数据number设置为2。
接着data1就需要将更新推送给data2,让data2也更新number数据。
接下来我们分3个场景分析:

1. 在保证C和P的情况下

为了保证数据一致性,data1需要将数据复制给data2,即data1和data2需要进行通信。但是由于网络是不可靠的,我们系统有保证了分区容忍性,也就是说这个系统是可以容忍网络的不可靠的。这时候data2就不一定能及时的收到data1的数据复制消息,当有请求向data2访问number数据时,为了保证数据的一致性,data2只能阻塞等待数据真正同步完成后再返回,这时候就没办法保证高可用性了。
所以,在保证C和P的情况下,是无法同时保证A的。

2. 在保证A和P的情况下

为了保证高可用性,data1和data2都有在有限时间内返回。同样由于网络的不可靠,在有限时间内,data2有可能还没收到data1发来的数据更新消息,这时候返回给客户端的可能是旧的数据,和访问data1的数据是不一致的,也就是违法了C。
也就是说,在保证A和P的情况下,是无法同时保证C的。

3. 在保证A和C的情况下

如果要保证高可用和一致性,只有在网络情况良好且可靠的情况下才能实现。这样data1才能立即将更新消息发送给data2。但是我们都知道网络是不可靠的,是会存在丢包的情况的。所以要满足即时可靠更新,只有将data1和data2放到一个区内才可以,也就丧失了P这个保证。其实这时候整个系统也不能算是一个分布式系统了。

关于CAP原理,还需要特别注意的一点是,虽然说我们设计系统时不能同时保证拥有三点。但是也并不是说,保证了其中2点后,就要完全抛弃另外一点。只是相对的要做一些牺牲。比如在保证CP的情况下,虽然没办法保证高可用性,但这不意味着可用性为0,我们可以通过合理的设计尽量的提高可用性,让可用性尽可能的接近100%。同理,在AP的情况下,也可以尽量的保证数据的一致性,或者实现弱一致性,即最终一致性。

相关推荐

  1. CAP原则详解

    2024-04-08 17:08:06       13 阅读
  2. cpp混淆详解

    2024-04-08 17:08:06       10 阅读
  3. CAN】知识点:CAN故障与错误帧详解

    2024-04-08 17:08:06       8 阅读
  4. Linux中关于cat命令详解

    2024-04-08 17:08:06       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-08 17:08:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-08 17:08:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-08 17:08:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-08 17:08:06       18 阅读

热门阅读

  1. Policy Gradient-优化动作选择函数

    2024-04-08 17:08:06       12 阅读
  2. Spring Cloud五大组件以及工作原理

    2024-04-08 17:08:06       15 阅读
  3. 前端js获取当hppt协议

    2024-04-08 17:08:06       15 阅读
  4. 想做产品经理,应该选择什么专业?

    2024-04-08 17:08:06       16 阅读
  5. 1368:对称二叉树(tree_c)

    2024-04-08 17:08:06       16 阅读
  6. c++组合requires语句

    2024-04-08 17:08:06       18 阅读
  7. 蓝桥杯第十五届抱佛脚(十)贪心算法

    2024-04-08 17:08:06       17 阅读
  8. Git Flow困境逃脱指南

    2024-04-08 17:08:06       15 阅读
  9. Go-学会使用切片

    2024-04-08 17:08:06       15 阅读
  10. RPM换算成m/s或m/min

    2024-04-08 17:08:06       16 阅读
  11. GO - 标准库

    2024-04-08 17:08:06       15 阅读
  12. Hamilton-Jacobi-Bellman (HJB) 方程

    2024-04-08 17:08:06       17 阅读