分布式文件系统之GFS
1 分布式文件系统的功能:
存储文档、图像、视频类的Blob数据(binary large object)
作为分布式表格系统的持久层
2 google 文件系统(GFS)
2.1 概念
GFS是构建在廉价服务器之上的大型分布式系统,Bigtable、Megastore、Percolator均构建在GFS之上
2.2 GFS系统架构
2.2.1节点角色
GFS Master、GFS ChunkServer 、GFS Client
2.2.2注意点
GFS的客户端不缓存文件数据,只缓存从Master获取到的元数据,理由如下
MapReduce中客户端使用方式为顺序读写,没有缓存文件数据的必要
Bigtable,内部实现了一套缓存机制
2.3,要点问题
2.3.1租约机制
理由:如果每一次记录追加都需要请求Master,那么Master显然会成为系统的性能瓶颈,因此GFS通过租约(lease)机制将chunk写操作授权给ChunkServer
chunkServer:拥有租约授权的chunkServer称为主ChunkServer,其他副本所在的ChunkServer称为备ChunkServer
价值:在租约有效期内,对该chunk的写操作都是由主ChunkServer负责,从而减轻Master的负载
一致性:某些副本因为其所在的chunkServer下线过程中发生变更会带来的副本不一致问题,GFS通过对每个chunk维护一个版本号来解决
2.3.2 一致性模型
2.3.2.1弱一致性:
2.3.3 追加流程
2.3.3.1流程
1,C(客户端)向M(Master) 请求chunk每个副本所在的CS(ChunkServer),其中主CS持有修改租约
2,M向C返回主副本和备副本所在的CS的位置信息,C将缓存这些信息供以后使用
3,C将待追加的记录发生到每一个副本所在的CS(数据流向基于网络拓扑结构),每一个CS都会将这些记录缓存在LRU(Least Recently Used)结构中
4,当所有CS都确认收了数据,C发起一个写请求控制命令给主CS,主CS顺序写入(可能存在多个C请求写入数据的情况)数据后,将写请求分发给备CS,备CS写入完毕后应答主CS,主CS应答C
异常处理:如果出现主CS写入成功而备副本写入失败的情况下,C将重试
2.3.3.2特色
2.3GFS与HDFS区别
HDFS与GFS的设计目标是高度一致的,在架构、块大小、元数据等的实现上,HDFS与GFS大致一致。但是在某些地方,仍有较大的差别
1,快照
GFS中可以利用快照功能非常快速的对文件或目录进行拷贝,并不影响当前操作,GFS中生成快照的方式叫copy-on-write,文件备份的时候只是将快照文件
指向原chunk,增加对chunk 的引用计数而已,等到chunk上执行写操作时,chunkServer 才会拷贝chunk,后续的修改操作落在新生成的chunk上
而HDFS暂不支持快照功能,而是运用最基础的复制来完成
使用快照的好处:当HBase上的数据在进行重新划分时(过程类似于hash平衡),HDFS需要对其中的所有数据(P/T级的)进行复制迁移,而GFS只需要快照,由此可以看到快照带来的极大便利!
2,记录追加操作
GFS提供一个相对宽松的一致性模型,并支持写和追加操作,写操作可以使我们随机写文件,追加操作使得并行追加更加操作和
HDFS文件只允许一次打开并追加数据,客户端先把所有数据写入本地的临时文件中,等到数据量达到一个Chunk的大小(通常为64MB),请求HDFS Master分配工作机及Chunk编号,将一个Chunk的数据一次性写入HDFS文件。由于累积64MB数据才进行实际写HDFS系统,对HDFS Master造成的压力不大,不需要类似GFS中的将写Lease授权给CS的机制,且没有了重复记录和乱序的问题,大大地简化了系统的设计。
HDFS由于不支持Append模型带来的很多问题,构建于HDFS之上的Hypertable和HBase需要使用HDFS存放表格系统的操作日志,由于HDFS的客户端需要攒到64MB数据才一次性写入到HDFS中,Hypertable和HBase中的表格服务节点(对应于Bigtable中的Tablet Server)如果宕机,部分操作日志没有写入到HDFS,可能会丢数据
3,GC
GFS垃圾回收采用惰性回收策略,即master并不会立即回收程序所删除的文件资源。 GFS选择以一种特定的形式标记删除文件(通常是将文件名改为一个包含时间信息的隐藏名字),这样的文件不再被普通用户所访问。Master会定期对文件的命名空间进行检查,并删除一段时间前的隐藏文件(默认3天)。
HDFS并没有采用这样的垃圾回收机制,而是采取了一种更加简单但是更容易实现的直接删除方式。