“声明:由于个人水平有限,文中若存在不妥或错误之处,欢迎大家拍砖,并且一起讨论,交流。在文中会引用其他专家学者的观点和理论等内容,如文中出现版权问题,请联系我,我将以最快的速度删除。”
1 前言
分布式系统已成为许多企业首选的系统架构趋势,现在很多人都在谈分布式系统,那么,什么是分布式系统?分布式系统有哪些特点,优势?使用分布式系统有哪些需要注意的问题?
本篇文章讲结合自己的学习,工作感受谈一下分布式系统定义到分布式系统特点,分布式系统优缺点以及分布式系统的典型结构。目的是达成对分布式系统的统一认识和理解,了解分布式系统特点,为后续关于分布式系统众多问题的奠定相同的基础认知。
因为在接下来的文章中我们将围绕分布式系统(Distributed System)展开一系列的讨论,为了避免由于对名词理解上的偏差而引起的不必要争论,我想在这之前我们有必要对Distributed System这个词语的定义进行确认,以便在之后大家可以达成对这个词语的一致的认识(虽然在这里的定义不一定比在其它地方看到的定义更加准确,但是,我们的目的是在没有实质错误的基础上达成对分布式系统定义一致的理解,从而能够在相同的理解下进行交流,沟通)。
2 分布式系统的定义
下面我们先从互联网上搜索一些关于Distributed System的定义,然后,我们进行总结和抽象出我们这篇文章需要达成的一致的地方。
来自Wikipedia的定义:
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. The components interact with one another in order to achieve a common goal. Three significant characteristics of distributed systems are: concurrency of components, lack of a global clock, and independent failure of components.
“分布式系统是一个由处在不同网络位置的计算机组成的系统,分布式系统中的计算机通过传递消息来进行通信和协作。计算节点之间的相互通信和协作是为了完成一个共同的目标。分布式系统具有三个显著的特征:模块(这里就是计算节点)的并发性、无全局时钟、模块/计算节点间的异常独立性。”
来自 http://csis.pace.edu/ 的定义:
原文:
A distributed system is a collection of independent computers that appears to its users as a single coherent system. Important aspects:
a distributed system consists of components (i.e., computers) that are autonomous;
users (people or programs) think they are dealing with a single system;
autonomous components need to collaborate;
译文:
“分布式系统是由一组独立的计算机组成的计算机集合,这个计算机集合对于用户来说是一个整体,其具备如下特点:
分布式系统是由一组模块(例如,计算节点)组成的,且这些计算节点是自治的(即,互不影响);
在用户(人或者程序)看来,这个系统是一个整体;
自治的计算节点间需要协作;”
来自 https://www.tutorialspoint.com/Distributed-Systems 的定义:
原文:
A distributed system contains multiple nodes that are physically separate but linked together using the network. All the nodes in this system communicate with each other and handle processes in tandem. Each of these nodes contains a small part of the distributed operating system software.
原文:
“分布式系统包含了多个节点(计算节点,未必是计算节点),这些计算节点物理上是分离的,但是是通过网络连接的。所有的计算节点间互相可以通信且协作的处理流程。每一个计算节点包含了分布式操作系统中的部分软件。”这个定义相对有一点狭隘。”
来自 https://www.techopedia.com/definition/18909/distributed-system 的定义:
原文:
A distributed system is a network that consists of autonomous computers that are connected using a distribution middleware. They help in sharing different resources and capabilities to provide users with a single and integrated coherent network.
原文:
“分布式系统是一种网络,在这个网络里包含了自治的计算机且这些计算机通过中间件连接。计算节点间通过共享资源和能力来为用户提供一种统一的、一致的网络。”
更多的定义这里就不在列出了,整体上来看Wikipedia给出的定义是广泛能够接受的定义,为此,本文中的分布式系统的定义以此为基础。
3 分布式系统的特性
从上面的定义我们可以提取出分布式系统中的一些关键字:
Resource sharing,资源共享,计算节点之间可以共享信息(如数据);
Openess,开放的,言外之意就是多用户/多租户;
Concurrency,并发性,计算节点可并发运行程序/处理事务;
Scalability,扩展性,计算节点的数量可增加/减少;
Fault Tolerance,容错的,能够在一定范围内容忍系统中计算节点失效、网络故障等错误;
Transparency,透明性;
Heterogeneity ,异构的,计算节点中的软硬件可能不一样;
Autonomous,自治的;
Separated,分开的,计算节点在地理上是分开的;
进一步,我们可挑出分布式系统中的重要特性:并发性、无共享内存、无全局时钟、通过网络消息通信、易错的(单个节点/部分网络)。
这些特性的背后隐含的问题如下:
并发性-->各个计算节点执行的任务可能是同时进行的,也隐含了无法判断先后的问题/时间的前后问题;
无共享内存-->各个计算节点之间无法通过共享内存来共享信息,也隐含了如果计算节点需要同步信息时需要使用网络通信,而后面的易错性又导致消息的不可靠,从而导致信息同步的失败;
无全局时钟-->各个计算节点上的物理时钟是不能严格同步的,理论上每个计算节点间都存在物理时钟上的时间差,这隐含了无法通过物理时钟来判断事件的先后;
易错的-->整个分布式系统中的软硬件都是不可靠的,隐含我们设计系统时不能依赖软硬件自身的可靠性,例如持久化到硬盘的数据也可能因为硬盘的损坏而无法恢复;
上面的特性再进一步提取得到一个结论:分布式系统设计其实就是处理各种错误(软硬件错误、时间错误、逻辑错误等等)。
因此,在设计分布式系统时,请记住以下8条分布式系统常见的误区/误解:
网络是稳定的-网络情况是存在抖动的,如两个节点间的时延是不断变化的,因为受到诸如交换机、路由器等等节点间、相关设备的影响;
网络传输的延迟是零-计算机/进程/线程间消息发送是需要时间的,尽管很短也是存在时间差的;
网络的带宽是无穷大-网络带宽是有限的,数据传输是需要时间的;
网络是安全的-网络中存在消息截取、篡改等不安全情况;
网络的拓扑不会改变-错误/扩展设备可导致网络拓扑的变化;
只有一个系统管理员-分布式系统中可能存在、也必须存在多个拥有某些管理员权限的用户;
传输数据的成本为零-网络通信是需要成本的,在设计系统是需要考虑成本代价;
整个网络是同构的-系统中可能有Windows系统、Linux系统以及MacOS系统,这是硬件的异构性,也可能存在软件版本的异构性,等等。
阿尔农·罗特姆 - 盖尔 - 奥兹(Arnon Rotem-Gal-Oz)的论文“ Fallacies of Distributed Computing Explained ”(http://www.rgoarchitects.com/Files/fallacies.pdf)对这些误区进行了解释。
4 分布式系统通用架构
图1 分布式系统和并行系统
图2 分布式系统拓扑结构
从图1和图2中可以看出,分布式系统的显著特点就是计算资源(计算资源-CPU,存储资源-Memory和Hard Disk)的物理上的分离。分布式系统架构的特点是”分”,系统中没有/很少存在集中/单点的地方。
5 通俗解释
从上面的描述,我觉得我们从整体上可以达成如下共识: 分布式系统就是由一组在逻辑上/物理上分离的计算资源组成的为解决特定问题而设计出的计算机系统,该系统从解决问题的角度来看是一个整体(即逻辑上是一个整体),系统中的硬件设备通过网络连接以实现不同计算设备间的通讯从而实现处理过程的协调。
分布式系统的核心思想是”分”,核心问题是”治”,核心目的是”算”,这里的算是指工作(确切的说是协调工作)而不仅仅是计算。
典型的分布式系统有:并行计算系统,网格计算系统,高性能计算系统(以MPI为基础),物联网系统,分布式存储系统(如分布式文件系统,分布式数据库,分布式缓存等),分布式计算系统,分布式消息系统等等。
简单地说,判断一个系统是不是分布式系统可以看该系统内各计算节点是否共享内存,是否具有全局物理时钟,是否通过网络来通信,是否互相协调以解决特定问题。
6 备注
(1)文中的计算节点不一定是一台计算机,也可能是同一台计算机上面运行的不同进程/线程,计算节点一般是指为完成某个任务而运行的某段程序/进行的某个过程。
(2) 在设计正确的分布式算法/协议的时候,我们必须保证所设计的算法/协议满足如下两个性质:
Safety:具备Safety性质的算法保证坏的事情绝对不会发生,例如对于满足Safety性质的分布式选主(Leader election)算法,绝对不会出现一个以上进程被选为Leader的情况。这里说的“坏的事情”指的是:违反我们设计约束的、破坏算法稳定性或安全性的、导致违反Liveness性质等一系列的情况,这些“坏的事情”应该在所涉及的算法中不会出现或者当其出现时算法能够实现自治、自愈以消除这些“坏的事情”所产生的的影响;
Liveness:具备Liveness性质的算法保证好的事情终将发生,即算法在有限的时间内可以结束。这里的“有限的时间内”并没有一个明确的时间限制,只是说明:这个算法最终会结束。也就是说,算法不会出现无限循环某个操作/过程这样的情况、没有死锁、没有无限的等待等等导致这个算法永远无法结束的情况。
如果我们设计的算法出现了违反上述两个性质的情况,那么这个算法一定是不健壮、不稳定或者说是错误的,那么这个算法就不能够被使用。
那么,如何验证这两个性质呢?有一种由Leslie Lamport发明的名为TLA+(Temporal Logical Action Plus)[4]的形式化说明语言以及其运行环境可以对所涉及的并发算法/分布式算法进行说明和验证(Safety和Liveness)。
7 参考文献
[1] https://www.infoq.cn/article/2018/05/distributed-system-architecture
[2] http://book.mixu.net/distsys/single-page.html
[3] http://csis.pace.edu/~marchese/CS865/Lectures/Chap1/Chapter1.htm
[4] https://lamport.azurewebsites.net/tla/tla.html
8 接下来
本篇文章大致说明了分布式系统的通俗定义和解释,分布式系统具有特定优点的同时,也具备了特定的问题,如任务协调、可靠性、一致性、安全性等。接下来我们将针对分布式系统中的重点问题涉及的相关理论进行逐一的分析和讨论。