随着互联网的持续发展(以Web应用为代表)、计算机应用的深入、分布式系统构建技术的日益成熟,分布式系统逐渐深入到人们的日常生活,并渗透到社会、经济、文化生活的各个方面。现如今,分布式系统已成为主流的软件系统。本文主要介绍下分布式系统的特征和在进行分布式系统设计过程中所必须解决的问题:可伸缩性、异构性、安全性和故障处理等。

分布式系统概念

分布式系统是其组件分布在联通的计算机上,组件之间通过消息传递进行通信和动作协调的系统。对分布式系统的定义,覆盖了所有可有效部署联网计算机的系统。由一个网络连接的计算机可能在空间上的距离不等。它们可能分布在地球上不同的国家,也可能在同一机房。分布式系统的定义引出了分布式系统的以下重要特征:组件的并发性(进程间并发)、缺乏全局时钟和组件故障的独立性等。(A distributed system is one in which components located at networked computers communicate and coordinate their actions only by passing messages. This definition leads to the following especially significant characteristics of distributed systems: concurrency of components, lack of a global clock and independent failures of components.)

组件并发性(concurrency of components)

在一个计算机网络中,执行并发程序是最常见的行为之一。程序可以在各自的计算机上工作,在必要的时候共享资源(如文件)。系统处理共享资源的能力会随着网络资源的增加而提高。对共享资源的并发执行程序的协调也是一个重要的主题。

缺乏全局时钟(lack of a global clock)

在程序需要协作时,程序间通过消息交换来协调彼此的动作。密切的协作通常取决于对程序动作发生的时间的共识。但是,事实证明,网络上的计算机与时钟同步所达到的准确性是有限的。即没有一个正确时间的概念。这个通信通过网络发送消息带来的直接结果。

故障独立性(independent failures of components)

所有的计算机系统都可能出现故障,一般由系统设计者负责为可能的故障设计结果。分布式系统可能以新的方式出现故障。网络故障会导致计算机间的隔离,但这并不意味着计算机上的程序停止运行。事实上,计算机上的程序不能检测到网络是出现故障还是网络运行得比通常慢。类似的,计算机的故障或程序的异常终止(如操作系统故障、程序OOM),并不能马上使与它通信的其他组件了解。系统的每个组件会单独地出现故障,而其他组件运行正常。

分布式系统应用

构建和使用分布式系统的主要动力来源于对共享资源的期望。这里的"资源"是抽象的概念,但它能很好地描述在互联计算机间共享事物的范围。如这里的资源可以是硬件(磁盘、打印机等),也可以是软件(如文件、数据库、应用服务等)。

互联网(Intenet)

现代互联网是一个巨大的由多种类型设备网络互联的集合,网络的类型一直在增加,如无线通信技术,最终结果是互联网已成为一个泛化的资源,设备可在任何时间、任何地方被连接。典型的互联网组成如下图所示:
请添加图片描述
互联网上的计算机程序通过传递消息进行交互,采用了一种公共的通信手段(通用的网络协议,如TCP/IP协议)。因此,互联网也是一个超大的分布式系统。它使得世界各地的用户可以使用诸如网上购物、电子邮件和文件传送等服务。ISP(Internet Service Provider, 互联网服务提供商)是给个体用户和小型组织提供宽带连接和其他类型连接的公司,使他们能获得互联网上的任何地方的服务。Intranet(企业内部网)通过 Backbones (主干网实现互联。Backbones 是具有高传送能力的网络连接,通常采用星链(satellite link)、光缆和其他高带宽线路。
设备小型化和无线网络方面的技术进步使小型和便携计算设备(笔记本电脑、手持设备、可穿戴设备、嵌入式设备等)更方便链接到互联网(移动计算)。
小型计算设备在日常物品中普及开来,即计算设备的计算行为将透明地紧密捆绑到日常物品的物理功能上(边缘计算)。如洗衣机在完成洗衣后能通过电话通知用户,会让人感觉到方便。

云计算(Cloud Computing)

随着分布式系统基础设施的不断成熟,产业界和学术界更期望将分布式资源看成一个公共设施,把分布式资源和其他公共设施(如水或电)进行类比。关于计算作为公共设施,云计算概念被提出来。云被定义为一组基于互联网的应用,并且满足大多数用户需求的存储和计算服务的集合,这使得用户能大部分或全部免除本地数据存储和应用软件的使用。注意,云计算减少了对用户设备的需求,允许非常简单的桌面或便携设备来访问可能很广范围内的资源和服务。

分布式系统挑战

构建分布式系统的挑战是处理其组件的异构性、开放性(允许增加或替换组件)、安全性、可伸缩性(用户的负载或数量增加时,系统能正常运行的能力)、故障处理、组件的并发性、透明性和提高服务的质量问题。

异构性(Heterogeneity)

互联网使得用户能在大量异构计算机和网络上访问服务和运行应用程序。存在以下异构性(也可称为多样性或差别):(1) 网络; (2) 计算机硬件; (3) 操作系统; (4)编程语言; (5)不同开发者实现的软件,等等。
虽然互联网由多种不同种类的网络组成,但所有连接到互联网的设备都使用相同的网络协议来通信,所以这些不同网络的区别被屏蔽掉(计算机网络协议的重要性)。
整型等数据类型在不同种类的硬件上可以有不同的表示方法。如数据存储方法有大端存储和小端存储。一般情况下,高级编程语言会屏蔽这部分差异。
虽然计算机的操作系统需要包含互联网协议的实现,但可以不为这些协议提供相同的接口实现。如Linux中消息交换的调用与Windows中的调用是不一样的(面向接口编程)。
不同的编程语言使用不同的方式表示字符和数据结构(如数组和对象)。如果想让这些语言编写的程序进行通信,必须使用公共的标准。如远程过程通信协议gRPC等。

开放性(Openness)

计算机系统的开发性是决定系统能否以不同方式被扩展和重新实现的特征。分布式系统的开放性主要取决于新的资源共享服务能被增加和供多种客户程序使用的程度。
除非软件开发者能获得系统组件的关键软件接口的规约和文档,否则无法实现开放性。一句话,发布关键接口。这个过程类似于接口的标准化,但它经常避开官方的标准化过程(官方的标准化过程通常繁琐且进度缓慢)。
然而,发布接口仅是分布式系统增加和扩展服务的起点。设计者所面临的挑战是解决由不同人构造的由许多组件组成的分布式系统的复杂性。
互联网协议的设计者引入了一系列称为"征求意见文档"(Request For Comments, RFC)的文档。该文档包含规约和讨论。
按上述方式支持资源共享的系统称之为开放分布式系统。之所以具备开放性,主要是强调它们是可扩展的。可以通过在网络中增加计算机实现在硬件层次上的扩展,通过引入新的服务、重新实现旧的服务实现在软件层次上的扩展,最终使得应用能共享资源。开放系统被提到的另一个好处是他们与销售无关。开发分布式系统有以下特点:
(1) 发布系统的关键接口。
(2) 基于一致的通信机制和发布接口访问共享资源的。
(3) 可以基于异构硬件和软件构造系统。注意,如果期望系统正常工作,相关的测试是必要的。

安全性(Security)

分布式系统中维护和使用的众多信息资源对用户具有很高的内在价值,因此这些信息资源的安全相关重要。信息资源的安全性包括三个部分:机密性(防止泄露未经授权的个人数据)、完整性(防止被改变或破坏)、可用性(防止对访问资源的干扰,如DDOS攻击)。

可伸缩性(Scalability)

分布式系统可以在不同的规模(从小型企业内部网络到互联网)下有效且高效运转。如果资源数量和用户数量激增,系统仍能保持其有效性,那么这个系统称为可伸缩的
理想状态下,系统规模增加时系统和应用应不需要随之改变,但这一点很难达到。规模问题是分布式系统开发中面临的主要问题。

故障处理(Failure handling)

计算机系统有时会出现故障。当硬件或软件发生故障时,程序可能会产生不正确的结果或者在它们完成应进行的计算之前停止了。分布式系统的故障是部分的,也就是说,有些组件除了故障,而有些组件运行正常。因此故障的处理相当困难。常见的处理故障的技术有:
检测故障:有些故障可以被检测到。如校验和可用于检测消息或文件中出错的数据。
掩盖故障:有些被检测到的故障能被隐藏起来或降低它的严重程度。如消息在不能到达时进行重传,将文件数据写入两个磁盘,如果一个磁盘坏掉,另一个磁盘的数据仍是正确的。
容错:互联网上的大多数服务确实可能发生故障,视图检测并隐藏所有故障是不现实的。服务的客户能被设计成容错的,这通常也涉及到客户的错误容忍度。如Web服务器不可用时,Web浏览器不会让用户一直等待,而是告知用户问题原因。
故障恢复:恢复涉及软件的设计,以便在服务器崩溃后,永久数据的状态能被恢复或回滚。如数据库领域,通过实现事务保证单机场景下的故障恢复。而分布式事务则保证多机场景下的事务。

并发性(Concurrency)

在分布式系统中,服务和应用均提供可被客户共享的资源。因此,可能有几个客户同时试图访问一个共享资源的情况。管理共享资源的进程可以一次接收一个客户请求,但这种方法限制了吞吐量。因此,服务和应用通常允许并发地处理多个客户请求。如为避免进程间的竞争,通常可使用分布式锁保证资源服务的顺序性。为避免一个进程中多个线程间的竞争,可使用不同粒度的锁(读锁、写锁、公平锁、非公平锁)来保证数据的一致性。

透明性(Transparency)

透明性被定义为对用户和开发人员屏蔽分布式系统的组件分离性,使系统被认为是一个整体,而不是独立组件的集合。透明性的含义对系统软件的设计有重大的影响。
ANSA 参考手册和国际标准化组织的开放分布式处理的参考模型(RM-ODP)识别出八种透明性。下面将解释最初的ANSA定义,并使用移动透明性(使用更加广泛)替换迁移透明性。
(1) 访问透明性(Access transparency):用相同的操作访问本地资源和远程资源。
(2) 位置透明性(Location transparency):不需要知道资源的物理位置或网络位置,就能访问它们。
(3) 并发透明性(Concurrency transparency ):几个进程能并发的使用共享资源进行操作且互不干扰。
(4) 复制透明性(Replication transparency):使用资源的多个实例提升可靠性和性能,而用户和开发人员无需知道副本的相关信息。
(5) 故障透明性(Failure transparency):屏蔽错误,不论是硬件故障,还是软件故障,用户和应用都能完成它们的任务。
(6) 移动透明性(Mobility transparency):资源和客户能够在系统内移动而不会影响用户或程序的操作。
(7) 性能透明性(Performance transparency):当负载变化时,系统能被重新配置以适配性能。
(8) 伸缩透明性(Scaling transparency):系统和应用能够进行扩展而不改变系统结构或应用算法。
有时,也将访问透明性和位置透明性统称为网络透明性

服务质量(Quality of Service, QoS)

一旦提供给用户他们要求的服务的功能,如在一个分布式系统中的文件服务,我们就能继续探究所提供的服务质量。系统的主要的非功能特性,即影响客户和用户体验的服务质量是可靠性、安全性和性能。
可靠性和安全性问题再设计大多数计算机系统时是关键的。服务质量的性能方面源于及时性和计算吞吐量,但它已被重定义成满足及时性保证的能力。

总结

分布式系统无处不在。分布式系统是其组件分布在联通的计算机上,组件之间通过消息传递进行通信和动作协调的系统。分布式系统的关键特征是:组件的并发性(进程间并发)、缺乏全局时钟和组件故障的独立性等。资源共享是构建和使用分布式系统的主要动力。典型的分布式系统有互联网、云计算等。构建分布式系统的挑战有以下几点:处理组件的异构性、保证开放性(允许增加或替换组件)、保证安全性、可伸缩性、支持故障处理、支持并发场景、支持透明性和保证服务质量等。

参考

分布式系统概念与设计 George Coulouris, Jean Dollimore, Tim Kindberg, Gordon Blair 著, 金蓓弘, 马应龙 等译(原书第5版)
Distributed Systems Concepts and Design(Fifth Edition) George Coulouris, Jean Dollimore, Tim Kindberg, Gordon Blair

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐