1.GFS是什么
全称是Google File System,Google早期研发的分布式文件系统。
画外音:与分布式文件系统对应的,是单机文件系统,Windows和Linux操作系统都有文件系统。
GFS的设计目标是什么
主要有四个目标:
(1) 高可用(availability):是指7*24提供服务,任何一台机器挂了或者磁盘坏了,服务不终止,文件不丢失;
(2) 高可靠(reliability):是指正确的输入,得到正确的输出,读取a文件,不会得到b文件;
(3) 高性能(performance):是指吞吐量很牛逼,每秒响应几十万请求;
(4) 可扩展(scalability):是指加机器,就能提升性能,就能存更多文件。
GFS对外提供什么接口
文件创建,删除,打开,关闭,读,写,快照。
解释如下:
除了快照,接口和单机文件系统差不多。
快照其实是快速文件目录树的拷贝,并不是所有文件的快照。
GFS能够成为分布式架构的经典案例,原因之一,就是接口简单,但反映的架构理念不简单。
GFS的系统架构如何
系统里只有文件客户端,主服务器,存储服务器三个角色。
(1) 客户端(GFS client),是以库的形式提供的,提供的就是对外要用的接口;
(2) 主服务器(GFS master),是单点,存储文件信息,目录信息,文件服务器信息,那个文件存在哪些文件服务器上等元数据;
(3) 存储服务器(GFS chunk-server),是集群,存储文件;
为什么要设计单点master?
单点master意味着有一个节点可以避免分布式锁,可以拥有全局视野,能够统一调度与监控,系统整体复杂度降低很多。简单来说,锁可以降级成本地锁,分布式调度可以降级为单点调度。
详细描述:
(1) master拥有所有文件目录结构,要操作某个文件,必须获得相应的锁;
画外音:一般情况下,不会对同一个网页进行并发写操作,应用场景决定锁冲突其实不大;
(2) master拥有全局视野,能够避免死锁;
(3) master知道chunk-server的信息,能够很容易的做chunk-server监控,负载均衡;
(4) master知道所有文件的副本分布信息,能够很容易的做文件大小的负载均衡;
画外音:负载均衡分为请求量的均衡,文件存储的容量均衡。
GFS的高可用是怎么保证
多个chunk-server可以通过线性扩展提升处理能力和存储空间,GFS的潜在瓶颈是单点master,所以GFS要想达到超高性能,主要架构优化思路在于,“提升master性能,减少与master交互”。
(1) 只存储元数据,不存储文件数据,不让磁盘容量成为master瓶颈;
(2) 元数据会存储在磁盘和内存里,不让磁盘IO成为master瓶颈;
(3) 元数据大小内存完全能装得下,不让内存容量成为master瓶颈;
(4) 所有数据流,数据缓存,都不走master,不让带宽成为master瓶颈;
(5) 元数据可以缓存在客户端,每次从客户端本地缓存访问元数据,只有元数据不准确的时候,才会访问master,不让CPU成为成为master瓶颈;
当然,chunk-server虽然有多个,也会通过一些手段提升chunk-server的性能,例如:
(1) 文件块使用64M,避免太多碎片降低性能;
(2) 使用追加写,而不是随机写,提升性能;
(3) 使用TCP长连接,提升性能。
GFS如何保证系统可靠性
保证元数据与文件数据的可靠性,GFS使用了很多非常经典的手段。
(1) 元数据的变更,会先写日志,以确保不会丢失,即日志也会冗余,具备高可用。
(2) master会轮询探测chunk-server的存活性,保证有chunk-server失效时,chunk-server的状态是准确的,即文件会存多份,短时间内chunk-server挂掉是不影响的。
(3) 元数据的修改是原子的,由master控制,master必须保证元数据修改的顺序性;
(4) 文件的正确性,通过checksum保证;
(5) 监控,快速发现问题;
总结
GFS的架构,体现了很多经典的设计实践:
- 简化系统角色,单点master降低系统复杂度
- 不管是文件还是服务,均通过“冗余+故障自动转移”保证高可用
- 由于存在单点master,GFS将“降低与单点master的交互”作为性能优化核心
- 通过写日志,原子修改,checksum,快速监控快速恢复等方式保证可靠性与完整性
- 通过串行化保证多个副本数据的一致性
- 控制流与数据流分离,提高性能