云计算之分布式文件系统
云计算的分布式文件系统(如Google的GFS)是整个云计算的基石,提供上层表格系统所需的可靠和高效的数据存储,假设是:
l
整个文件系统由许多廉价计算机组成,机器故障是常事而非例外,系统需要不停地进行自我检测和监控,发现故障机器并自动恢复;
l
整个文件系统存储数百万数千万的100MB或更大尺寸的文件,而不是数十亿的KB尺寸小文件,支持对小文件的创建、读写,但不高效;
l
文件系统支持高效的大尺寸数据追加,特别是来自多个用户的无锁并发追加,小尺寸的数据追加和数据的改写也支持,但不高效;
l
大尺寸的顺序读数据十分高效,小尺寸随机读相对比较低效;
l
多数上层应用程序对数据吞吐量有较高的要求,但对单次读写时间没有很高的要求。保持持续可用的网络带宽比保证每次读写的低延时有更大的意义。
在云计算的分布式文件系统中,数据被分成固定大小的块,即chunk(在GFS中是64MB)。由于可靠性和性能的需求,每个chunk在系统中有若干份拷贝(缺省是3份),保存在不同的worker上。此外,这3份拷贝通所在的worker通常位于不同的机架和不同的网络交换机,因此一个机架或交换机故障不会导致数据不可用。把多个拷贝分布到不同交换机上进一步提高了数据读出的可用网络带宽,增加了数据读出的性能,但却增加了写入时在不同交换机之间传输的数据量,增加了写入成本,由于数据的读远远多于对数据的写,这种做法提高了系统的总体性能。
与云计算架构的其他子系统一样,云计算的分布式文件系统采用了“单一master+多个worker”的结构,其中worker保存chunk数据的拷贝,master保存了文件和目录的名字空间、文件到chunk的映射、当前worker列表、chunk拷贝在当前worker上的分布等。此外,master还记录了worker的chunk数据大小、可用磁盘空间、数据读写次数等,并在必要的时候进行chunk迁移以便实现负载的相对平衡。
云计算的分布式文件系统还提供了客户端库,应用程序通过客户端库访问文件数据。例如,当客户端需要读出一个文件从某个位置开始的数据时,客户端库通过询问master获得该文件的指定位置所在的chunk以及该chunk所在的worker列表,客户端库再向其中的一个worker(通常是离该客户端网络距离最近的worker)发起读chunk(指定的偏移值和指定的长度)的请求,worker读出指定的数据后返回给客户端库,客户端库再返回给应用程序。
以上对云计算的分布式文件系统做了一个大致描述,后续文章还有更多的叙述。