分布式文件两个主要功能:1. 存储文档,图像,视频等文件, 2. 作为其他系统的持久化层。Google文件系统(Google File System,GFS)构建在廉价服务器上的大型分布式文件系统,其他类型的分布式文件系统设计原理同GFS大同小异, 本文简单列举GFS的设计特点,主要包含系统架构和数据写入流程的介绍。
系统架构
GFS的主体架构如下图, 基本属于常规设计:

主要结构同微服务架构类似: 包含 消费端(GFS client), 注册中心(GFS 主控服务器),服务端(GFS数据块服务器): 客户端通过注册中心发现服务端。绝大多数分布式系统(不仅分布式文件系统, 也包括各种nosql, 消息系统等)都是这种架构模式。另外一种模式为无注册中心模式, 比如redis, cassandra, ES等,这种模式各个节点记录其他节点信息, 客户端需要连接到某一个节点, 然后即可获取其他节点信息。
GFS客户端需要记录:
缓存chunk信息, 防止每次请求都访问主控服务器, 造成主控服务器压力
记录文件信息
GFS主控服务器, 虽然将GFS主控服务器类比为微服务系统的注册中心, 但主控服务器承担的责任不仅仅服务注册:
记录文件句柄和chunk信息
记录文件和chunk的关联关系
记录chunk副本信息(无需持久化存储, chunk server会上报)
决定chunk server的分配, 比如不要同时在一个chunk server上新分配多个chunk, 防止资源抢占等
主控服务器一般是实时热备:同一时间仅有一台对外服务器, 信息实时同步到备份服务器
采用写日志方式保持一致性:顺序写
主控服务器存储了chunk的元数据信息, 每隔chunk可存储数据大小为64M,一般存储为3副本, chunk元数据大小约为64bytes, 如果存储1PB的数据, 需要:1PB x 3 /64m * 64 byte = 3G
采用checkpoint方式加快内存恢复: 每隔一段时间将内存数据dump,并记录checkpoint时间点, 当系统宕机后,直接import dump数据,在重访checkpoint时间点后的日志即可恢复主控服务器,新版本redis也支持类似概念, 消息服务器在不支持
主控服务器负责数据删除:异步删除(先重命名)
4. chunk 数据服务器 chunk server:
真正的文件数据存储在chunk server 上
chunk server属于异构设计:一个chunk server可存储不通chunk的主副本和从副本
chunk sever定期上报chunk 信息到主控服务器
为减轻主控服务器压力,主控服务器将写chunk的权限下放到chunk server, chunk server采用租约的方式保留写权限
数据写入控制
GFS的数据写入流程控制如下图, 采用数据流和信息流分离的方式:

在步骤3数据写入时, 数据不一定写入到主chunk server, 而是写入到同GFS client相近的chunk server, 然后再由其同步至其他的chunk server, 以保证数据传输的效率:
优点: 提高数据传输效率
缺点: 设计复杂, 相比写主副本, 再有主副本同步至其他副本的解决方案, 增加信息流同步过程
数据流和信息流分离的设计方式适合数据量较大大数据传输。
小结
GFS的总体设计同各种分布式系统设计相同, 主要特点是针对其处理大数据问题使用信息流与数据流分离的方式解决其特有问题




