美文网首页程序员
CAP理论及其应用

CAP理论及其应用

作者: 十年磨一剑1111 | 来源:发表于2020-05-18 15:05 被阅读0次

对于开发或设计分布式系统架构的架构师、工程师来说,CAP是必须要掌握的基础理论,CAP理论可以帮助架构师对系统设计中的目标进行取舍,合理的系统才分的维度。下面我们先来了解下分布式系统的特点。

1. 分布式系统的特点

1)背景
随着移动互联网的快速发展,互联网的用户数量越来越多,产生的数据规模也越来越大,对应系统提出了更高的要求,我们的系统必须支持高并发访问和海量数据处理。
分布式系统技术就是用来解决集中式架构的性能瓶颈问题,来适应快速发展的业务规模,一般来说,分布式系统是建立在网络之上的硬件或者软件系统,彼此之间通过消息等方式进行通信和协调。
分布式系统的核心是可扩展性,通过对服务、存储的扩展,来提高系统的处理能力,通过对多台服务器协同工作,来完成单台服务器无法完成的任务,尤其是搞并发或者大数据量的任务。
2) 特点
除了对可扩展性的需求,分布式系统还有不出现单点故障、服务或者存储无状态等特点。
单点故障: 系统中某一组件一旦失效,这会让整个系统无法工作,而不出现单点故障,单点不影响整体,就是分布式系统的设计目标之一;
无状态
因为无状态的服务才能满足部分机器宕机不影响全部,可以随时进行扩展的需求。
3) 缺点
由于分别系统的特点,在分布式环境中更容易出现问题,比如节点之间通信失败、网络分区故障、多个副本的数据不一致等,为了更好的在分布式系统下进行开发,学者们提出了一系列理论,其中具有代表性的就是CAP理论。

2. CAP理论介绍

CAP理论:一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance) 这三项中的两项。下面画一张图来帮助大家记录


CAP模型.png

一致性: 是指“所有节点同时看到相同的数据”,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致,等同于所有节点拥有数据的最新版本。
可用性: 是指在“任何时候,读写都是成功的”,即服务一直可用,而且是正常响应时间。
分区容忍性:是指“当部分节点出现消息丢失或者分区故障的时候,分布式系统仍然能够继续运行”,即系统容忍网络出现分区,并且在遇到节点或网络分区之间网络不可达的情况下,仍然能够对外提供满足一致性和可用性的服务。
在分布式系统中,由于系统的各层拆分,P是确定的,CAP的应用模型就是CP架构和AP架构。分布式系统所关注的,就是在Partition Tolerance 的前提下,如何实现更好的A和更稳定的C。

3. CAP理论的应用

CAP理论提醒我们,在架构设计中,不要把精力浪费在如何设计能满足三者的完美分布式系统上,而要进行合理的取舍,CAP理论类似数学上的不可能三角,只能三者选其二,不能全部获得。
不同的业务对于一致性的要求是不同的。举个例来讲,在微博上发表评论和点赞,用户对不一致是不敏感的,可以容忍相对较长的时间的不一致,只要做好本地的交互,并不会影响用户体验;而我们的电商购物时,产品价格数据是要求强一致的,如果商家更改价格不能实时生效,则会对交易的成功率产生非常大的影响。
需要注意的是,CAP理论中是忽略网络延迟的,也就是当事务提交时,节点间的数据复制是一定需要花费时间的。即使是同一个机房,从节点A复制到节点B,由于现实中网络不是实时的,所有总会有一定的时间不一致。

4. CP和AP架构的舍取

在通常的分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本,网络分区是既成的现实,于是只能在可用性和一致性两者间做出选择。CAP理论关注的是在绝对情况下,在工程上,可用性和一致性并不是完全对立的,我们关注的往往是如何在保持相对一致性的前提下,提高系统的可用性。
1) CP架构:放弃可用性,追求一致性和分区容错性。我们熟悉的ZooKeeper就是采用了CP一致性,这意味着面对网络分区时,为了一致性,它是不可用的。
2) AP架构:放弃强一致性,追求分区容错性和可用性,这是很多分布式系统设计时的选择。Base理论也是根据AP来扩展的。

5. CAP理论的证明

有小伙伴可能会比较疑惑,为啥不能够同时满足一致性,可用性和分区容错性。有很多的前辈帮我们已经证明了,通过反证的方法是最直观的,下面通过一个实际场景,如果CAP三者可同时满足,由于允许P的存在,则一定存在Server之间的丢包,如此则不能保证C。


单一架构.png

首先构造单机系统,如上图,Client A可以发送指令到Server 并且设置更新X的值,Client1 从Server读取该值,在单点情况下,即没有网络分区的情况下,通过简单的事务机制,可以保证Client1 读到的数据始终是最新值,不存在不一致的问题。


多节点架构.png
我们在系统中增加一组节点,因为允许分区容错,Write操作可能在Server 1 上成功,在Server 2 上失败,这个时候Client1 和Client2,就会读取到不一致的值,出现不一致的情况,如果要保持X值的一致性,Write 操作必须同时失败,也就是降低了系统的可用性。
可以看到,在分布式系统中,无法同时满足CAP理论中的,“一致性”,“可用性”和“分区容错性”。

在该证明中,对CAP的定义进行了更明确的声明:
Consistency: 一致性被称为原子对象,任何的读写都应该看起来是“原子”的,或串行的,写后面的读一定能读到写前面的内容,所有的读写请求都好像被全局排序。
Availability: 对任何非失败节点都应该在有限的时间内给出请求的回应;
Partition Tolerance:,允许节点之间丢失任意多的消息,当网络分区发生时,节点之间的消息可能会完全丢失。

参考文章:如何证明分布式系统的CAP理论。

今天就写到这里,想学习分布式的小伙伴要重视基础哦,如果一些基础的概念都搞不清楚的话,学起来就会比较迷糊。

相关文章

网友评论

    本文标题:CAP理论及其应用

    本文链接:https://www.haomeiwen.com/subject/xequohtx.html