分布式 CAP+Base 理论
参考资料
【腾讯文档】分布式理论 CAP + Base
https://docs.qq.com/doc/DQWJiUGp0Vm5RcHRo
什么是 CAP 理论和 BASE 理论,看这一篇就够了 (360doc.com)
CAP 理论
CAP | 描述 |
---|---|
C(最终一致性)Consistency | 一致性强调的不是数据完整,而是各节点间的数据一致; 一致性看成是分布式系统对客户端的一种承诺:不管访问哪个节点,返回的都是绝对一致的数据,因为数据不一致的时候会读取失败(拒绝提供服务) |
A(可用性) | 可用性说的是任何来自客户端的请求,不管访问哪个节点,都能得到响应数据,但不保证是同一份最新数据。 因此可用性这个指标强调的是服务可用,但不保证数据的绝对一致。 |
P(分区容错性) | 分区容错性说的是,当节点间出现任意数量的消息丢失或高延迟(网络障碍)的时候,系统仍然可以继续提供服务 |
组合 | 描述 |
---|---|
CA | 不可能存在,在分布式系统,P(分区容错性)网络故障不可能不出现,所以 P 一般情况下是必须的 |
CP | 在分区容错性的基础,服务高可用,但是数据弱一致性 |
AP | 在分区容错性的基础,数据强一致性,返回的都是绝对一致的数据,不一致的时候会读取失败(拒绝提供服务) |
Base 理论
Base:基本可用(Basically Available)和最终一致性(Eventually consistent)
是在 CAP 理论的 AP 模型下的延伸
最终一致性:也就是允许节点之间的数据出现短暂的数据不一致情况,但是节点高可用
总结
为什么 CAP 不可能同时符合
对于一个分布式系统而言,一致性、可用性、分区容错性 3 个指标不可兼得,只能在 3 个指标中选择两个。
这是因为在一个分布式系统中,数据通常会被分割成多个分区并存储在不同的节点上,这样可以提高系统的可扩展性和性能。但是,分区带来了数据一致性的问题。==当一个分区出现故障或网络分区时,不同的节点之间可能无法及时通信,从而导致数据的不一致性==。==因此,在分区容错的前提下,一致性和可用性之间必须进行权衡==。
==如果选择保证一致性和分区容错性,就必须放弃可用性,因为在出现分区时,系统必须停止服务以保证数据的一致性==。如果选择保证可用性和分区容错性,就必须放弃一致性,因为在出现分区时,不同节点之间可能会出现数据不一致的情况,但系统仍然可以继续提供服务。如果同时追求三个特性,就必须对其中的某一项进行妥协。
需要注意的是,CAP 定理是在理论上得出的结论,在实际系统中,并不是所有的系统都需要同时满足 CAP 中的三个特性。不同的应用场景可能需要不同的特性组合。因此,在设计分布式系统时,需要根据实际情况进行权衡和取舍,以满足应用的需求。
我们知道只要有网络交互就一定会有延迟和数据丢失,而这种状况我们必须接受,还必须保证系统不能挂掉。所以就像上面提到的,节点间的分区故障是必然发生的。也就是说,==分区容错性(P)是前提,是必须要保证的==,不能说某些节点之间无法正常通信(发生网络分区)就导致整个集群不可用。
现在就只剩下一致性(C)和可用性(A)可以选择了:要么选择一致性,保证数据绝对一致;要么选择可用性,保证服务可用。如果选择 C,那么就是 CP 模型;如果选择 A,那么就是 AP 模型。
- ==当选择一致性(C)的时候==,如果因为消息丢失、延迟过高发生了网络分区,部分节点无法保证特定信息是最新的。那么这个时候,当集群节点接收到来自客户端的请求时,==因为无法保证所有节点都是最新信息,所以系统将返回错误,也就是说拒绝请求==。
- ==当选择可用性(A)的时候==:如果发生了网络分区,一些节点将无法返回最新的特定信息,那么它们将返回自己当前相对新的信息。
这里需要再强调一点,有很多人对 CAP 理论有个误解,认为无论在什么情况下,分布式系统都只能在 C 和 A 中选择 1 个。其实在不发生网络分区的情况下,也就是分布式系统正常运行时(这也是系统在绝大部分时候所处的状态),C 和 A 是能够同时保证的(如果节点之间的数据同步很快的话)。只有当发生分区故障的时候,也就是说需要 P 时,才会在 C 和 A 之间做出选择
Redis 集群的采用的 CAP+Base 模型
AP+Base 模型:分区容错性 + 服务高可用 + 最终一致性