天天看点

Hyperledger实战之——分布式系统(1)第三章 分布式系统

——本文是作者自己原创编写的电子书中的部分章节,在此分享给各位CSDN的读者。

第三章 分布式系统

上一章中把Blockchain和Distributed Ledger,分布式系统未必是区块链的技术本质,单纯的分布式实现不会是区块链技术的终点,未来一定会有更高效、更合理的、也很可能会更复杂的方案来实现区块链以达到更理想的效果。

但另一方面,也必须说明分布式至少是区块链技术栈中很重要的部分,而且至少在现阶段是适合大规模推广的区块链技术的必然选择(在很多场景中可能会呈现一定程度的相对中心化)。尽管用上万个 full time 运行的计算机节点来替代一份报纸的一个小小的广告栏,意味着系统运行的成本上涨了数亿倍甚至更多,但也正是这一点点差异就决定了 Surety 是一个半数字化的系统,而bit–coin是一个完全数字化、完全线上运行的系统。也正是用天价成本换来的这一点点差异,导致了后者具备了无限的想象空间而被资本拿来炒作,其影响甚至触及了全球最偏远的角落。也正是这一点点差别,最终导致 Surety(相对的)默默无闻,而bit–coin却声名远播。

Hyperledger实战之——分布式系统(1)第三章 分布式系统

所以从这个角度来讲,现阶段把区块链定义成「分布式记账技术」而不是「块链式记账技术」也是情理之中的。

由于分布式系统的知识体系极其庞杂,本章只能简要介绍学习区块链需要了解的一些分布式系统的基础知识,帮助读者理解区块链关于分布式的一些基本特性。如果要更清晰的了解分布式系统发展历程,可以参展本节相关的参考文献部分的论文和文章。如果要更深入、系统的学习分布式系统的话,就需要阅读分布式领域的一些专著了。

3.1 Why 分布式系统

区块链采用分布式的实现是有很多原因的,首当其冲的是去中心化的账本可以提供更高级别的信用。前面讲到了简化的区块链技术实际有两大块:

  • 数据完整性技术;
  • 分布式技术。

虽然通过 Hash、Merkle 树、单链表这样一套精巧的数据结构可以保证区块数据的完整性,但并不等于区块数据就安全了。如果这样的完整数据只有一个备份的话,虽然篡改起来确实比较困难,但是要破坏/删掉它还是相对容易的。要解决区块的数据安全问题,一个途径当然是加强对数据服务器的保护,另一个就是冗余备份了。

首先仍然用现实世界的交易合同来类比解释分布式对于区块链的意义。前面讲到现实世界双方合同,一式两份 一旦遇到假合同就难辨真假,需要签署三方合同才可以做到基本的安全。bit–coin采用分布式也起到了类似的效果:搞出遍布全球的一万多个节点,每一个节点都可以作为三方合同中的第三方来证明交易的真实性。

虽然bit–coin网络上也会出现恶意节点、数据过期的节点等问题,但只要还有大量有效的节点,bit–coin系统就会继续运作。除非恶意节点达到一定阈值才会对整个系统造成威胁,也就是著名的 51 % 51\% 51%攻击。而目前bit–coin在全球大约有10000个全节点,想搞出一个 51 % 51\% 51%攻击的话,虽然理论上是可行的,但是成本会比较高。而要搞出 51 % 51\% 51%攻击而不被发现,就几乎是不可能的了。

Hyperledger实战之——分布式系统(1)第三章 分布式系统

这个遍布全球的10000个节点就是分布式系统。

下面我们来看一下分布式系统的工作原理。

3.2 分布式系统的工作原理

分布式系统是一个很宽泛的话题,其中有很多繁琐的概念和理念,本章无法覆盖太多的知识点,下面只是简单枚举一下学习区块链需要了解的几个基本概念。

分布式系统包括分布式存储和分布式计算,而区块链涉及的重点是分布式计算的范畴,所以接下来我们重点讨论分布式计算部分。

首先澄清一下分布式计算和并行计算的关系。

从学科上来讲,分布式计算和并行计算根本就没关系。并行计算属于计算机体系结构的范畴,主要是通过 CPU 性能优化、指令集优化、多 CPU、多核、协处理器等设计来实现更高的计算能力。而分布式计算是构建在计算机网络之上、由一组独立的节点组成的、为完成某个任务耦合在一起的系统。这显然不是计算机体系结构的范畴,看上去有点像计算机网络的一个分支。但实际分布式计算是和计算机网络并列的一个单独的学科。

既然没有关系,那也就不存在互斥关系,实际上在很多时候两类技术会同时使用来解决一些性能问题。早期的分布式计算和并行计算一样,都是为了实现更高的处理能力。只不过并行计算是聚焦在体系结构层面的优化,性能的提升主要表现在单机上面; 而分布式计算是利用多机协作来实现性能提升的。相比之下,当单机的性能在现有体系结构下接近极限的时候,分布式计算仍然有很大的提升空间。

但随着计算机技术的发展,现在的分布式计算已经成了当前计算机领域的基础技术。尤其是在大型系统中,高并发、高可用这些需求的背后几乎随处可见分布式计算的身影,随着大数据技术的发展,分布式数据库技术对于很多业务来说也成了强需求,而这些都属于分布式计算研究的范畴。

前面说到高并发、高可用,其中用到的一个典型的技术方案是「集群」。集群的概念和分布式纠结在一起的话又会很迷惑,所以也要简单澄清一下。

  • 多台机器运行同一份代码的多个实例,这是集群;
  • 多台机器相互协作执行同一个任务,这是分布式。

传统的后台 Service 部署多个实例,这属于集群的范畴。而一个服务拆成多个模块运行在很多机器上 – 也就是微服务 – 属于分布式的范畴。但二者同样也不是互斥的关系,在微服务的实际部署中也往往离不开集群的应用。就像区块链作为分布式系统,在部署中也会用到 kafka/zookeeper 集群。

那扯这么多概念,对于理解分布式计算有什么帮助吗?首先简化一下计算机后台技术的发展历程:

  • 早期的单机系统:这一阶段主要依靠体系结构(包含前面提到的并行计算)领域的研究来提升机器的性能,同时通过硬件设计来提高服务器的稳定性,比如 IBM 服务器;
  • 集群:当单机性能怎么都满足不了需求的时候,可以通过增加机器来提高系统的服务能力。通过多实例部署,服务的并发性和可用性都得到了很大的提升;
  • 当集群规模达到一定程度,单纯依靠增加机器是不能无上限地提升集群的性能的,这时候分布式的优势就出现了。到了这个阶段,计算系统的性能又上了一个台阶。

那是什么原因让分布式计算技术可以这么厉害的呢?

下面来看一些分布式计算的基本概念,读了这些你可能会很失望,觉得很枯燥。但实际上就是这些看上去很枯燥的东西,赋予了分布式计算强大的生命力。

3.2.1 去中心化

分布式系统是由多个节点组成的,其中所有节点都是对等的,当某个节点出现故障时,网络中的其他节点仍然可以提供系统服务,不会出现某一个节点宕机导致网络崩溃的问题,即 – 去中心化(见图\ref{fig:ds_003})。

Hyperledger实战之——分布式系统(1)第三章 分布式系统

3.2.2 数据一致性

既然分布式系统中的各节点是对等的,就要求所有节点的数据对外呈现的状态是一致的,这样的分布式网络才是可用的(见图\ref{fig:ds_004})。这件事听起来很简单,却是分布式系统的核心问题,实际解决起来并不简单。也正是因为问题之复杂,bit–coin采用 PoW 的设计也堪称神来之笔。

Hyperledger实战之——分布式系统(1)第三章 分布式系统

数据一致性可以分为很多不同的级别,包括严格一致性、强一致性、线行一致性、顺序一致性、单调一致性、弱一致性、串行一致性、会话一致性…这么多概念堆在一起简直看的眼花缭乱,实际上这些一致性是从不同领域衍生出来的,认真去研究的话会发现它们定义的维度都不太一样,直接堆砌在一起的话当然会看不懂。如果简单划分分布式系统的数据一致性的话,可以简单分成:

  • 强一致性:任何时刻、任何用户都可以读到最近一次成功更新的数据;
  • 单调一致性:任何时刻,任何用户一旦读到某个数据在某次更新后的值(不会再读到更旧的值);
  • 弱一致性:用户无法在确定时间内读到最新更新的值;
  • 会话一致性:任何用户在某次会话中,一旦读到某个数据在某次更新后的值,那么在本次会话中就不会再读到更旧的值;
  • 最终一致性:用户能读到某次更新后的值(但不一定是最新的值,也不一定是比上一次读到的更新的值),但系统保证数据将最终达到完全一致的状态,只是所需时间不能保障。

这些名词只是给出了数据可用的标准:只有满足特定的一致性条件的系统才是可用的。但是怎样达成数据的一致性,这不是一致性的定义能解决的问题,而是需要设计一些专门的机制和算法,它们通用的称谓是「一致性协议」。可以想像,一致性协议是分布式系统领域非常核心的一个问题,其中有一个比较重要的子问题随着区块链的大热而声名鹊起,那就是「共识」。

待续……