1.4 分布式系统
在讲区块链之前,我们先看一下区块链的产生背景。在计算机领域,有一类非常经典的问题是关于多台计算机如何同时运行同一个任务。我们通常把解决这类问题的系统称为“分布式系统”。分布式系统如今已经越来越重要,根本原因是我们要处理的问题越来越复杂,如果单纯只靠一台计算机,哪怕这台计算机有最顶尖的配置通常也不够。另外一个原因就是我们要处理的问题所覆盖的地域越来越广,现在服务全世界已经不是什么特别远大的理想,而是比较常见的一个需求。而不同的地域有不同的网络环境,如果只把服务放在单一某个地方,那么在某些地区就很容易遇到服务质量下降的问题,这时我们就需要把服务放在不同的地域来满足需求。
在这些情况下,最终都是多台计算机同时做一个任务的问题。而如何很好地同步多台计算机之间的状态是一个非常棘手的问题。
CAP理论
分布式系统的状态同步是一个很有难度的问题,其中诞生了非常重要的CAP理论。CAP理论指出,在分布式存储系统中,有三个主要的指标,而这三个指标在某一时刻不可能同时满足,它们分别是一致性、可用性和分区容忍性。
(1)一致性(Consistency):当你向系统发出读取数据的请求时,你一定只会读取到最后写入的结果。
(2)可用性(Availability):当你向系统发出读写请求时,你一定能得到结果。(注意这个结果不一定需要满足一致性,也就是你发起读请求的时候,可能会读到过期的数据。)
(3)分区容忍性(Partition tolerance):分布式系统中的多台计算机通过网络相连,如果某些计算机之间丢失消息或者消息的发送发生延迟,整个系统需要能够继续正常运行。
考虑到我们解决的是分布式系统问题,所以分区容忍性是一个需要满足的特性,那么当分布式系统中的消息传递出现问题的时候,我们有两个选择:
(1)暂停接下来的操作,等待各计算机节点间的数据同步完成。这样就削弱了可用性,保证了一致性。
(2)继续正常提供服务,这时候访问不同的节点就可能得到不同的数据。这样就削弱了一致性,但保持了可用性。
接下来,我们用大家常用的自动提款机来举一个例子。每台自动提款机可以看成分布式系统中的一个节点。我们假设,某一时刻,某台自动提款机和银行总部的网络连接断开,这就是发生了分区错误。对于自动提款机的设计者来说,有两种选择:一种选择是让自动提款机继续工作,因为毕竟自动提款机中是有现金的,所以理论上能够继续取钱。这时候就是满足了可用性,代价就是用户的账户无法及时同步,可能会出现超额取钱的情况,也就是牺牲了一致性。另一种选择就是让自动提款机暂停工作,直到网络恢复。这就是牺牲了可用性,而保证了一致性。
日常生活中,我们通常都会认为第二种方案更加可取,但其实第一种方案在某些国家也是存在的。不过为了预防太恶劣的情况,实际的设计是如果自动提款机掉线,那么取款就只能是小额取款。这种设计方案就是满足部分可用性,同时也牺牲一致性。
值得提出的是,CAP理论容易会被误读为一致性、可用性、分区容忍性只能是单纯的满足和不满足两种状态,实际上应该是指满足的程度如何。就好比自动提款机的例子,我们可以把它设计成同时牺牲一部分可用性以及一部分一致性。
另外需要注意的是,我们说不满足一致性,并不是说永远不一致。当出现故障的节点恢复之后,仍然可以继续同步到最新的数据。所以最终所有节点还是能保持一致,这就是最终一致性。
区块链从技术的角度看其实就是一种分布式系统的解决方案。通常的设计都是以满足分区容忍性为前提,然后满足极高的可用性,牺牲数据的一致性。