分布式基础理论:CAP与BASE
CAP
一个分布式系统不可能同时满足一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)这三个基本需求,最多只能满足其中的两项,不可能三者兼顾。
- 一致性:在分布式系统中的所有数据副本,在同一时刻是否一致(等同于所有节点访问同一份最新的数据副本)
- 可用性:分布式系统在面对各种异常时可以提供正常服务的能力(非故障的节点在有限的时间内返回合理的响应)
- 分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然需要能对外提供一致性和可用性的服务,除非是整个网络环境都发生了故障。
如下图
为什么三者不可兼顾呢?
我们首先就需要了解以下网络分区的概念。
在分布式系统中,不同的节点分布在不同的子网络(机房或异地网络等)中,由于一些特殊的原因导致这些子网络之间出现网络不连通的状况,但各个子网络的内部网络是正常的,从而就导致了整个系统的网络环境被切分成了若干个孤立的区域。
节点被划分为多个区域后,每个区域内部可以通信,但是区域之间无法通信。
对于一个分布式系统而言,我们的组件必然要被部署到不同的节点上,也必然会出现子网络。我们无法保证网络始终可靠,那么网络分区则是一个必定会产生的异常情况。
当发生网络分区的时候,如果我们要继续提供服务,那么分区容错性也就是我们必然需要面对和解决的问题,因此分区容错性P是必定要满足的。
那么一致性C和可用性A可以兼顾吗?
答案必定是否定的,为什么呢?倘若分布式系统中出现了网络分区的情况,此时某一个节点在进行写操作,为了保证一致性,那么就必须要禁止其他节点的读写操作以防止数据冲突,而此时就导致其他的节点无法正常工作,即与可用性发生冲突。而如果让其他节点都正常进行读写操作的话,那就无法保证数据的一致,影响了数据的一致性,因此,我们只能满足可用性A和一致性C二者其一
用一句话总结就是,CAP 理论中分区容错性 P 是一定要满足的,在此基础上,只能满足可用性A或者一致性C。 因此在上面我给出的图中,CA是不可能的选项,在实际场景中,我们会根据具体的需求来选择CP和AP。
BASE
BASE理论是基本可用(Basically Available) 、软状态(Soft-state)和最终一致性(Eventually Consistent) 三个短语的缩写。其是对CAP中的一致性和可用性进行一个权衡的结果。
- 基本可用(Basically Available):基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性(响应时间上的损失、系统功能上的损失)。但是,这绝不等价于系统不可用。
- 软状态(Soft-state):允许系统中的数据存在中间状态(CAP理论中的数据不一致),并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。
- 最终一致性(Eventually Consistent):最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。
BASE理论的核心思想就是我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。
什么意思呢?其实就是要牺牲数据的一致性(不保证强一致性,只保证最终一致性)来满足系统的高可用性,系统中一部分数据不可用或者不一致时,仍需要保持系统整体“主要可用”。
总的来说,BASE理论面向的是大型高可用可扩展的分布式系统,和传统事务的ACID特性使相反的,它完全不同于ACID的强一致性模型,而是提出通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。但同时,在实际的分布式场景中,不同业务单元和组件对数据一致性的要求是不同的,因此在具体的分布式系统架构设计过程中,ACID特性与BASE理论往往又会结合在一起使用。