天天看点

有人问你什么是CAP?你就把这篇文章发给他

1、什么是分布式系统

CAP定理是分布式存储系统的基石,分布式系统(distributed system)指的是建立在网络上的软件系统,它是多个计算机节点通过协调工作的方式,共同完成任务的系统。分布式系统解决了单个计算机无法完成的计算和存储任务。但是分布式系统的设计十分复杂,设计者必定面临诸多挑战,比如节点故障、网络分区、异地网络等等问题。

2、垂直扩展和水平扩展

上面有说到分布式系统,分布式和水平扩展等概念经常会一起出现,文中也通过阅读资料和自己的理解总结一下计算机系统超负荷时,常用的两种扩展解决手段。

有人问你什么是CAP?你就把这篇文章发给他

垂直扩展(纵向扩展、向上扩展、Scale up):

指的是增加现有系统部件的内存、CPU等资源来提升系统的负荷能力。

水平扩展(横向扩展、向外扩展、Scale Out):

指的是在现有系统部件的基础上新增新的机器来提升系统的符合能力。

优缺点:

垂直扩展实现简单,但是机器的增加硬件资源仍然容易达到性能瓶颈,需要继续扩展。

水平扩展实现复杂,但是相比之下能带来系统的高可用、高吞吐量等优势。

3、CAP原则

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

有人问你什么是CAP?你就把这篇文章发给他

一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)

可用性(A):保证每个请求不管成功或者失败都有响应。

分区容错性(P):系统中任意信息的丢失或失败不会影响系统的继续运作。

上面有说到分布式系统建立在网络上,需要依靠网络来进行节点之间的通信,由于网络的不稳定性是必然存在的,这可能会导致节点网络断开,专业术语叫“网络分区”。

有人问你什么是CAP?你就把这篇文章发给他

在上图中当网络分区产生的时候,分布式节点之间无法进行通信,数据无法及时同步,此时客户端对Node A节点数据的修改无法同步到Node B节点上,这会导致分布式系统中数据不一致,一致性(Consistency)将无法得到保证,如果此时要保证分布式系统中数据一致性,那么只能停止提供服务,等待节点网络恢复数据同步之后,在提供服务,但是这样系统就无法满足可用性(Availability)。

因此CAP原理可以这样简单的总结:当网络分区发生时,一致性和可用性不可兼得。

4、如何取舍

CAP理论应该如何取舍,CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。并且上面有分析在分布式系统中网络分区必然存在的问题,因此理论上CAP在分布式系统中只有CP和AP两种选择。

CP—不要求可用性(Availability),CP追求的是强一致性,每个服务器节点之间的数据必须保证完全一致,选择CP会导致系统在发生网络分区时,无法对外提供服务。CP强一致性的系统架构在银行转账系统中比较常见。Redis、HBase等数据库也是典型的强一致性分布式数据库。

AP—不要求一致性(Consistency),AP追求的是系统高可用,在网络分区发生时,分布式系统仍然能够提供服务,这会导致数据短暂的不一致性。AP高可用的系统架构在淘宝、京东等电商系统的秒杀活动中比较常见。

CA—不允许分区(Partition tolerance),这种情况不符合分布式系统架构,一般情况下都是Mysql、Oracle等RDBMS传统的关系型数据库。

5、资源推荐

关于CAP理论,其实比较简单,但是具体运用于分布式系统实现起来是非常复杂的。网上的文章非常多,我感觉其实只需要看下

Robert Greiner

的两篇文章就可以。

https://robertgreiner.com/cap-theorem-explained/ https://robertgreiner.com/cap-theorem-revisited/