第一章:认识分布式系统
1.1 分布式系统的特点:
- 多进程。分布式系统中有多个进程并发运行
- 不共享操作系统,通过网络通信传递消息来协作
- 不共享时钟,所以很难只通过时间来定义两个事件的顺序
1.2 分布式系统的优势:
- 高性能。由于计算机硬件存在无法突破的物理限制’随着芯片工艺逼近极限。摩尔定律已失效,于是现代CPU将多个CPU“拼在一起”以获得更高的性能。这便是多核CPU架构。可是多核CPU架构依然存在物理限制,而且成本会迅速上升,很多公司难以承受大型机高昂的成本。于是以Google为代表的互联网企业按照多核CPU架构的思路,选择将多台廉价的计算机结合起来,组成一个拥有大量的CPU、内存和磁盘的分布式系统,这么做同样可以实现对高性能的需求。
- 扩展性。目前很多应用程序都是数据密集(data-inensive)型的应用程序,大部分时间在存储和处理数据。随着业务扩展、用户增长或者历史数据累积,单台计算机只能扩展到有限的程度,无法满足要求。通过构建一个数据分布在多台计算机上的分布式存储系统,我们能够将集群规模扩展到单机系统根本无法想象的规模。
- 高可用性。在互联网时代,几乎所有的在线服务都需要7×24小时不间断运行。如果你的服务需要保证5个9的可用性,即99.999%的时间里都正常运行,这就意昧着每年最多允许宕机5分钟。想想各种各样的硬件故障、人为因素或者意外情况,就可以知道单个服务想要达到这个要求几乎是不可能的。通过构建分布式系统冗余多份数据来保证数据可用性;或者通过冗余计算实现服务切换,即在两台计算机上运行完金相同的任务,其中一台发生了故障,可以切换到另-台。这在日常开发运维工作中十分常见。
- 必要性。有时构建分布式系统甚至是必然的,例如银行系统需要支持从一个银行跨行转账到另-个银行。比如从北京的银行转账到纽约的银行,这时就需要一种方法来保证转账的一致性。可以说,有些天然的原因让我们的系统必然是分布式的。
1.3 分布式系统带来的挑战:
20世纪90年代,L.PeterDeutsch等人受到SunMicrosystems公司内部发生的问题的启发,总结出了分布式计算的谬误(The Fallacies of DistributedComputing) 这些谬误如下:
(1)网络是可靠的
(2)延迟为零
(3)带宽是无限的
(4)网络是安全的
(5)拓扑结构不会改变
(6)单一管理员
(7)传输成本为零
(8)网络是同构的
1.4 分布式系统带来的问题:
- 网络延迟问题
- 部分失效问题
- 时钟问题
1.5 每个程序员都应该知道的数字
JefTDean曾在他关于分布式系统的分享l中列出了“每个程序员都应该了解的数字(Numbers Eveyone Should Know)”,对计算机各类操作的耗时做了大致估计。笔者认为,无论进行何种系
统的设计和开发,这些数字都非常有用。这些数字如表1-1所示。

这些数字是在2009年给出的,计算机发展到今天,这些数字确实有些过时。笔者找到了
2020年各类操作的最新数据,如表l-2所示。不过,这些数字的重点在于它们之间的数量级和
比例,而不是具体的数字大小。


第二章:分布式系统模型
我们从分布式系统中的两个经典思想实验开始:两将军问题和拜占庭将军问题。
2.1 两将军问题
两将军问题(Two Generals`Problem)是计算机领域中的一个思想实验,是指两支由不同
的将军领导的军队,正准备进攻一座坚固的城市。军队在城市附近的两个山丘扎营,中间有—
个山谷将两个山丘隔开,两个将军交流的唯一方法是派遣信使穿越山谷。然而,山谷被城市的
守卫者占领,并且途经该山谷传递信息的信使有可能会被俘虏,如图2-1所示。

两将军问题虽然已被证明无解,但计算机科学家们仍然找到了工程上的解决方案,我们熟
悉的传输控制协议(TCP)的“三次握手”就是两将军问题的一个工程解。
这个思想实验还表明,在一个分布式系统中,一个节点没有办法确认另一个节点的状态,
一个节点想要知道某个节点的状态的唯一方法是通过发送信息进行交流来尽量得知。这跟人与
人之间的交流类似,我们没有心灵感应,所以让别人知道你的想法的唯—方式是通过语言、文
字或肢体语言等来交流。
2.2 拜占庭将军问题
拜占庭将军问题的由来可以追溯到20世纪80年代的计算机科学领域。这个问题最早是由Leslie Lamport等人在1982年提出的,用于描述在分布式系统中的信任问题。问题的名称来自于古代拜占庭帝国的将军们需要在没有中央指挥官的情况下,通过传递消息来决定进攻还是撤退。
拜占庭将军问题是一个思想实验,用来描述在一个分布式系统中,由于网络通信的不可靠性和节点的故障,如何在存在恶意节点的情况下达成一致。
在这个问题中,拜占庭帝国的多个将军需要就进攻或撤退向其他将军达成一致,但其中一些将军可能是叛徒,故意发送错误的消息以破坏一致性。叛徒将军可以发送虚假的命令,误导其他将军的决策。
这个问题的关键是如何确保忠诚将军之间的一致性,即使叛徒将军试图破坏它。在没有中央控制的情况下,如何通过分布式的通信来达成共识是一个具有挑战性的问题。
解决拜占庭将军问题是分布式系统中的一个重要挑战,需要使用各种协议和算法来实现容错性和一致性。这个问题的研究对于确保分布式系统的安全性和可靠性具有重要意义。
在分布式系统中,每个节点可以看作是一个将军,节点之间通过网络进行通信。由于网络通信的不可靠性和节点的故障,可能会导致消息丢失、延迟、篡改等问题。而且,系统中可能存在恶意节点,它们可能发送虚假的消息以破坏系统的一致性。
拜占庭将军问题的关键是如何在存在恶意节点的情况下,保证忠诚节点之间的一致性。这意味着如果一个将军发出进攻的命令,其他忠诚的将军都会接受并执行该命令,而不是受到叛徒将军的干扰。
解决拜占庭将军问题需要设计具有容错性和一致性的协议和算法。这些协议和算法需要考虑消息的可靠传递、节点的故障检测、恶意节点的识别等方面。拜占庭将军问题的研究对于确保分布式系统的安全性和可靠性具有重要意义。

2.3 系统模型
这两个思想实验告诉我们,现实中的分布式系统,节点和网络都可能出现各种各样的故障。
我们的系统模型就是根据不同种类的故障抽象出来的。
在设计一个分布式系统的时候,我们必须清楚系统会发生哪种故障,然后寻找对应的解。
不同的系统模型有着不同的算法和架构。
我们按网络、节点故障和时间三种类型划分系统模型。
2.3.1 网路链路模型
可靠链路
(1)可靠传递:如果进程p和q都正常工作,则进程P发送到进程q的每个消息都会被链
路传递。
(2)没有重复:每条消息最多传递一次。
(3)不会无中生有:链路不会自己生成消息。公平损失链路
- 公平损失:如果发送方和接收方都是正常运行的,且发送方不断重复发送消息,则消息
最终会被送达。 - 有限重复:消息只会重复发送有限的次数。
- 不会无中生有:链路不会自己生成消息。这个特点和可靠链路一样。
- 公平损失:如果发送方和接收方都是正常运行的,且发送方不断重复发送消息,则消息
任意链路
任意链路(ArbitraIyLmk)是最弱的—种网络链路模型。这种网络链路允许任意的网络链
路执行任何操作,可能有恶意软件修改网络数据包和流量。就像你在外面的商场或咖啡店连接
不明的wifi—样,wifi所有者可能是不可信的,不仅会监听你的数据’甚至修改你的数据包,听起来很可怕,但这是最接近互联网的模型。
2.3.2 节点故障类型
- 崩溃——停止:指一个节点停止工作后永远不会恢复。
- 崩溃——恢复:允许节点重新启动并继续执行剩余的步骤,一般通过持久化存储必要的状态
信息来容忍这种故障类型。 - 拜占庭故障如同拜占庭将军问题一样,故障的节点可能不只会宕机,还可能以任意方式
偏离算法,甚至恶意破坏系统。
2.3.3 按时间划分系统模型
同步(Synchronous)系统模型是指,一个消息的响应时间在一个有限且已知的时间范围内。
异步(Asynchronous)系统模型是指,一个消息的响应时间是无限的,无法知道—条消息什么
时候会到达。