CAP理论

CAP理论的提出者布鲁尔在提出CAP猜想的时候, 并没有详细定义ConsistencyAvailabilityPartition Tolerance三个单词的明确定义。

一般大家的理解是:

在理论计算机科学中,CAP定理(CAP theorem)指出对于一个分布式系统来说,当设计读写操作时,只能同时满足以下三点中的两个:

  • 一致性(Consistency):所有节点访问同一份最新的数据副本
  • 可用性(Availability):非故障的节点在合理的时间内返回合理的响应(不是错误或者超时的响应)。
  • 分区容错性(Partition tolerance):分布式系统出现网络分区的时候,仍然能够对外提供服务。

网络分区

分布式系统中,多个节点之前的网络本来是连通的,但是因为某些故障(比如部分节点网络出了问题)某些节点之间不连通了,整个网络就分成了几块区域,这就叫网络分区。

简单的表述:一致性、可用性、分区容忍性三者你只能同时达到其中两个,不可能同时达到。

实际上这是一个误导性质的说法。

最新的解释是:

当发生网络分区的时候,如果我们要继续服务,那么强一致性和可用性只能21。</br> 也就是说当网络分区之后P是前提,决定了P之后才有CA的选择。</br> 也就是说分区容错性(Partition tolerance)我们是必须要实现的。</br>

简单的表述:CAP理论中分区容错性P是一定要满足的,在此基础上,只能满足一致性C或者可用性A

因此,分布式系统理论上不可能选择CA架构,只能选择CP或者AP架构。 </br> 比如:

  • ZooKeeperHBase就是CP架构,
  • CassandraEureka就是AP架构
  • Nacos不仅支持CP架构也支持AP架构。

为什么不可能选择CA架构呢?

举个例子:若系统出现分区,系统中的某个节点在进行写操作。 为了保证C(一致性), 必须要禁止其他节点的读写操作,这就和A(可用性)发生冲突了。 如果为了保证A(可用性),其他节点的读写操作正常的话,那就和C(一致性)发生冲突了。

选择CP还是AP的关键在于当前的业务场景,没有定论,大部门业务功能是满足AP,但是对于需要确保强一致性的场景,如:银行,车票,一般会选择保证CP

需要补充说明的一点是:如果网络分区正常的话(系统在绝大部分时候所处的状态),也就说不需要保证P的时候,CA能够同时保证。

BASE理论

BASEBasically Available(基本可用) 、Soft-state(软状态)和Eventually Consistent(最终一致性) 三个的缩写。

BASE理论是对CAP中一致性C和可用性A进行一个权衡的结果,</br> 理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。

也就是牺牲数据的一致性来满足系统的高可用性,系统中一部分数据不可用或者不一致时,仍需要保持系统整体主要可用

BASE理论本质上是对CAP的延伸和补充,更具体地说,是对CAPAP方案的一个补充。

CAP理论里面说过,如果系统没有发生分区的话,节点间的网络连接通信正常的话,也就不存在P了。

这个时候,就可以同时保证CA了。因此,如果系统发生分区,我们要考虑选择CP还是AP

如果系统没有发生分区的话,我们要思考如何保证CA。 因此,AP方案只是在系统发生分区的时候放弃一致性,而不是永远放弃一致性。

在分区故障恢复后,系统应该达到最终一致性。这一点就是BASE理论延伸的地方。


results matching ""

    No results matching ""