分布式系统,随着摩尔定律碰到瓶颈,越来越多的系统要依靠分布式集群架构来实现海量数据处理和可扩展计算能力。
区块链首先是一个分布式系统。
中央式结构改成分布式系统,碰到的第一个问题就是一致性的保障。
很显然,如果一个分布式集群无法保证处理结果一致的话,那任何建立于其上的业务系统都无法正常工作。
本章将介绍分布式系统中一些核心问题的来源以及相关的工作。
一致性问题
在分布式系统中,一致性(Consistency,早期也叫 Agreement)是指对于系统中的多个服务节点,给定一系列操作,在协议(往往通过某种共识算法)保障下,试图使得它们对处理结果达成某种程度的一致。
如果分布式系统能实现“一致”,对外就可以呈现是一个功能正常的,但性能和稳定性都要好很多的“虚处理节点”。
举个例子,某影视公司旗下有西单和中关村的两个电影院,都出售某电影票,票一共就一万张。那么,顾客到达某个电影院买票的时候,售票员该怎么决策是否该卖这张票,才能避免超售呢?当电影院个数更多的时候呢?
这个问题在人类世界中,看起来似乎没那么难,你看,英国人不是刚靠 投票 达成了“某种一致”吗?
注意:一致性并不代表结果正确与否,而是系统对外呈现的状态一致与否,例如,所有节点都达成失败状态也是一种一致。
挑战
在实际的计算机集群系统(看似强大的计算机系统,很多地方都比人类世界要脆弱的多)中,存在如下的问题:
节点之间的网络通讯是不可靠的,包括任意延迟和内容故障;
节点的处理可能是错误的,甚至节点自身随时可能宕机;
同步调用会让系统变得不具备可扩展性。
要解决这些挑战,愿意动脑筋的读者可能会很快想出一些不错的思路。
为了简化理解,仍然以两个电影院一起卖票的例子。可能有如下的解决思路:
每次要卖一张票前打电话给另外一家电影院,确认下当前票数并没超售;
两家电影院提前约好,奇数小时内一家可以卖票,偶数小时内另外一家可以卖;
成立一个第三方的存票机构,票都放到他那里,每次卖票找他询问;
更多……
这些思路大致都是可行的。实际上,这些方法背后的思想,将可能引发不一致的并行操作进行串行化,就是现在计算机系统里处理分布式一致性问题的基础思路和唯一秘诀。只是因为计算机