分布式计算是计算机科学的一个领域,研究如何协调通过网络通信的独立计算机或进程,以完成共同任务。分布式系统将计算、数据存储或服务职责分配给多个节点,而不是完全依赖一台机器。其目的包括提高处理能力、共享资源,以及在部分组件发生故障时维持服务。通信与协调是计算过程不可分割的一部分,而不只是机器之间附带的连接。(aws.amazon.com)
范围与主要特征
分布式计算与并行计算和并发计算有所交叉,但这些术语强调的是不同的特性。并行计算关注同时执行;并发计算关注执行过程在时间上重叠的活动;分布式计算则关注独立运行、跨边界通信的组件。并行程序可以在一台计算机内部运行,而分布式服务可能将大量时间用于等待消息,而非同时进行计算。(aws.amazon.com)
与传统的共享内存程序不同,联网的分布式程序通常不能假定自己能够即时访问另一节点的状态。消息传递需要时间,各进程的运行速度不同,组件也可能各自发生故障。此外,也不能直接假定物理时钟彼此一致。这些条件使同步(计算机科学)以及如何理解远程事件成为核心设计问题。(microsoft.com)
分布式并不要求节点在地理上相距遥远:节点可以位于同一个集群中,也可以通过互联网通信。云计算通常为分布式应用提供基础设施,但云计算并不等同于分布式计算;分布式系统也可以在自行管理的设备上运行,或利用多个组织提供的资源。(aws.amazon.com)
架构与执行模型
在客户端—服务器架构中,客户端请求服务器提供的功能。多层系统将界面呈现、应用处理和数据库访问等职责分开。在对等网络架构中,参与者既可以请求资源,也可以提供资源,客户端与服务器之间没有严格的区分。这些架构描述的是职责分配与通信模式,而不是特定的硬件配置。(aws.amazon.com)
以计算为主的系统经常将一项作业拆分为多个任务,再分配给工作节点。调度决定任务在哪里执行,而负载均衡则将需求分散到可用资源上。例如,Apache Spark使用驱动程序协调应用,使用集群管理器分配资源,并由执行器进程进行计算、存储应用数据。这种设计将应用协调与工作节点上的执行分离开来。(aws.amazon.com)
通信可以采用直接请求或异步消息。在松耦合通信中,组件可以提交工作,并在收到结果之前继续运行。设计必须明确什么情况算作完成,以及响应延迟或丢失时如何处理;远程请求并不等同于普通的本地函数调用。(aws.amazon.com)
事件排序、复制与共识
一个根本问题是如何确定不同进程中事件之间的关系。莱斯利·兰波特在1978年的论文中对先发生于关系进行了形式化定义:进程内部的执行顺序与消息传递共同确立了事件的偏序关系。逻辑时钟无需依赖完全同步的物理时钟,就能为事件分配符合这一顺序的时间戳。不过,某个事件的兰波特时间戳较小,本身并不能证明它对另一个事件产生了因果影响。(microsoft.com)
数据复制在多个节点上维护状态副本。它有助于实现容错,但也带来了如何确保各副本处理相容更新的问题。分布式共识解决参与进程之间达成一致的问题。在复制状态机系统中,对有序日志达成一致后,确定性副本便可执行相同的命令,并达到相同的状态。(raft.github.io)
Raft算法通过领导者选举、日志复制和安全性规则来组织这一过程。领导者协调更新,而多数派机制支持提交更新和替换失效的领导者。由五台服务器组成的Raft集群可以容忍两台服务器不可用,前提是剩余的多数派能够相互通信,且协议的时序条件允许系统继续推进。这类机制处理的是崩溃故障,不应直接将其理解为能够防范任意恶意行为。(raft.github.io)
基本限制
塞思·吉尔伯特与南希·林奇于2002年形式化证明的CAP定理,揭示了分布式共享数据服务的一项限制。发生网络分区时,系统无法同时保证线性一致性,以及未发生故障的节点上每个请求的可用性。这里的一致性是指系统行为等同于一个遵循实时顺序的单副本对象;可用性则要求请求能够完成。这一结论涉及的是网络分区条件下的保证,并不是一条不受条件限制的、要求在理想特性中“任取其二”的准则。(cs.princeton.edu)
迈克尔·费舍尔、南希·林奇和迈克尔·帕特森于1985年发表的FLP不可能性结果确立了另一项限制:在完全异步的消息传递系统中,即使只有一个进程可能崩溃,确定性共识也无法保证终止。这并不意味着实际的共识系统无法实现,而是意味着实现需要额外的假设或机制,例如时序条件、故障检测器或随机化。(homes.cs.washington.edu)
数据处理与机器学习
杰弗里·迪恩和桑杰·格马瓦特于2004年介绍的MapReduce编程模型,展示了如何对大数据进行分布式处理。映射操作生成中间键值对;归约操作则合并与每个键关联的值。其运行时系统负责输入分区、调度、通信和工作节点故障处理,使应用代码能够专注于数据转换本身。(research.google)
分布式机器学习利用多个节点和加速器来处理更大的数据集或模型。数据并行将样本分配给不同的工作节点,模型并行则将模型的各个组成部分分布到不同节点上。通信、同步、内存容量和工作负载均衡都会影响最终性能;增加工作节点并不保证获得成比例的加速。(docs.aws.amazon.com)
故障处理与性能
超时表示调用方已经停止等待,并不一定意味着远程操作失败。因此,重试可能会重复执行已经完成的操作。幂等操作或请求标识符有助于防止重复执行造成非预期的影响。退避机制会增加重试之间的等待时间,而随机抖动则可减少同时发生的集中重试,避免进一步加剧过载。(d1.awsstatic.com)
因此,性能并不仅仅取决于处理器数量。除了有效计算,数据传输、任务调度、协调和恢复也会消耗资源。MapReduce通过优先在数据所在位置调度任务,以及对异常缓慢的工作节点进行特殊处理,体现了这种权衡;分布式机器学习系统同样面临通信开销与任务分配不均的问题。(research.google.com)