摘要
本文介绍了了云计算中一个非常核心的技术——分布式计算。云计算基于分布式计算技术,它离不开Google的三大核心技术,GFS(Google File System,Google文件系统)分布式存储系统,MapReduce分布式处理技术和BigTable分布式数据库。本文主要从云计算分布式架构、分布式文件系统、分布式表格系统和分布式计算系统来讲述实现云计算特点的分布式计算。
关键词:云计算, 分布式计算,GFS,MapReduce,BigTable
1 引言
对于云计算的概念,虽然它只是Google CEO埃里克·施密特博士当年在SUN担任CTO时偶然想到的,但是其概念本身却不仅和过去电力的发展密不可分,而且更是整个IT行业自然发展和演化的必然结果。
尼古拉斯·卡尔在他的《The Big Switch: Rewiring the World, from Edison to Google 》中讲述了现在的IT产业正在经历一个类似从电力从发电机发电到电厂供电的巨大转变。换种说法来说,即是类似从个体拥有发电机发电到电厂集中供电,云计算技术能将许许多多分散在低利用率服务器上的工作负载整合到云中,人们只要接入互联网,就能非常方便地访问各种基于云的应用和信息,企业和个人能以低廉的价格来使用这些由云计算中心提供的服务,或者在云中直接搭建其所需的信息服务。它免去了用户安装和维护等繁琐操作。在收费模式上,云计算和水电等公用事业非常类似,用户只需为其所使用的部分付费。
在这里我们不得不提及与云计算密切相关的Google的三大核心技术。在2003年的SOSP大会上,Google发表了有关GFS(Google File System,Google文件系统)分布式存储系统的论文;在2004年的SOSP大会上,Google发表了有关MapReduce分布式处理技术的论文;在2006年的OSDI大会上发表了关于BigTable分布式数据库的论文。这3篇重量级论文的发表,不仅使大家了解Google搜索引擎别后强大的技术支撑,而且克隆这3个技术的开源产品如雨后春笋般涌现,比如使用MapReduce的产品有Hadoop,使用GFS的产品有HDFS,而使用BigTable的产品则有Hbase、Hypertable和Casandra等。这3篇论文和相关的开源技术极大地普及了云计算中非常核心的分布式技术。
云计算基于分布式计算技术,其最基本的概念,是透过网络将庞大的计算处理程序自动分拆成无数个较小的子程序,再交由多部服务器所组成的庞大系统经搜寻、计算分析之后将处理结果回传给用户。透过这项技术,网络服务提供者可以在数秒之内,达成处理数以千万计甚至亿计的信息,达到和“超级计算机”同样强大效能的网络服务。 即,分布式计算是实现云计算超大规模、高可扩展性、高可靠性、自动化、节能环保等特点的技术支持。
本文将从云计算分布式架构、分布式文件系统、分布式表格系统和分布式计算系统来讲述分布式技术在云计算中的作用。
2 云计算分布式架构综述
传统的关系数据库由底层文件系统和上层表格系统构成,类似地,云计算也包含了分布式文件系统(如Google的文件系统GFS)和分布式表格系统(如Google的Bigtable)两个部分,其中分布式文件系统实现可靠、高效的数据存储和处理,分布式表格系统在分布式文件系统的基础上实现表的各种处理逻辑,例如查询、修改、扫描等。此外,鉴于开发和调试分布式程序有比较大的难度,实现高效的分布式程序挑战更大,因而云计算还有一个分布式计算系统(MapReduce),通过它,云计算上的分布式程序开发变得易如反掌,运行效率却大大提升。MapReduce既可以运行在分布式的表格系统上,也可以直接运行在分布式文件系统上,达到很高的并行度,获得很好的效率。
下面,我们先从宏观上来谈谈云计算系统分布式架构。
云计算系统常常是单一主控机(single master)+多工作机(many workers)模式,worker实现数据的存储、读写、分析处理等,master保存部分或全部元数据、实现worker的任务分配、状态监控、负载平衡、故障监测和故障恢复等。Master常常使用heartbeat+lease或类似机制监控worker的状态,向worker定期发放lease,worker在lease有效期(例如几秒到几十秒)内才进行工作,lease失效后则停止工作。如果master发现某个worker在过去一段时间内没有响应或者出现其他异常,则不再向该worker发放新的lease,并在旧的lease到期后重新分配该worker上的任务。这使得master得以发现有故障的worker并将其从系统中剔除,并在适当的时候采取措施以避免数据丢失或者任务失败等等,也使得系统管理员不需要进行任何额外的操作就可以下线部分worker(例如机器维护、软件硬件升级、机器淘汰等等)。
如果没有其他措施,则云计算系统的单一master会成为整个系统的单点。为了避免这种现象的出现,云计算系统通常还有一个分布式选举系统(例如Google的Chubby),master也不再是单一master,而是单一主master+几个辅master,辅master保持着对主master的准同步,一旦主master故障,则其中一个辅master会被选举并升级成为主master。这种选举和升级通常需要若干秒的时间,但由于worker在lease有效期内即使没有master也会继续工作,且应用程序对master的访问通过名字而不是IP地址,因此上层应用程序通常看不到这种切换,或者是一个短暂的停顿。
3 分布式文件系统
云计算的分布式文件系统(如Google的GFS)是整个云计算的基石,提供上层表格系统所需的可靠和高效的数据存储。
它的特点是:
(1)容错与自动故障恢复是DNA
整个文件系统由许多廉价计算机组成,机器故障是常事而非例外,系统需要不停地进行自我检测和监控,发现故障机器并自动恢复;
(2)系统存储大文件而非小文件
整个文件系统存储数百万数千万的100MB或更大尺寸的文件,而不是数十亿的KB尺寸小文件,支持对小文件的创建、读写,但不高效;
(3)文件的主要修改是追加
文件系统支持高效的大尺寸数据追加,特别是来自多个用户的无锁并发追加,小尺寸的数据追加和数据的改写也支持,但不高效;
(4)高效的大尺寸顺序读
大尺寸的顺序读数据十分高效,小尺寸随机读相对比较低效;
(5)持续可用的网络带宽比低的单次读写延时更加重要
多数上层应用程序对数据吞吐量有较高的要求,但对单次读写时间没有很高的要求。保持持续可用的网络带宽比保证每次读写的低延时有更大的意义。
在云计算的分布式文件系统中,数据被分成固定大小的块,即chunk(在GFS中是64MB)。由于可靠性和性能的需求,每个chunk在系统中有若干份拷贝(缺省是3份),保存在不同的worker上。此外,这3份拷贝通所在的worker通常位于不同的机架和不同的网络交换机,因此一个机架或交换机故障不会导致数据不可用。把多个拷贝分布到不同交换机上进一步提高了数据读出的可用网络带宽,增加了数据读出的性能,但却增加了写入时在不同交换机之间传输的数据量,增加了写入成本,由于数据的读远远多于对数据的写,这种做法提高了系统的总体性能。
与云计算架构的其他子系统一样,云计算的分布式文件系统采用了“单一master+多个worker”的结构,其中worker保存chunk数据的拷贝,master保存了文件和目录的名字空间、文件到chunk的映射、当前worker列表、chunk拷贝在当前worker上的分布等。此外,master还记录了worker的chunk数据大小、可用磁盘空间、数据读写次数等,并在必要的时候进行chunk迁移以便实现负载的相对平衡。
这里我们可以联想到Google的GFS分布式存储系统。
GFS主要分为两类节点。其一是Master节点:它主要存储与数据文件相关的元数据,而不是Chunk(数据块)。元数据包括一个能将64位标签映射到数据块的位置及其组成文件的表格、数据块副本的位置和哪个进程正在读写特定的数据块等。另外,Master节点会周期地接受来自每个Chunk节点的更新(Heart-beat),让元数据保持最新状态。其二是Chunk节点,它主要用于存储数据。在每个Chunk节点上,数据文件会以每个Chunk的默认大小为64MB的方式存储,而且每个Chunk都有唯一一个64位标签,都会在整个分布式系统中被复制多次,默认次数为3。
另外的是,云计算的分布式文件系统还提供了客户端库,应用程序通过客户端库访问文件数据。例如,当客户端需要读出一个文件从某个位置开始的数据时,客户端库通过询问master获得该文件的指定位置所在的chunk以及该chunk所在的worker列表,客户端库再向其中的一个worker(通常是离该客户端网络距离最近的worker)发起读chunk(指定的偏移值和指定的长度)的请求,worker读出指定的数据后返回给客户端库,客户端库再返回给应用程序。
4 分布式表格系统
云计算的分布式表格系统依赖于下层的分布式文件系统(如Google的GFS)提供可靠和高效的数据存储,也是分布式文件系统的主要使用者。下面我们以BigTable为例作简单的描述。
由于需要在Google的数据存储中心存储PB级别以上的非关系型数据,比如网页和地理数据等,所以为了更好地存储和利用这些数据,Google开发了一套数据库系统,名为BigTable。从技术上讲,BigTable不是一个传统的关系型数据库,也不支持类似联结(Join)这样高级的SQL操作,而是多级映射的数据结构,支持大规模数据处理、高容错性和自我管理等特性,提供PB级别的存储能力,使用结构化的文件来存储数据,并且整个集群每秒可处理数百万读写操作。
什么是多级映射的数据结构呢?就是一个稀疏的、多维的、排序的表格,其中每个单元格有行关键字、列关键字和时间戳来进行三维定位。单元格的内容本身就是一个字符串,比如存储的每个网页的内容。BigTable还提供了一个用于将多个相似的列整合到一起的列组(Column Family)机制。
在结构上,BigTable是基于GFS分布式文件系统和Chubby分布式锁服务的。BigTable主要分为两部分:其一是Master节点,用来处理元数据相关的操作并支持负载均衡;其二是Table节点,主要用于存储数据库的分片table,并提供相应的数据访问。而table基于名为SSTable的格式,这种格式对压缩有很好的支持。
5 分布式计算系统
云计算基于分布式系统,众所周知,并行程序的设计、编码和调试非常挑战,在云计算分布式系统中,由于网络延时(毫秒级)远远大于单机系统内延时(微秒级)、部件的不可靠性以及节点之间较松的耦合度(低于通常的并行大型计算机)和异构性,高效并行程序的设计和实现难度更大,极大地阻碍普通程序员使用云计算系统。为了解决这个问题,Google创造性地把Map/Reduce模型成功地应用到了云计算系统中,极大地降低了云计算系统应用程序的开发难度且提高了云计算系统的并行度和运行效率,这就是云计算的分布式计算系统,它的基本原理是:每个应用程序被分成map函数和reduce函数,都由应用程序开发者编写,map函数的输入是<key, value>对,输出是中间结果<key, value>对,云计算分布式计算系统对这些中间结果按reduce分组,然后传给对应的reduce函数,reduce函数以迭代器的方式接收这些中间结果并进行合并等处理,然后输出所需的内容。例如,以海量文档的单词个数的统计问题为例,map函数输出的中间结果可以是:<单词,“1”>,即:
Map(string key, string value)
{
//对于文档中的每个单词w
emit(w, “1”);
}
//reduce函数则把所有的“1”加起来,最后输出:
Reduce(string key, iterator values)
{
//key: 一个单词
//values: 该单词对应的所有“1”
int num = 0;
for each v in values:
num += atoi(v)
emit(itoa(num));
}
MapReduce系统的主要优点是:
(1)应用程序开发者不需要设计、编写和调试并行程序
开发者只需要设计、编写和调试普通的串行程序,即map函数和reduce函数,调试通过后提交到云计算系统,由云计算分布式系统框架把它们分发到成百上千台计算机(云计算的worker)上运行,并汇总和返回运行后的结果。开发者甚至不需要有分布式或者并行程序方面的经验或背景;
(2)高效率
云计算分布式计算系统的master根据用户设置自动把作业切分为许多map任务和reduce任务,然后以按需的方式分配map和reduce任务到所有的worker上,每个worker完成一个任务后就报告给master,master就给该worker再分配一个map或reduce任务,该worker执行新分配的任务…..,如此直到所有任务执行完;
(3)适于异构机群
上述按需分配任务的方式使得每个worker的计算能力都能得到最大限度的发挥:快的worker执行更多的任务,慢的worker执行较少的任务;
(4)容错
由于整个作业被切分成许多map任务和reduce任务,worker故障后,只要再次执行对应的map和reduce任务即可;master则定期记录检查点(checkpoint),一旦master异常,新的master读入最后一次检查点,则整个作业可以最后一次检查点的基础上继续执行。
另外的是,云计算的分布式计算系统也自身的局限性。云计算分布式系统的易用和高效建立Map/Reduce模型的基础上,Map/Reduce模型要求切分出来的map和reduce可以多次以任意顺序执行而没有副作用,等等。幸运的是,绝大部分应用能够适用于该模型,不适合的应用也常常能够找到可用的近似算法,这使得云计算系统在实际工作中发挥了巨大的作用。
6 小结
通过对云计算中分布式计算技术的了解,我对其在云计算及其架构中的地位和作用有了更加明确的认识,归纳起来有以下几点:
(1)云计算不等于分布式计算
分布式计算仅是云计算中的有机组成部分。
(2)分布式计算是云计算中的核心技术
云计算有服务端和客户端的概念。而且往往是服务端承担全部工作,客户端仅仅是调用和显示。因此服务端要求很强大,一般集群机器构成,服务端的计算是往往依赖分布式计算来实现。