分布式系统简介
什么是分布式系统
分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。
A distributed system is a collection of independent computers that appears to its users as a single coherent system.
分布式系统是若干独立计算机的集合,这计算机对用户来说就像是单个相关系统。特点:
- 若干独立计算机
- 对用户透明
分:把整个系统的功能分割成单一的功能部署到不同的机器不同的服务上。
合:不是简单把分散在各个机器服务上功能再重新放到一台机器上去,而是让这些分散的服务有机组合起来,彼此可以相互协作运行,对外呈现统一的整体。
只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统。因为,分布式系统要解决的问题本身就是和单机系统一样的,但是由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题。
分布式系统带来的挑战
异构性
分布式系统通过多个节点来实现一个对外统一的服务。这些节点可能会有很多很多,各个节点的物理构成和系统、软件实现都可能是不同的。最主要的影响便是网络,我们需要在各个不同的节点和网络之间进行相互通信,我们需要一致的协议(TCP/IP)来进行通信,在此基础上我们需要设计一个通信机制来实现节点之间的交互,如:远程过程调用(RPC),远程对象调用(ROI),面向流的通信和面向消息的通信。
命名系统
在一个拥有成千上万节点的分布式系统中,如何识别其中各个不同的节点呢?又该怎样识别其中新加入的节点呢?如果要剔除某个节点该怎么操作?这个时候我们需要命名系统来实现共享资源、唯一标识实体、指向位置等。在分布式系统里,命名系统的实现又有其特征,通常是分布在多台机器上的。
同步化
举个例子,多个进程不能同时访问一个共享资源(如文件、打印机等),而是相互协作,彼此授权暂时的独占访问。再比如,多个进程有时可能需要就事件的顺序达成一致,比方说来自进程P的消息m1是在来自进程Q的消息m2之前还是之后发出的。这就是我们需要克服的分布式的另一个难题:同步化。分布式系统的同步常常比单处理器或者多处理器系统的同步更难实现,在解决分布式系统同步的时候,我们一般需要用到时钟同步(如原子时钟)、逻辑时钟(如Lamport逻辑时钟、向量时钟)、互斥(集中式、非集中式、分布式、令牌环式)等等。
分布式系统的目标
资源的可访问性:必须能够让用户方便地访问资源
分布式系统的最主要目标是使用户能够方便的访问远程资源,并且以一种受控的方式与其他用户共享这些资源。
资源可以是任何东西,如打印机、计算机、存储设备、数据、文件、Web页及网络等等。
这里的方便主要是要求用户连接资源的方式是简单便捷的,比如因特网就是一个最好的例子。而资源共享的一个主要理由则是降低经济成本,比如让多个用户共享打印机和存储资源等。在连接能力和共享功能不断加强的同时,安全性也变得愈发重要,所以会要求用户的访问时受控的,如登录需要密码,数据传输的安全等。
透明性:必须对用户隐藏资源在网络上的分布
分布式系统的重要目标之一,将它的进程和资源实际上分布在多台计算机上这样一个事实给隐藏起来。如果一个分布式系统能够在用户和应用程序面前呈现为单个计算机系统,这样的分布式系统就称为是透明的。
- 访问透明性:隐藏数据表示形式的不同以及资源访问方式的不同。比如不同机器处理器上数据字节的传输区别(大小端),比如不同操作系统文件命名上的区别等。
- 位置透明性:隐藏资源所在位置,即用户无法判别资源在系统中的物理位置,比如我们通过URL看不出改Web服务器的所在位置。
- 迁移透明性:隐藏资源是否移动到另一个位置,即资源的移动不会影响该资源的访问方式。
- 重定位透明性:隐藏资源是否在使用中移动到另一个位置,即资源可以在接收访问的同时进行重新定位而不引起用户和访问程序的注意。比如移动通信用户从一个地点移动到另一个地点,访问资源的位置也随着变化,但用户并无感知。
- 复制透明性:隐藏是否对资源进行复制,指隐藏一个资源存在多个副本这样一个事实,所有副本的名字必须相同,支持复制透明性的系统必须同时也支持位置透明性,不然系统就无法引用位于不同位置的多个副本。
- 并发透明性:隐藏资源是否由若干相互竞争的用户共享,即用户不会感觉到他人也在使用自己正在使用的资源。必须确保对共享资源的并发访问不会破坏资源的一致状态。并发透明性引出的一致性问题是分布式系统中最困难的问题之一。
- 故障透明性:隐藏资源的故障和恢复,意味着用户不会注意到某个资源无法正常工作以及它随后从故障中恢复的过程。故障屏蔽是分布式系统的最困难问题之一,其中的一个困难是我们无法区别出现故障的资源和反应极慢资源。
- 持久性透明性:隐藏资源位于易失性存储(内存)中还是位于磁盘上,比如我们常用内存来缓存我们的磁盘数据来加快访问。这在非分布式系统中也是同样重要的。
高度的透明性一般要求的实现成本也会很难也更加困难,也可能会引起系统性能的下降。在设计并实现分布式系统时,把实现分布的透明作为目标是正确的,但是应该将它和其它方面的问题(比如性能)结合起来考虑,要与性能、容错性、程序设计难易性等进行平衡。
开放性
一个开放的分布式系统是根据一些列规则来提供服务的,这些规则描述了所提供服务的语法和语义。
例如,在计算机网络中,期规则规定了发送和接收消息的格式、内容及含义。对这些规则进行形式化,就产生了协议。在分布式系统中服务同时是通过接口来指定的,而接口一般是通过接口定义语言(IDL)来描述的。
良好的接口规范说明是完整且中立的。“完整”意味着完成接口实现不可少的所有内容都已经规定好了,许多不完整的接口定义则需要开发人员添加针对特定实现的细节。“中立性”要求接口规范说明不应该描述接口应该怎样实现。
开放的分布式系统的一种重要目标之一是“灵活性”,要能够方便地把由不同开发人员开发的不同的组件组合成整个系统,同时还必须能够方便地进行组件的添加、替换。
可扩展性
- 规模上扩展:加入更多的用户和资源
- 地域上扩展:用户和资源相隔甚远
- 管理上扩展:跨越多个独立的管理系统