分布式系统下的CAP理论

文章目录

        一、前言

什么是CAP理论?

        二、性质

2.1  Consistency(数据一致性)

2.2  Availability(可用性) 

2.3  Partition tolerance(分区容忍性)

        三、CAP如何选择

        四、CAP常见的误解

        五、CAP的不足


一、前言

什么是CAP理论?

CAP理论是指在一个分布式系统中最多只能同时满足Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性)这三项中的两项。CAP理论是分布式系统中最基础最重要的理论。


二、性质

2.1  Consistency(数据一致性)

数据一起变化,能够达到让数据保持整齐划一。保证分布式节点中存储的数据内容一致。

数据什么时候会变化?

当且仅当包含数据的服务收到更新请求时,数据将发生变化。数据更新请求仅包括数据的增、删、改三种请求,而这三种请求又被统称为写请求。所以,数据只有写请求的时候才会发生变化。

数据要怎样才能被称为一起变化?数据发生的变化是否一致是需要经过读请求来做检验,那么读请求判断的依据又是什么呢?

假设在一个分布式系统中有两个节点,每个节点都包含了一些需要变化的数据。如果经过一次写请求后,两个节点都发生了数据变化。然后,读请求把这些变化后的数据都读取到了,我们就把这次数据修改称为数据发生了一致性变化。

但是,这还不是完整的一致性。因为系统不可能永久地正常运行下去。如果系统内部发生了问题从而导致系统的节点无法正常发生一致性变化会怎么样?当我们这样做的时候,就意味着想看到最新数据的读请求们,很可能会看到旧数据,或者说获取到不同版本的数据。此时,为了保证分布式系统对外的数据一致性,于是选择不返回任何数据。 

需要注意的是

        CAP理论是在说某种状态下的选择,和实际工程的理论是有差别的。CAP定理主要描述的是状态。CAP本身是基于状态,基于瞬态,是一个描述性的理论,它并不解决工程问题。由于CAP书学术理论,并不是工程理论,所以它会舍弃很多。

2.2  Availability(可用性) 

可用性在CAP里是对结果的要求。它要求系统内的节点们接受到的无论是写请求还是读请求,都要能处理并给回响应结果。只是它必须有两点必须满足的条件:

条件1:返回结果必须在合理的时间范围之内,这个合理的时间是根据业务来定的。业务说必须100ms内返回,这个合理的时间就是100ms,需要在1s内返回,那就是1s,如果业务定的是100ms,结果在1s才返回,那么这个系统就不满足可用性。

条件2:需要系统内能正常接受请求的所有节点都返回结果。这包含了两重含义:

  • 如果节点不能正常接收请求了,比如宕机了,系统崩溃了,而其他节点依然能正常接收请求,那么,这个系统依然是可用的,也就是说,部分宕机了不影响可用性指标。
  • 如果节点能正常接收请求,但是发现节点内部数据有问题,那么也必须返回结果,哪怕返回的结果有问题。比如,系统有两个节点,其中一个节点数据是三天前的,另一个节点是两分钟前的,如果一个读请求跑到了包含三天前数据的节点上,这个节点必须返回这个三天前的数据,即使可能不太合理。

        可用性只能保证用户去读一定可以读到东西,但是不能保证用户读到的是最新的。如果一个节点和其他节点断开通信了,它也不知道自己本地的数据是否是最新的,但是有用户请求,它也直接返回数据。

2.3  Partition tolerance(分区容忍性)

分布式的存储系统中会有很多节点,这些节点都是通过网络进行通信。而网络是不可靠的,当节点和节点和之间的通信出现了问题,此时,就称当前的分布式存储系统出现了分区。但值得一提的是,分区并不一定是有网络故障引起的,也可能是因为机器故障。

例如,在一个分布式存储系统中有A和B两个节点。当A和B之间可能由于路由器、交换机等一些底层网络设备出现了故障,A和B之间的通信出现了问题,也称之为A和B发生了分区。当A出现了宕机,A和B之间的通信也是出现了问题的,这种情况也称之为A和B发生了分区。

综上所述,只要在分布式系统中,如果节点之间的通信出现了问题,那就会发生分区。也就是说,如果出现了分区问题,整个分布式存储系统还需要继续运行。不能因为出现了分区问题,整个分布式节点就全部停止运行了。


三、CAP如何选择

此时我们已经知道了,在设计分布式系统时,我们在C、A、P这三种性质里,只能选择两种。

但是,在分布式系统里,P是必然发生的。如果不选P,一旦发生分区错误,整个分布式系统就完全无法使用了。所以对于分布式系统,我们只能考虑当发生分区错误时,该如何选择一致性和可用性。

而根据一致性和可用性的选择不同,开源的分布式系统往往又被分为CP系统和AP系统。

当一套系统在发生分区故障后,客户端任何请求都会被卡死或者超时,但是,系统内的每一个节点总是会返回一致的数据,这样的系统就是CP系统,经典的比如Zookeeper。

当一套系统在发生分区故障后,客户端依然可以访问系统,只是客户获取的数据有些是新的数据,有些还是旧的数据,这样的系统就是AP系统,经典的比如Eureka。

当分布式系统出现内部问题时,我们要做两个选择:

  • 迁就外部服务
  • 让外部服务迁就我们

迁就外部服务是指我们不能因为自己的问题让外部服务的业务运行收到影响,所以要优先选用可用性。而让外部服务迁就我们就要优先选用一致性。


四、CAP常见的误解

误解一:分布式系统因为CAP定理放弃了C或者A中的一个

很多人觉得一套分布式系统要么只有可用性要么只有一致性,不存在完整的可用性和一致性功能。

因为P这种问题发生的概率非常得低,所以在没有出现分区问题之前,系统就应该有完美的数据一致性和可用性。

误解二:C和A之间的选择是针对整个分布式系统的,只能整体考虑C和A之间的选择

当分区发生时,其实对一致性和可用性的抉择是局部性的,而不是针对整个系统的。

可能是在一些子系统做一些选择,甚至有可能只需要对某个事件或者数据,做一致性和可用性的抉择而已。

一套分布式系统的运行,是一次又一次的选择,在不同的阶段,不同的时刻有着不同的事件发生的时候,不可能会有完全一样的选择的。

误解三:CAP的三个性质只有是和否两种选择,而不是一个范围

CAP理论的三种性质并不是Boolean类型的,也不是一致和不一致,可用和不可用,分区和没分区这种二选一的选项。而是这三种性质都是范围类型。


五、CAP的不足

1、CAP定理本身是没有考虑网络延迟问题的,它认为一致性是立即生效的,但是,要保持一致性,是需要时间成本的,这就导致往往分布式系统多选择AP系统。

2、一致性和可用性并不仅仅是二选一的问题,只是一些重要性的区别,当强调一致性的时候,并不表示可用性是完全不可用的状态。当强调可用性的时候,也会往往采用一些技术手段,去保证数据最终是一致的。

3、CAP理论从工程角度来看只是一种状态的描述,它告诉人们当有错的时候,分布式系统可能处在什么状态。但是状态是有可能变化的,状态间如何转换,如何修补,如何恢复是没有提供方向的。

猜你喜欢

转载自blog.csdn.net/HAOMINGS/article/details/127080688