云存储-Google的云存储技术细节 GFS

来源:互联网 发布:个人软件定制 编辑:程序博客网 时间:2024/05/22 00:09

云存储和云计算的出现是在信息海量存储和处理的需求下产生的,所以是否是真正的云,首先要解决存储和计算的问题。

 

一:云存储

采用类似Key/value模式和Schema Free列表模式 属于抽象化的数据模型,在转向商业应用的实际过程中,需要解决目前的流行系统所能够完成的可能性问题;

 

PC机可以Linux,Windows,Mac,但是后两者都难以承担作为廉价集群的任务,更适合作为用户的终端机;

Linux系统下,如果搭建云存储呢,分布式文件系统,分布式数据库,分布式搜索引擎,分布式Web服务器,分布式缓存,呵呵,的确可以找出很多;

但是这些众多的分布式组件能否彼此有效的组合为支持云存储呢,只有具体的实践才能够见证。

 

Google的设计具有颠覆性,起始也是在充分借鉴了这些分布式组件的基础上,全新设计出一套适合自身业务要求的存储引擎:

1:分布式文件系统GFS

2:BigTable提供数据的结构化和半结构化视图

3:MegaStore则在BigTable基础上在事务支持方面有更加面向数据库,支持组内数据ACID原则

4:Chubby则对GFS和BigTable起到控制器的作用,主服务器的选举、元数据的存储、粗粒度的锁服务

5:SSTable作为BigTable内部用来存储的文件,具有特定的格式

 

针对上述的几个核心模块,每一个都涵盖了很多的技术细节,为了通俗易懂,只有尽可能简单的分析:

一: GFS分布式文件系统,这个不属于Google的最先发明,也有很多类似的分布式文件系统

分布式文件系统需要解决的问题

a:抽象在操作系统的文件系统之上的一个应用程序

b:能够支持大规模存储的规划和复制的合理方案【多个副本的负载均衡,异步复制】

c:文件如何存储,如何快速被检索、访问

d:存储结构的多样性,key/value格式,目录格式,多维格式 【存储节点如何设计】

e:客户端如何和多个存储节点交互【追踪器如何设计】

f:如何在多个客户端跟多个存储节点实现平衡【负载均衡、任务调度】

g:为客户端访问提供透明一致性的访问接口

h:如何管理多个节点的故障转移,提供系统的可用性

 

总结:分布式文件系统,需要设计好存储节点和控制节点【追踪器】,以及提供尽可能好的管理工具和访问接口;

 

 带着这些问题,可以看一下Google的GFS是如何解决这些问题的

GFS:海量非结构化信息的存储平台,并提供了数据的冗余备份、上万台服务器的自动负载均衡以及失效服务器的检测等机制

 

GFS的设计原则:

一:以普通PC作为存储节点、控制节点,数据支持冗余备份、自动检测机器是否有效提供服务,故障机器的自动恢复。

二:存储文件为大文件100M到10G之间,必须对大文件的读写操作做出优化

三:系统存在大量的追加写,写入的内容很少变化,很少出现随机写,支持高效的追加写

四:数据的读取多数为顺序读,少量的随机读

 

这些设计原则让我想起此前所设计的企业级文档引擎的部分原则:

一:提供对非结构化的数据的有效存储、存储支持灵活的分级和目录

二:对大数据文件G级别的文件的上传、备份、下载

三:能够对大数据的内容快速的检索并且定位

四:对大文件的操作比较费时,不要影响其他业务的正常操作

 

根据上述的设计原则,了解一下GFS的整体架构

 三部分组成:

1:唯一的主控服务器{Master}

   负责管理工作

2: 众多的Chunk服务器

  负责数据存储并响应GFS客户端的读、写请求

3:GFS客户端

  负载跟数据存储节点交互,屏蔽访问的细节,让具体应用操作跟本地操作一样

 

GFS的文件系统:

类似Linux/Windows的文件系统,有目录和存放在整个目录下的文件构成的树形结构,可以理解为命名空间

/data/bizdomain/module/timestamp/datafile

GFS提供类似的文件创建、删除、读取和写入等常见的操作接口(API)

 

Chunk:存储数据的物理单元,比如一个大文件,最终还是被分割为具体的固定大小的块来存储 【Chunk】,每个chunk的大小为64M,一个文件通常有多个Chunk组成

 

每个文件可能拥有不同的Chunk,而且这些Chunk可以存储到不同的Chunk服务器上,每个Chunk服务器存储的Chunk可以是来自不同文件的chunk,

而在Chunk服务器内部,会对Chunk进一步分割,为具体的一个Block, Block为一个基本的存储操作单元。

 

GFS的整体架构描述如下:

1:主控服务器,维护GFS命名空间,维护Chunk命名空间

为了识别不同的Chunk,每个Chunk都有一个唯一编号,所有的编号构成了Chunk命名空间,GFS主控服务器还记录每个Chunk存储在那台Chunk服务器上的信息;

GFS系统内部必须维持文件到Chunk之间的映射关系

 

2:chunk服务器,负载对Chunk的实际存储,同时响应GFS客户端对自己负责的Chunk的读、写请求

 

3:GFS客户端,负责读取、更新数据

 实例:一个客户请求,读取支持文件,从P位置开始,读取长度为L

app--->send (filename,start_position,read_length) 到 GFS客户端,客户端介绍到后,内部转换为具体的Chunk序号,再发给

GFS主控服务器,主控服务器根据管理元数据,获取对应的存储Chunk服务器的位置,再返回给GFS客户端

GFS客户端然后,和具体的Chunk服务器建立连接,发送对应的读取的chunk编号的读取范围,Chunk服务器收到请求后,返回对应的数据

 

上述的实现类似文档引擎的实现:

1:有客户端供客户上传、下载文件 【该客户端需要接受文件、或者文件编号】,无需关注文件存储的位置

2:接受到文件编号,主控端首先根据文件编号,获取对应的存储节点位置,以及存储节点路径,将信息返回给客户端

3:客户端建立跟存储节点连接后,下载指定的文件

 

GFS主控服务器

采用主从架构,单一主控服务器,多个存储服务器

GFS管理如下元数据

1:GFS命名空间和Chunk命名空间

2:  从文件到其所属Chunk之间的映射关系

3:每个Chunk在那台Chunk服务器上存储的信息 【为了防止故障,每个chunk会被复制多份】

 

GFS将命名空间以及文件到Chunk映射表都记录在系统日志中,日志被存储在多台机器上

对于第三类元数据,主控服务器启动时会询问每个Chunk服务器,并定期询问来保持最新的信息

 

主控服务器的其它职能:

创建新Chunk以及备份数据,不同的Chunk服务器之间的负载均衡,如果那个chunk不可用,则负责生成新的备份,以及垃圾回收。

 

在数据备份和迁移时,需要考虑:

1:保持Chunk数据的可用性,当某个chunk不可用时,及时备份

2:尽可能减少网络传输压力

 

系统的写交互能力:

一个Chunk有多个备份,如果需要更新,则多个备份都需要同步更新

GFS的实现思路:

选择一个主备份,两个次备份,当需要更新时,发出3个Chunk备份请求,如果所有备份请求都接受到返回,则通知主备份开始写入,

待主备份写入完毕,返回给客户端,客户端通知次备份写入开始,如果次备份写入完毕,整体返回备份完成;

 

如果中间出现问题,则撤销返回;

 

http://hi.baidu.com/huareal/item/c488ade7fa2e4bf8e0a5d4be

0 0
原创粉丝点击