读写操作
系统的工作负载主要两种读操作组成,一是大规模的流式读取,二是小规模的随机读取。
大规模流式读取通常是一次性读取1MB以上的数据。
小规模的随机读取通常是读几个KB的数据,为了提升性能,会把一系列的读取操作排序后,按顺序读取,节省时间。
写操作通常是以追加的形式出现。这个文件系统也可以支持小规模的随机写入,但效率低下。
通常会有数百个写操作同时需要处理,这就需要使用最小的同步开销,来实现原子的多路追加数据操作。
架构
一个GFS集群包含一个单独的Master节点和多台Chunk服务器。
架构中主要有三者,GFS master、GFS chunkserver、GFS client。
初始化:Master会给每个chunk分配一个唯一且不变的64位标识。
读取:客户端将(文件名,字节偏移量,Chunk的大小)=> Chunk 索引(index)。将多个信息(文件名,Chunk索引)发给Master。Master把多个信息(Chunk标识,副本位置)发给客户端。客户端用(文件名,Chunk索引)作为key,(Chunk标识,副本位置)作为value来做缓存处理。
客户端发送请求(Chunk表示,字节范围)至一个最近的副本处。
其中Chunk的大小选择了64MB,优点有二,一是减少通讯的需求和成本,二是减少Master节点需要保存的的元数据的数量。缺点是,对于只占一个Chunk的小文件,容易成为热点,可以通过更多得副本和错开批处理对鞋系统程序的启动时间来解决这个问题。
元数据
内存
Master节点是逻辑层面上的,Master服务器是物理层面上的。
Master服务器存储三种元数据:命名空间(文件和Chunk的)、映射关系(文件和Chunk)、每个Chunk副本的存放位置。
元数据保存在Master服务器的内存中,日志(记录前两种元数据)保存在本地磁盘,并且会被拷贝到其他Master服务器上。保存变更日志→更新Master服务器状态→防止Master服务器崩溃导致数据不一致。
Chunk信息
Master服务器启动时或Chunk服务器薪加入时,Master向每个Chunk服务器轮询它们所存储的Chunk信息,结合“心跳”来维持信息最新,并不会去维护一个Chunk信息的全局视图。
Master服务器周期性扫描自己保存的状态信息,用于垃圾收集、失效Chunk的拷贝、通过Chunk的迁移实现跨Chunk服务器的负载均衡、磁盘状况统计等。
操作日志
操作日志是元数据唯一的持久化存储记录,是判断同步操作顺序的逻辑时间基线,所以它极其重要。必须确保日志文件完整,所先拷贝日志,再相应客户端的操作请求。为了提高效率,Master服务器会收集多个日志后批量处理拷贝。
日志每增长一定量,会做一次checkpoint(将状态数据写入一个checkpoint文件,以压缩B-树存储),灾难恢复时,读取checkpoint然后重演checkpoint之后的有个日志文件来恢复系统。
在创建checkpoint时,Master服务器使用独立的线程切换到新的日志文件和创建新的checkpoint文件,新的checkpoint文件将包括切换前所有的修改。