全球比特币区块链系统中的节点数量约一万多个。在如此庞大的分布式网络中,并没有一个“权威”的中心节点进行协调,如图2-1所示。那么中本聪一定需要设计一套协议机制,让整个比特币系统较高效地持续达成一致,持续生成比特币“账本”。这样一套以达成一致为目的协议机制就是区块链系统的“共识机制”。推而广之,该问题的模型是分布式系统中各个“节点”的一致性决策。
图2-1 分布式系统的一致性挑战
为了更多地了解该课题,我们先从若干基本原理开始学习,然后通过具体算法加深理解。在无歧义的情况下,下文并不严格区分“进程”“节点”或“单元”等概念,而将它们统称为“节点”。形象地讲,“节点”就是参与分布式系统一致性决策的基本单元。
表2-1概括了FLP不可能原理、CAP理论,以及ACID和BASE原则。这些理论和原则是分布式系统设计和工程实践的基础,很多实际算法都是沿着它们的思路所进行的探索。本节后续部分将对这些原理做简要梳理。
表2-1 分布式系统一致性的主要原理/原则
FLP不可能原理的相关研究获得了2017年的Dijkstra奖。该原理由Fisher、Lynch和Paterson三位科学家在1985年提出。FLP不可能原理指出,在一个异步分布式系统中,只要有一个节点出错(比如长时间不响应、出错、中断服务等),就不可能设计出一个完备的一致性决策方案。FLP并不是说一致性决策永远都没法达成,它的含义是,在特定的系统假设下,没有算法是完美的或是充分可信任的。
FLP的理论证明过程较为烦琐,可以简单理解如下。如果一个分布式系统是异步的,那么系统中任一参与共识的节点都可能出错,且节点之间的通信链路也可能出错,这在概率意义上是无法避免的。而且,在信息传递的整个过程中,系统中各个节点都可能收到新的消息,并可能进行状态迁移。在这种情况下,任何时间点上希望达成一致且要求这种一致性在概率上完备都是不可能的。所以没有算法能处理一切潜在的错误,因此这个理论也被称为FLP“不可能”原理。
虽然FLP只是一个概率意义上的理论判定,但它为后续的理论和算法研究奠定了方向性的基础。
继FLP不可能原理之后,该领域的研究成果更加具体和细化。其中比较有影响力的是美国加州大学伯克利分校的计算机科学家Eric Brewer提出的CAP理论。CAP理论简单明了地指出,在分布式系统中最多只能确保一致性、可用性和分区容错性这三个特性中的两项。也就是说,CAP理论告诉我们虽然理论完备的一致性决策方案不存在,但是可以在这些维度中做折中选择,设计出“足够好”的方案。
那么一致性、可用性和分区容错性是哪些维度呢?一致性指信息的准确性,即所有的节点都能够获取最新的信息。可用性是指及时性,即能保证所有的节点都及时得到响应,但获得的不一定是最新信息。分区容错性主要是指系统在部分节点错误或丢失信息情况下的稳健性,即出现这种情况时网络可以正常运行。
我们接着分析一下,实际中该如何选择。显然,一般情况下我们无法完全规避通信链路或部分节点出错,因此分区容错性似乎是有必要的。换一个角度,如果在系统设计中,强制要求对所有“分区”的错误零容忍,这种设计准则过于苛刻,实现起来代价会很大。那么,在分区容错的前提下,一致性和可用性应该如何取舍?从图2-2中,我们可以做一些观察。假设节点 A 和 B 分别位于分区 P 1 和 P 2 中。图2-2中左、中和右侧分别代表时刻1、时刻2和时刻3的不同状态。在时刻1,节点 A 向数据库发起数据更新 D 1 ,该更新在时刻2体现在了分区 P 1 的数据库。但是,由于两个分区间的通信链路出现故障,时刻2分区 P 2 并没有及时更新数据,其数据还是 D 0 。想象一下,在时刻2,外部访问者如果向分区 P 1 和分区 P 2 同时请求数据将会出现什么情况。如果要确保一致性,分区 P 2 要等待网络故障排除,再对最新数据库进行查询,并刷新;而如果要确保可用性,分区 P 1 和 P 2 可能需要在一定的响应时间内各自返回数据,而这两个数据是不同的。从数据接收者的角度来看,可能需要向更多的分区请求数据,自行判断数据的有效性。总之,一致性和可用性是不可兼得的。
图2-2 CAP原理示意图
既然鱼与熊掌不可兼得,那么该如何做选择呢?ACID和BASE原则就是两种比较有影响力的思路。
ACID是四个英文单词的缩写,即原子性(Atomicity)、一致性(Consistency)、孤立性(Isolation)和持续性(Durability)。原子性可以理解为每个操作都是最小细分,不论成功或失败都状态明确。孤立性指不同的操作间不耦合,不互相影响。持续性是指状态的变化不会失效。ACID的核心要求是,系统中状态变化的最小颗粒度是唯一并明确的,系统从一个状态明确地切换到下一个状态,没有中间态。很显然,ACID代表着强一致性的模型。以数据库系统为例,典型的关系型数据库Oracle、MYSQL等都体现了ACID原则的思路。
BASE是Basically Available、Soft state、Eventual consistency的简写。实际上,BASE是选择确保可用性的。具体地说,它包含基本可用、软状态,以及最终一致性三个维度。基本可用是指允许分布式网络损失部分可用性,保证核心功能可用,例如网站出现高并发访问时,一部分用户可能被引导到降级版本的页面。软状态是指允许系统存在不影响整体可用性的中间状态,例如分布式系统中数据可以有不同副本,允许不同的刷新延时。顾名思义,最终一致性是指,随着时间的推移,最终在分布式网络中所有的节点都会得到最新数据。显然,BASE原则是一种“弱保障”。以数据库系统为例,NoSQL类型数据库主要确保可用性,能更好地应用于大数据、并行计算等场景,体现了BASE的思路。