CAP 和 BASE

350 阅读10分钟

集中式与分布式

大型主机的人才培养成本高;大型主机本身价格昂贵;集中式系统有明显的单点问题。

随着PC机性能的提升和网络的普及,大型主机市场份额越来越小,很多企业开始放弃大型机,改用小型机和普通PC服务器来搭建分布式的计算机系统。

集中式的特点

集中式系统是指由一台或多台主计算机组成中心节点,数据集中存储在这个中心节点中,并且整个系统的所有业务单元都集中部署在中心节点上,系统所有功能均由其集中处理。

其最大的特点就是部署结构简单。集中式系统往往基于底层性能卓越的大型主机。

分布式的特点

分布式系统有如下定义:分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。

一般来说,一个标准的分布式系统有如下特征:

  1. 分布性:分布式系统的多台计算机都会在空间上随意分布,同时,机器的分布情况也会随时变动。
  2. 对等性:分布式系统中的计算机没有主从之分,组成分布式的所有计算机节点都是对等的。 副本:分布式系统对数据和服务提供的一种冗余方式,为了对外提供高可用的服务,往往对数据和服务进行副本处理。
  3. 并发性:统一分布式系统中的多个节点,可能会并发地操作一些共享的资源
  4. 缺乏全局时钟:进程通过交换消息来进行相互通信。因此,在分布式系统中,很难定义两个事件谁先谁后。
  5. 故障总会发生

分布式环境的问题

  1. 通信异常:网络不可用的风险;即使通信能正常运行,其延时也会远大于单机操作。因此消息丢失和消息延迟变得非常普遍。
  2. 网络分区:分布式系统中部分节点间的网络延时不断扩大,最终导致只有部分节点之间能正常通信,另一些节点则不能,称之为网络分区。
  3. 三态:分布式系统的每一次请求与响应,存在成功、失败和超时三态。
  4. 节点故障

分布式系统设计

中心化设计

分布式集群中的节点按照角色分工,分为领导和干活的。

领导通常负责分发任务并监督其他节点,发现空闲节点则为其安排任务;如果有节点宕掉,则把任务分给其他节点。

存在以下问题:

  1. 领导节点出问题后,整个集群崩溃。
  2. 领导节点的领导能力问题,无法领导大规模的节点。

系统可以采用主备两个“领导”的设计方案,自动选举切换领导,来提升系统可用性。

去中心化设计

分布式事务

分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的不同节点之上。通常一个分布式事务中会涉及对多个数据源或业务系统的操作。

我们期望实现严格满足ACID特性的分布式事务,很可能出现的情况就是在系统的可用性和严格一致性之间出现冲突,也就是当我们要求分布式系统具有严格一致性时,很可能就需要牺牲掉系统的可用性。

CAP 定理

CAP理论告诉我们,一个分布式系统不可能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三个基本需求,最多只能同时满足其中的两项。

一致性

一致性是指数据在多个副本之间是否能够保持一致的特性,也就是满足ACID的特性。

从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。

强一致性

在分布式系统中,如果能够做到针对一个数据项的更新操作执行成功后,所有用户都可以读取到最新的值,那么这样的系统被认为有强一致性。

可用性

可性质是指系统提供的服务必须一直处于可用状态,对于用户的每一个操作请求总是能在有限时间内返回结果

有限时间是指用户的一个操作请求系统必须能在指定时间内返回对应的处理结果,如果超过了这个时间范围,就被认为是不可用的。

返回结果是可用性的另一个重要指标,它要求系统在完成对用户请求的处理后,返回一个正常的响应结果,也即成功或失败。

分区容错性

分区容错性约束了一个分布式需要具有如下特性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。

网络分区是指由于某种原因,网络被分成若干个孤立的区域,而区域之间互不相通。

放弃CAP

一个分布式系统不可能同时满足一致性、可用性和分区容错性三个需求。但是,对于一个分布式系统而言,分区容错性是一个最基本的要求。因为分布式系统中的组件必然需要被部署到不同节点,因此必然出现子网络;同时分布式系统必然会面对网络的异常情况,因此分区容错性是分布式系统必须面对和解决的问题。因此当发生网络分区的时候,如果我们要继续服务,那么强一致性和可用性只能2选1。也就是说当网络分区之后P是前提,决定了P之后才有C和A的选择。

放弃A:一旦遇到分区容错故障,收到影响的服务需要等待一定时间,在等待期间系统无法对外提供服务。

放弃C:放弃数据的强一致性,保留数据的最终一致性。

CAP理解

一致性等同于可串行化这个术语。系统对一个数据的读和写虽然包含多个子步骤并且可能持续一段时间才执行完,但是调用者看来,读和写操作都是单个的即时完成的操作。对一个写操作,如果系统返回了成功,那么之后到达的读请求都要督导这个新数据;如果系统返回失败,那么所有的读都不能读到这个数据。

可用性指的是所有的操作都必须要能终止。

分区容忍性是指系统中会任意的丢失报文。

在实践过程中,如果为了扩展数据容量将数据分布式存储,事务的要求又不能降低,则系统可用性会大大降低,一般采用对这些数据不分散存储的策略。也就是关系型数据库为了保证C、A而牺牲P,尽量避免分布式事务。

虽然 CAP 中只能保证 CP 或者 AP,但是并不是牺牲了一致性C,就一定能同时获得可用性A和分区容忍P,还有一个很重要的因素是延迟。因此,A和P并不是牺牲C的借口,因为即使牺牲了C,也不一定能保证A和P。

CAP 理论说在一个系统中对某个数据不存在一个算法同时满足 Consistency, Availability, Partition-tolerance。注意,这里边最重要和最容易被人忽视的是限定词“对某个数据不存在一个算法”。这就是说在一个系统中,可以对某些数据做到 CP, 对另一些数据做到 AP,就算是对同一个数据,调用者可以指定不同的算法,某些算法可以做到 CP,某些算法可以做到 AP。

BASE理论

BASE 是 Basically Avaiable 基本可用、Soft state 软状态和 Eventually consistent最终一致性三个短语的简写。BASE 是对 CAP 中一致性和可用性权衡的结果,其核心思想是及时无法做到强一致性,但是每个应用都应该根据自身业务特点,采取适当方式来使系统达到最终一致性。

基本可用

基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性,但是不等价于系统不可用。

弱状态

也称为软状态,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。

最终一致性

最终一致性强调的是系统中所有数据副本,在经过一段时间的同步后,最终能达到一个一致的状态。也就是需要保证系统最终数据到达一致,而不需要实时保证系统数据的强一致性。

通常通过数据的多份异步复制来实现系统的高可用和数据的最终一致性。

最终一致性存在五种变种。

  1. 因果一致性:如果进程A更新完数据后通知了B,则B之后对该数据的访问都应该能获取到进程A更新的最新值,如果进程B要在进程A更新后的值之上更新该数据项,不能丢失更新。与进程A没有因果关系的进程C访问没有这样的限制。
  2. 读己所写:进程A更新数据后,总是能访问到更新过的最新值。
  3. 会话一致性:系统能保证同一个有效的会话中实现“读己所写”。执行更新操作之后,客户端能在同一会话中始终读取到该数据的最新值。
  4. 单调读一致性:一个进程从系统中读取出一个数据项的值后,系统对该进程后序的任何数据访问都不应该返回更旧的值。
  5. 单调写一致性:一个系统需要能保证来自同一进程的写操作被顺序地执行。

BASE 理论面向的是大型高可用可扩展的分布式系统,不同于ACID的强一致性模型,而是提出通过牺牲强一致性来获得可用性,并允许数据在一段时间是不一致的,最终达到一致状态。

参考资料