分布式系统中的FLP不可能原理、CAP理论与BASE理论

分布式系统中的FLP不可能原理、CAP理论与BASE理论

分布式系统是由多个不同的服务节点组成,节点与节点之间通过消息传递进行通信和协调。根据消息传递的不同,分布式系统的运行模型可以分为异步模型系统同步模型系统。本文首先将介绍同步通信与异步通信的概念,然后在此基础上,介绍最小化异步模型系统中的FLP理论。接着,会介绍事务的ACID属性与分布式系统中的CAP理论。最后,会分析ACID原则和BASE理论之间的特点,比较两者之间的不同。全文将按照如下结构展开:

全文结构

一、同步与异步

同步和异步关注的是消息通信机制

  • 同步

同步是指系统中的各个节点的时钟误差存在上限;并且消息传递必须在一定时间内完成,否则认为失败;同时各个节点完成处理消息的时间是一定的。(学术语言解释)

换句话说,所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。(工程语言解释)

拿最经典的打电话举例。

你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。

  • 异步

异步是指系统中各个节点可能存在较大的时钟差异,同时消息传输时间是任意长的,各节点对消息进行处理的时间也可能是任意长的。(学术语言解释)

换句话说,所谓异步,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。 (工程语言解释)

拿最经典的打电话举例。

在异步通信机制中,你打电话问书店老板有没有《分布式系统》这本书,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。


二、FLP不可能原理

现实生活中的系统往往都是异步系统。因为系统中各个节点之间的延时,是否宕机等等都是不确定的。那么,在最小化异步模型系统中,是否存在一个可以解决一致性问题的确定性共识算法

由Fischer、Lynch和Patterson三位科学家于1985年发表的论文《Impossibility of Distributed Consensus with One Faulty Process》指出:在网络可靠,但允许节点失效(即便只有一个)的最小化异步模型系统中,不存在一个可以解决一致性问题的确定性共识算法(No completely asynchronous consensus protocol can tolerate even a single unannounced process death)。

以上结论被称为FLP不可能原理。该定理被认为是分布式系统中重要的原理之一。

此定理实际上告诉人们,不要浪费时间去为异步分布式系统设计在任意场景下都能实现共识的算法。


三、CAP理论

CAP理论的由来

CAP原理最早是2000年由Eric Brewer在ACM组织的一个研讨会上提出猜想,后来Lynch等人进行了证明。该原理被认为是分布式系统领域的重要原理之一。

CAP的定义

  • Consistency 一致性

这里的一致性指的是强一致性。

强一致性意味着,当系统的更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。

  • Availability 可用性

指的是分布式系统可以正常响应时间内提供相应的服务。

  • Partition 分区容忍性

分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。

关于分区的含义
个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中,这就叫分区。
关于分区容错性的含义
当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。
提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。

CAP理论概述

一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)这三项中的两项。

CAP理论

CAP权衡

通过CAP理论,我们知道无法同时满足一致性、可用性和分区容错性这三个特性,那要舍弃哪个呢?

对于多数大型互联网应用的场景,主机众多、部署分散,而且现在的集群规模越来越大,所以节点故障、网络故障是常态,而且要保证服务可用性达到N个9,即保证P和A,舍弃C(退而求其次保证最终一致性)。虽然某些地方会影响客户体验,但没达到造成用户流程的严重程度。

对于涉及到钱财这样不能有一丝让步的场景,C必须保证。网络发生故障宁可停止服务,这是保证CA,舍弃P。貌似这几年国内银行业发生了不下10起事故,但影响面不大,报到也不多,广大群众知道的少。还有一种是保证CP,舍弃A。例如网络故障事只读不写。

孰优孰略,没有定论,只能根据场景定夺,适合的才是最好的。


四、BASE理论

BASE理论的由来

BASE理论是有eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。


BASE理论的定义

BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。

  • 基本可用(Basically Available)

基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。

电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。

  • 软状态( Soft State)

软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。

分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。

  • 最终一致性( Eventual Consistency)

最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。


ACID原则

ACID原则指的是:Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性),用了四种特性的缩写。

ACID也是一种比较出名的描述一致性的原则,通常出现在分布式数据库领域。具体来说,ACID原则描述了分布式数据库需要满足的一致性需求,同时允许付出可用性的代价。

ACID特征如下:

  • Atomicity:每次操作是原子的,要么成功,要么不执行;
  • Consistency:数据库的状态是一致的,无中间状态;
  • Isolation:各种操作彼此之间互相不影响;
  • Durability:状态的改变是持久的,不会失效。


ACID和BASE的区别与联系

ACID是传统数据库常用的设计理念,追求强一致性模型。

BASE支持的是大型分布式系统,牺牲掉对一致性的约束(但实现最终一致性),来换取一定的可用性。

ACID和BASE代表了两种截然相反的设计哲学。

在英文中,ACID和BASE分别是“酸”和“碱”,看似对立,实则是分别对CAP三特性的不同取舍。在分布式系统设计的场景中,系统组件对一致性要求是不同的,因此ACID和BASE又会结合使用。


参考链接:

CAP和BASE理论

分布式系统的CAP理论

知乎用户:CAP理论中的P到底是个什么意思?

编辑于 2018-10-15

文章被以下专栏收录