在现代软件工程的演进历程中,从单机应用迈向分布式架构是一个关键的分水岭。这一跨越并非简单的硬件堆叠或代码迁移,而是一场涉及思维模式、设计哲学乃至对物理规律重新认知的深刻变革。
作为全书的开篇,本章将带领读者走出单机系统的舒适区,直面分布式环境下的真实挑战。我们将首先厘清分布式系统的核心定义,剖析其相较于集中式系统的本质差异与优势;随后,我们将重点探讨这一领域中不可回避的技术难题——从不可靠的网络通信到破碎的全局时钟,再到部分失效带来的不确定性。最后,本章将阐述架构师在转型过程中所需完成的心智转变,从追求绝对的确定性转向在一致性与可用性之间寻求平衡的权衡艺术。理解这些基础概念与思维范式,是掌握后续章节中复杂算法与一致性模型的前提,也是构建高可靠、高扩展系统的基石。
什么是分布式系统 #
在展开介绍分布式系统之前,我们先来看分布式系统的对立面:集中式的单机系统(Monolithic)。在单机系统中,所有计算、存储和处理任务都集中在一台计算机或一个中心节点上。单机系统的主要特点有:
- 单一节点:所有功能(如计算、数据存储、用户请求处理)都在一台机器或单一服务器上完成。
- 共享资源:使用共享内存和本地资源,通信速度快,无需网络消息传递。
- 单点控制:所有决策和数据管理由中心节点控制,无需节点间协调。
- 单一时钟:机器上的所有运行进程,使用同一个时钟的时间。
集中式单机系统的优点是:系统简单,请求、计算、存储、处理都在同一台节点上完成,不存在网络延迟、系统时间不一致等分布式系统才会出现的问题,但是缺点也很明显:单一机器节点的故障会导致整个系统的不可用,缺乏容错性;同时性能受限于单台机器的处理能力,只能通过升级硬件(垂直扩展(scale up))来提升性能。
集中式系统的例子有:
- 传统的单机数据库。
- 单服务器的Web应用,处理所有的请求和数据存储。
- 个人电脑运行的本地应用程序。
然而,很多应用场景和要求并不是集中式系统能够解决的,例如:
- 高性能:集中式系统可以通过垂直扩展的方式提升机器的硬件性能(采用更快的CPU、更大的内存等),以提升系统的处理能力。然而,垂直扩展的方式始终无法突破单一机器物理限制的天花板。与之对应的,分布式系统通过*横向扩展(scale out)*的方式,通过将多台机器组合在一起形成一个系统对外提供服务。当发现当前系统扔不满足需求时,可以继续在这个系统上增加机器提升处理能力。例如,在2003年的论文[GFS]中,Google讲述了使用廉价的硬件搭建分布式文件系统的经验。
- 高扩展性:和性能上遇到的瓶颈一样,随着数据量的增大,集中式系统在数据存储上也会遇到瓶颈。而分布式系统通过将数据分布存储在多台机器上,可以在系统无法承载更多数据的时候通过增加节点以提供更大的存储容量。
- 高可用性:现在绝大多数的服务,都要求系统能够保持7x24小时运行,表 system-avaliability 给出了不同的系统可用性需要满足的全年不可用时间。集中式系统中,只有一台机器节点提供服务,这很容易导致*单点故障(single point of failure)*问题:一台机器的故障就导致系统整体不可用。在分布式系统中,通过多台机器构成一个系统,提供了更多的冗余度,在某些机器出现故障时,系统也能够继续运行。
- 在地理位置上离用户更近:在许多情况下,要考虑用户所处的地理位置。例如,一个社交应用,既有来自亚洲的用户,也有来自欧洲的用户,在这种情况下,可能需要分别在不同的大洲建立服务,这些分布于不同地区的服务之间需要协同:例如,用户ID必须是全局唯一的。
- 合规要求:随着全球数据隐私法规的日益严格,为了满足*数据驻留(Data Residency)与数据主权(Data Sovereignty)*的合规性要求,系统架构必须支持跨地域的分布式部署。通过在不同国家或司法管辖区内建立独立的数据中心节点,实现数据的本地化存储与处理,从而确保用户数据严格限制在其所属的地理边界内。
- 资源共享:这里的"资源"不仅指硬件资源,也包括软件资源。例如,在进行大量计算时,为了计算计算流程,需要将计算划分为多个任务,分发到多个机器上同时执行;通过在线共享文档这样的产品,多个用户可以同时浏览、修改文档,无需将文件下载到硬盘上进行修改,同时也不再需要在个人电脑上安装处理软件。
- 业务属性:最后,除去以上集中式系统由于物理限制,要求使用分布式架构以外,某些业务天然就必须满足分布式特性。例如,电商服务中浏览、购买商品在一个平台,但是支付账单要到另外的系统(例如支付平台、银行等)完成,在这种业务中,系统天然就必须是分布式的。

有了和单机系统的横向对比,我们可以来看看分布式系统的定义了。本书采用了在[Coulouris]中提到分布式系统的定义:
分布式系统是指各组件分布于网络互联的计算机上,通过相互传递消息来实现通信并协调运作的系统(A distributed system is a system whose components are located on different networked computers, which communicate and coordinate their actions by passing messages to one another.)。
从上面的定义可以看出:*分布式系统(Distributed System)*是由一组通过网络连接的独立计算机(节点)组成的系统,这些节点协作完成共同任务。每个节点拥有自己的处理器、内存和存储,节点间通过消息传递通信,无共享内存。
组成分布式系统中的每台计算机被称为节点(node)。在这里,“计算机"的概念非常宽泛:可能是个人电脑,也可能是数据中心的服务器、移动设备、联网的各类型IOT设备(如汽车、智能家电等等)。总而言之,“节点"可能是任何联网通信的设备。
分布式系统旨在实现高可用性、可扩展性和容错性,分布式系统通常具有以下特点:
- 多节点协作:分布式系统由多个物理上分散的节点组成来共同工作,这些节点可能位于不同地理位置,也可能是独立的进程。节点之间的地址空间互不关联,因此不会将共享内存的多处理器做为分布式系统的代表。
- 网络通信:节点通过网络(如互联网或局域网)进行通信,网络消息的延迟情况取决于信息链路的具体情况。例如,光缆可能被挖断、网络可能会分区、消息延迟会突然间陡增,这些都是在分布式通信中常见的故障情况。
- 无全局时钟:节点间缺乏统一时间,需通过协议同步。
- 协同工作:组成一个分布式系统中的多个节点,相互通信协同完成一个共同的目标。例如,三个节点组成的存储系统,共同提供强一致的数据服务,在一个节点宕机的情况下,仍然能继续工作;再比如,将一个大的任务划分多个小任务,由多个节点共同执行,最后再汇总得到最后的执行结果。
表 vs-dist-system 和图 introduction/vs 列举了分布式系统和集中式系统的关键特性对比。