already收藏

【CAP】分布式CAP理论:一致性、可用性和分区容错性

2022-04-07  本文已影响0人  Bogon

关于一致性、可用性和分区容错性

CAP定理是分布系统中的一个基本定理,它指出任何分布系统最多可以具有以下三个属性中的两个。

一致性 (Consistency)

可用性 (Availability)

分区容错性 (Partition tolerance)

一致性:读操作总是能读取到之前完成的写操作结果,满足这个条件的系统称为强一致系统,这里的“之前”一般对同一个客户端而言;

可用性:读写操作在单台机器发生故障的情况下仍然能够正常执行,而不需要等待发生故障的机器重启或者其上的服务迁移到其他机器;

分区可容忍性:机器故障、网络故障、机房停电等异常情况下仍然能够满足一致性或可用性。

CAP is often misunderstood as a choice at all times of which one of the three guarantees to abandon . In fact , the choice is between consistency and availability only when a network partition orfailure happens . When there is no network failure , both availability and consistency can be satisfied 。

CAP 常常被误解为在任何时候都可以选择放弃三个中的哪一个。 事实上,只有在发生网络分区或故障时,才能在一致性和可用性之间进行选择。 在没有网络故障的情况下,可用性和一致性都可以得到满足。

一致性:

如下图1中所示,Client A负责更新数据,为了保证Server 1和Server 2上的数据是一致的,Client A会将X=1的写操作同时发给Server 1和Server 2,但是当Client A和Server 2之间发生网络分区(网络无法连接)时,此时如果让write X=1的写操作在Server 1上成功,那Client B和Client C将从Server 1和Server 2上读取到不一致的X值;此时如果要保持X值的一致性,那么write X=1的写操作在Server 1和Server 2上都必须失败,这就是著名的CAP理论:在容忍网络分区的前提下,要么牺牲数据的一致性,要么牺牲写操作的可用性。

解决这个问题你可能会想到让Client C同时读取Server 1和Server 2上的X值和版本信息,然后取Server 1和Server 2最新版本的X值, 如下图2所示。但Client C和Server 1之间也可能发生网络分区,这本质上是牺牲读可用性换取写可用性,并没有突破CAP理论。

可用性:读写操作在单台服务器出问题后,在其他服务器上依然能够完成读写操作。

重点在于:某个读写操作在出问题的机器上不能读写了,但是在其他机器可以完成。

分区容错性:单台服务器,或多台服务器出问题(主要是网络问题)后,正常服务的服务器依然能正常提供服务,并且满足设计好的一致性或可用性。

重点在于:部分服务器因网络问题,业务依然能够继续运行。

一个分布式系统里面,节点组成的网络本来应该是连通的,然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中,这就叫分区。

当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了,这时分区就是无法容忍的。

提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里,容忍性就提高了。

然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。

总的来说就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。

参考

CAP 定理的含义

https://www.ruanyifeng.com/blog/2018/07/cap.html

分布式系统:CAP理论

https://baijiahao.baidu.com/s?id=1722956678585211977&wfr=spider&for=pc

分布式系统的CAP理论,CAP如何三选二

https://baijiahao.baidu.com/s?id=1687697302388087668&wfr=spider&for=pc

上一篇下一篇

猜你喜欢

热点阅读