1.1 什么是分布式系统
Lamport在1987年的一封电子邮件中是这样描述分布式系统的:
"A distributed system is one in which the failure of a computer you did not even know existed can render your own computer unusable."
我们可以简单理解为:如果一台你都不知道的计算机坏了,从而导致你自己的计算机都无法使用,那么这样一个系统就是分布式系统。显然,这是一个非正式的定义。作者专门查阅了1987年5月Lamport发的一封邮件,当时Lamport在数字仪器公司(Digital Equipment Corporation,DEC)工作,需要用很多计算机来运行他的FF程序,而这个FF程序依赖于一个叫作nub的东西。他在邮件中写道:“电气问题不是根因,只不过是让这个情况更为突出罢了。现在新版本的nub使我的FF程序越来越依赖于在其他地方运行的程序。花几秒等程序自动切换总比花一两个小时重启服务器要少些恼火吧,所以我提议搞一个让我们的系统更加鲁棒的项目。”结合这封电子邮件的上下文可知,Lamport已经意识到解决问题的关键不在于提高单台服务器的电气可靠性,而在于让整个系统能够容忍单台计算机的故障,这其实是分布式系统最重要的特征之一。
如今的分布式系统是一个涉及内容较广的概念,它在不同的语境下描述了不同的特征。广义上,任何由多台计算机节点(以下简称“节点”)组成并共同完成特定任务的计算机系统,都可以被认为是分布式系统。根据这个定义,我们经常会遇到如下的分布式系统。
(1)并行系统:一般由多个节点组成,其基本功能是将规模较大的总任务切分成多个规模较小的任务,并让多个节点并发处理小任务,以提高总任务的处理效率。并行系统和并行算法侧重于研究如何把总任务切分为子任务,以及将子任务调度到不同的节点上并发执行。它研究的是效率问题,节点越多,问题越容易处理。
(2)基于共享内存的分布式系统:由多个节点组成,节点之间通过共享内存进行通信,共同完成某些任务。这里的“共享内存”不一定是真正的物理内存,也可以是共享数据库或者共享存储。之所以被称为共享内存,是因为最初人们在研究这类分布式算法时,是基于多核处理器访问共享内存这一模型进行的,所以该称呼一直沿用至今。
(3)基于消息传递的分布式系统:由多个节点组成,节点之间没有共享内存,只能通过链路来传递消息,节点和链路都有可能出现故障。它研究的是如何减少故障对系统的可用性和一致性的影响,因此节点越多,问题越难处理。
本书研究的分布式系统特指“基于消息传递的分布式系统”。在这个系统中,每个节点被称为进程。其中,“进程和链路均有可能失败”是本书所研究的分布式系统与其他分布式系统的核心区别,这也是基于消息传递的分布式算法的复杂性之所在。如无特殊说明,本书所说的“系统”和“分布式系统”(或计算、算法)均指基于消息传递的分布式系统(或计算、算法)。