云计算原理与实践
上QQ阅读APP看书,第一时间看更新

2.1 分布式计算概述

2.1.1 基本概念

分布式计算的概念是相对于集中式计算概念来说的,因此,首先来比较这两个概念。

(1)集中式计算

集中式计算完全依赖于一台大型的中心计算机的处理能力,这台中心计算机称为主机(Host 或mainframe),与中心计算机相连的终端设备具有各不相同非常低的计算能力。实际上大多数终端完全不具有处理能力,仅作为输入输出设备使用。

(2)分布式计算

与集中式计算相反,分布式计算中,多个通过网络互联的计算机都具有一定的计算能力,它们之间互相传递数据,实现信息共享,协作共同完成一个处理任务。

由此可以看出,分布式计算是一门计算机科学,主要研究分布式系统。一个分布式系统包括若干通过网络互联的计算机。这些计算机互相配合以完成一个共同的目标。具体的过程是:将需要进行大量计算的项目数据分割成小块,由多台计算机分别计算,再上传运算结果后统一合并得出数据结论。在分布式系统上运行的计算机程序称为分布式计算程序;分布式编程就是编写上述程序的过程。

中国科学院对分布式计算有一个定义:分布式计算就是在两个或多个软件互相共享信息,这些软件既可以在同一台计算机上运行,也可以在通过网络连接起来的多台计算机上运行。分布式计算比起其他算法具有以下几个优点:

稀有资源可以共享;

通过分布式计算可以在多台计算机上平衡计算负载;

可以把程序放在最适合运行它的计算机上。

其中,共享稀有资源和负载平衡是计算机分布式计算的核心思想之一。

由计算机组成的网络已经无处不在,如今人们的日常生活已经被各种不同类型的网络包围,如电话网络、企业网络、家庭网络及各种类型的局域网,共同构成了称为Internet的网络。因此,可以将Internet看成由各种不同类型、不同地区、不同领域的网络构成的互联网。我们可以发现,互联网并没有集中式的控制中心,而是由大量分离且互联的节点组成的。这正是一个分散式的模型。我们可以把这个概念类比到要讲解的分布式概念上。

分布式概念是在网络这个大前提下诞生的。传统的计算是集中式的计算,使用计算能力强大的服务器处理大量的计算任务,但这种超级计算机的建造和维护成本极高,且明显存在很大的瓶颈。与之相对,如果一套系统可以将需要海量计算能力才能处理的问题拆分成许多小块,然后将这些小块分配给同一套系统中不同的计算节点进行处理,最后如有必要将分开计算的结果合并得到最终结果,那么这种系统就称为分布式系统。对于这种系统来说,我们会采用多种方式在不同节点之间进行数据通信和协调,而网络消息则是常用手段之一。

通过以上描述可以认为,一套分布式系统会使用网络上的硬件资源和软件组件进行计算,而各个计算节点间通过一定方式进行通信。这是从计算机科学的角度简单概述了分布式系统的概念。

如果从网络这个关键因素考虑,可以将计算分摊到网络中不同的计算节点,充分利用网络中的计算资源,而这些节点可能存在于不同的区域中,在空间上存在一定距离。虽说这种解释不太正式,但也从另一个角度上生动地阐述了分布式的基本特性,即节点分布。

2.1.2 分布式计算的原理

分布式计算就是将计算任务分摊到大量的计算节点上,一起完成海量的计算任务。而分布式计算的原理和并行计算类似,就是将一个复杂庞大的计算任务适当划分为一个个小任务,任务并行执行,只不过分布式计算会将这些任务分配到不同的计算节点上,每个计算节点只需要完成自己的计算任务即可,可以有效分担海量的计算任务。而每个计算节点也可以并行处理自身的任务,更加充分利用机器的CPU资源。最后再将每个节点的计算结果汇总,得到最后的计算结果。

划分计算任务以支持分布式计算很多时候看起来较为困难,但人们逐渐发现这样确实是可行的。而且随着计算任务量增加与计算节点增加,这种划分体现出来的价值会越来越大。分布式计算一般分为以下几步。

1.设计分布式计算模型

首先要规定分布式系统的计算模型。计算模型决定了系统中各个组件应该如何运行,组件之间应该如何进行消息通信,组件和节点应该如何管理等。

2.分布式任务分配

分布式算法不同于普通算法。普通算法通常是按部就班,一步接一步完成任务。而分布式计算中计算任务是分摊到各个节点上的。该算法着重解决的是能否分配任务,或如何分配任务的问题。

3.编写并执行分布式程序

使用特定的分布式计算框架与计算模型,将分布式算法转化为实现,并尽量保证整个集群的高效运行,其中包括以下几个难点。

(1)计算任务的划分

分布式计算的特点就是多个节点同时运算,因此如何将复杂算法优化分解成适用于每个节点计算的小任务,并回收节点的计算结果就成了问题。尤其是并行计算的最大特点是希望节点之间的计算互不相干,这样可以保证各节点以最快速度完成计算,一旦出现节点之间的等待,往往就会拖慢整个系统的速度。

(2)多节点之间的通信方式

另一个难点是节点之间如何高效通信。虽然在划分计算任务时,计算任务最好确保互不相干,这样每个节点可以各自为政。但大多数时候节点之间还是需要互相通信的,例如获取对方的计算结果等。一般有两种解决方案:一种是利用消息队列,将节点之间的依赖变成节点之间的消息传递;第二种是利用分布式存储系统,我们可以将节点的执行结果暂时存放在数据库中,其他节点等待或从数据库中获取数据。无论哪种方式只要符合实际需求都是可行的。