【CAP】分布式CAP理论:一致性、可用性和分区容错性
关于一致性、可用性和分区容错性
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