程序员的智囊库系列之3--分布式文件系统(Distributed file systems)
这是程序员的智囊库系列的第三篇文章。上一篇文章本来打算介绍几个搭建网站的框架,但由于这部分的内容较多,还需要再整理一段时间,所以先放出这部分的第三篇文章。这一部分我们讲介绍分布式存储相关的一些知识,以及当下(2013-10-29)主流的分布式文件系统。由于有些NoSQL数据库也可以用来做分布式文件系统的替代物,所以这部分我们还将介绍几个NoSQL数据库。主要讲介绍以下几种分布式文件系统和NoSQL数据库:
- nfs
- ceph
- TFS
- GlusterFS
- MooseFS
- PVFS2
- GPFS
- HDFS
- FastDFS
- MogileFS
- Lustre
- GoogleFS
- memcached
- Tokyo Tyrant
- Redis
- MongoDB
背景
之前公司一直用nfs做文件服务器,nfs的好处就是配置简单,使用方便。但缺点是当数据量很多,尤其是小文件多的时候,其性能令人堪忧,往往会成为整个系统的性能瓶颈。所以准备在将来考虑用性能更好的方法替代nfs,于是花大工夫整理调查,横向对比了各分布式文件系统。调查报告的详细结果整理在这里,本文是从中抽出几个概要部分稍作讲解,具体内容请参见调查报告原文。我把分析报告原文放到了七牛上,但我感觉它最近不太稳定,如果下载不了,请与我联系,或直接在下面评论里留邮箱。
注:本来调查报告分两部分,理论分析报告和性能测试报告。本文的目的是介绍给大家更多的知识,扩展知识面,增加知识的广度。
而不是说直接告诉你,这个比那个好,你用这个,别用那个。
尤其是性能测试这种东西,别人的测试结果的参考价值并不是很大,必须沉下心来,自己去一点点的测才能找到最适合自己的工具、参数。
因此,本文只给出了理论分析报告,并没有给出性能测试报告。
几点基础知识
存储方案
- DAS
- SAN
- NAS
数据存储的方法
- 块存储(block)
- 文件存储(file)
- 对象存储(object)
元数据(meta data)
元数据的概念:data about data
数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,
诸如访问权限、文件拥有者以及文件数据块的分布信息(inode...)等等。
在集群文件系统中,分布信息包括文件在磁盘上的位置以及磁盘在集群中的位置。
用户需要操作一个文件必须首先得到它的元数据,才能定位到文件的位置并且得到文件的内容或相关属性。
元数据对文件系统的影响:文件系统对元数据的操作占据了传统文件系统总负荷的近一半。
高效的元数据管理方式对提高整个系统的性能至关重要。
A comparison of file system workloads. 2000 USENIX Annual Technical Conference
单点依赖
当一台服务器出现故障后,整个服务器群瘫痪。
解决方案:
1 TFS 利用linux 高可用性(HA)机制,配置HA元数据服务集群。但这样只能配置主设备和从设备,事实上同一时刻还是只有一个服务器在服务。这样做只能提高系统的稳定性,并不能解决采用集成式元数据服务模式的瓶颈问题(由于系统需要同步,反而会降低性能)。
2 Ceph GPFS 分布式元数据服务模型 将负载分散到多台服务器解决了性能瓶颈问题,利用对等的服务器或冗余元数据服务分区解决了单点故障问题。分布式看似非常完善,然而它大大增加了设计实现上的复杂性,同时可能会引入了新的问题,即性能开销和数据一致性问题。
3 GlusterFS 无元数据服务模型
无元数据服务器设计的好处是没有单点故障和性能瓶颈问题,可提高系统扩展性、性能、可靠性和稳定性。对于海量小文件应用,这种设计能够有效解决元数据的难点问题。它的负面影响是,数据一致问题更加复杂,文件目录遍历操作效率低下,缺乏全局监控管理功能。同时也导致客户端承担了更多的职能,比如文件定位、名字空间缓存、逻辑卷视图维护等等,这些都增加了客户端的负载,占用相当的CPU和内存。
HA高可用性
高可用性H.A.(High Availability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性。它与被认为是不间断操作的容错技术有所不同。HA系统是目前企业防止核心计算机系统因故障停机的最有效手段。
实现方法:
- heartbeat:比较常用
- rhcs:redhat集群套件--redhat cluster suite 图形界面,实现方便,可有100多个节点
- corosync/openais + paceker
2个节点:
采用主备模式:一台激活,另一台备份,对外呈现一个虚拟ip地址。两个节点之间采用心跳线,备份节点使用心跳线来探测活动节点是否处于活动状态。
心跳线:双绞线 或光纤跳线或 serial线
采用主主模式:两个节点,在提供web服务时,左侧为激活状态,右侧为备份状态;在实现mail服务时, 一个为激活状态,一个为备份状态。
FUSE
Filesystem in userspace
在用户态实现的文件系统
为什么使用FUSE:
首先要了解用户态和内核态
为了保证系统安全,在用户态执行的代码被硬件限制,不能进行某些操作,如修改其他程序的存储空间、修改配置文件、杀死其他进程、重启等。
而在内核态(核心态)执行的代码,可以不加限制地对系统存储、外部设备进行操作。
但是从用户态切换到核心态需要很大的开销。
所以FUSE有如下优点:
能够大幅提高效率,简化了为操作系统提供新的文件系统的工作量,特别适用于各种虚拟文件系统和网络文件系统。
开源软件的版本(copyleft)问题
GPL GPL2 GPL3 LGPL AGPL
题外话
无目录结构、扁平化存储是海量存储的未来发展方向
一般来讲计算机内部对文件的操作和查找不是按目录进行定位的
目录结构完全是为了方便用户浏览。
因而,一些不会与用户直接打交道的数据,完全可以不用目录结构存储。设计新产品的时候可以采用扁平化设计。
参考资料
关于存储,分布式存储,分布式文件系统的更多信息,可以参见以下几本资料:
分布式文件系统的评价标准
部署
- 部署复杂程度
- 服务器配置要求
- 文件系统接口
- 是否支持FUSE
- 是否需要配套的客户端
- 是否支持目录结构
- 可拓展性
性能
- 小文件支持
- 大文件支持
- 文件大小对性能的影响
- 平均传输速率
数据安全
- 单点依赖
- 冗余保护
- 故障恢复
实际应用
- 适用产品级别
- 是否成熟
- 实际应用
- 版本号
维护
- 是否开源
- license
- 社区活跃程度
- 文档语言
- 开发语言
- 文档完善程度
其他
- 数据迁移成本
- 存储机制
- 元数据存储方式
- 其他特点
如何才能选择最好的分布式文件系统呢?没有最好的分布式文件系统,只有最适合你的实际情况的。不是说最近ceph很火,ceph就一定适合你,一定要在认真分析你的实际情况后,通过理论参数做出初步筛选,然后通过性能测试来做最后的筛选,切不可鲁莽选择。
详细的理论比对请参见理论分析报告的原文!