MFS详解
一、分布式文件系统
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。另外,允许一些系统扮演客户机和服务器的双重角色。例如,用户可以“发表”一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就象使用本地驱动器一样。二、主流分布式文件系统介绍及特性比较
MooseFS(MFS) |
MooseFS是一款网络分布式文件系统。它把数据分散在多台服务器上,但对于用户来讲,看到的只是一个源。MFS也像其他类unix文件系统一样,包含了层级结构(目录树),存储着文件属性(权限,最后访问和修改时间),可以创建特殊的文件(块设备,字符设备,管道,套接字),符号链接,硬链接。 MFS文件系统个人理解: 将分布在各个范围的计算机,将他们的分区统一进行管理使用的一种文件系统。 简单来讲,就是将分布在各个范围的计算机,将他们的分区统一进行管理使用的一种文件系统。 |
Ceph |
Ceph是加州大学Santa Cruz分校的Sage Weil(DreamHost的联合创始人)专为博士论文设计的新一代*软件分布式文件系统。自2007年毕业之后,Sage开始全职投入到Ceph开发之中,使其能适用于生产环境。Ceph的主要目标是设计成基于POSIX的没有单点故障的分布式文件系统,使数据能容错和无缝的复制,2010年3 月,Linus Torvalds将Ceph client合并到内核2.6.34中,目前还不适用于生产环境。 |
GlusterFS |
Glusterfs 是一个具有可以扩展到几个 PB 数量级的分布式集群文件系统。它可以把多个不同类型的存储块通过 Infiniband RDMA 或者 TCP/IP 汇聚成一个大的并行网络文件系统。 |
Lustre |
lustre是一个大规模的、安全可靠的,具备高可用性的集群文件系统,它是由SUN公司开发和维护。该项目主要的目的就是开发下一代的集群文件系统,可以支持超过10000个节点,数以PB的数量存储系统 |
特性比较如下:
|
MooseFS(MFS) |
Ceph |
GlusterFS |
Lustre |
Metadata server |
单个MDS。存在单点故障和瓶颈。 |
多个MDS,不存在单点故障和瓶颈。MDS可以扩展,不存在瓶颈。 |
无,不存在单点故障。靠运行在各个节点上的动态算法来代替MDS,不需同步元数据,无硬盘I/O瓶颈。 |
双MDS(互相备份)。MDS不可以扩展,存在瓶颈。 |
文件分布/数据分布 |
文件被分片,数据块保存在不同的存储服务器上。 |
文件被分片,每个数据块是一个对象。对象保存在不同的存储服务器上。 |
Cluster Translators(GlusterFS集群存储的核心)包括AFR、DHT(和Stripe三种类型。 AFR相当于RAID1,每个文件都被复制到多个存储节点上。Stripe相当于RAID0,文件被分片,数据被条带化到各个存储节点上。 Translators可以组合,即AFR和stripe可以组成RAID10,实现高性能和高可用。 |
可以把大文件分片并分散存储在多个存储节点上。 |
冗余保护/副本 |
多副本 |
多副本 |
镜像 |
无 |
数据可靠性 |
由数据的多副本提供可靠性。 |
由数据的多副本提供可靠性。 |
由镜像提供可靠性。 |
由存储节点上的RAID1或RAID5/6提供可靠性。假如存储节点失效,则数据不可用。 |
故障恢复 |
手动恢复 |
当节点失效时,自动迁移数据、重新复制副本。 |
当节点、硬件、磁盘、网络发生故障时,系统会自动处理这些故障,管理员不需介入。 |
无 |
扩展性 |
增加存储服务器,可以提高容量和文件操作性能。但是由于不能增加MDS,因此元数据操作性能不能提高,是整个系统的瓶颈。 |
可以增加元数据服务器和存储节点。容量可扩展。文件操作性能可扩展。元数据操作性能可扩展。 |
容量可扩展。 |
可增加存储节点,提高容量可文件操作性能,但是由于不能增加MDS,因此元数据操作性能不能提高,是整个系统的瓶颈。 |
安装/部署 |
简单 |
简单 |
简单 |
复杂。而且Lustre严重依赖内核,需要重新编译内核。 |
开发语言 |
C |
C++ |
C |
C |
适合场景 |
大量小文件读写 |
小文件 |
对于小文件,无元数据服务设计解决了元数据的问题。但GlusterFS并没有在I/O方面作优化,在存储服务器底层文件系统上仍然是大量小文件,本地文件系统元数据访问是瓶颈,数据分布和并行性也无法充分发挥作用。因此,GlusterFS的小文件性能还存在很大优化空间。 |
大文件读写 |
产品级别 |
小型 |
中型 |
中型 |
大型 |
应用 |
国内较多 |
无 |
较多用户使用 |
HPC领域。 |
优缺点 |
实施简单 易用、稳定、对小文件很高效 但是存在单点故障。 |
不稳定,目前还在实验阶段,不适合于生产环境。 |
无元数据服务器,堆栈式架构(基本功能模块可以进行堆栈式组合,实现强大功能)。具有线性横向扩展能力。
由于没有元数据服务器,因此增加了客户端的负载,占用相当的CPU和内存。 但遍历文件目录时,则实现较为复杂和低效,需要搜索所有的存储节点。因此不建议使用较深的路径。 |
复杂、高效、很成熟、适合大型集群。 |
三、MooseFS系统的组成
角色 |
角色作用 |
管理服务器(mfs master) |
负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝。 |
元数据日志服务器 Metalogger server(Metalogger) |
负责备份master 服务器的变化日志文件,文件类型为changelog_ml.*.mfs ,以便于在master server 出问题的时候接替其进行工作。 |
数据存储服务器(chunkservers) |
负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输。 |
MooseFS Client |
通过fuse 内核接口挂接远程管理服务器上所管理的数据存储服务器,.看起来共享的文件系统和本地unix 文件系统使用一样的效果。 |
四、MooseFs的工作原理
在客户端上对挂载在 MooseFS 上的文件操作与的文件系统完全一样,操作系统内核将文件操作传输至 FUSE 模块,进而与 mfsmount 进程进行交互。 Mfsmount 进程通过网络与管理服 务器及数据服务器交互。整个过程对用户来说是完全透明的。Mfsmount 每次与管理服务器交互,以下的操作文件元是必须的:
- 创建文件
- 删除文件
- 读取文件目录
- 读取及改变属性
- 改变文件大小
- 开始读取或写入数据
- 访问MFSMETA 上的任何特殊文件
mfsmount 直接连接到数据服务器,用于存储相关片段的文件。当写入一个文件时,写入过程完成后,管理服务器会接收从 mfsmount 发送回来的信息,用于更新文件的长度及最后的修改时间。此外,数据服务器间能够相互复制数据,以达到将数据文件存储在不同机器上的目的,以下用图来简单介绍mooseFs的读写过程:
读文件流程如上图所示, 分4个步骤
- Client向Master请求Chunk Server地址和Chunk版本;
- Master返回按照拓扑位置排序Chunk Server地址列表,以及Chunk版本;
- Client从第一个Chunk Server读取数据;
- 若版本匹配, Chunk Server返回Chunk数据;
写流程如上图所示分为一下几个步骤:
- Client向Master请求Chunk Server地址和Chunk版本;
- Master返回Chunk Server地址和版本
- 若Chunk不存在, Master通知Chunk Server创建Chunk
- 若Chunk存在, Master通知Chunk Server增加Chunk版本
- 若多个文件引用chunk,Master通知Chunk Server复制一份Chunk
- 若Chunk上没有Lease,Master设置Lease,Lease超时时间为120s
- Master返回Chunk版本,和按照拓扑排序之后的Chunk Server地址
- Client与第一个ChunkServer建立连接, 发送写请求CLTOCS_WRITE,CLTOCS_WRITE 包含Chunk Server链信息,Chunk Server转发该消息到后续Chunk Server,建立一条Chunk Server pipeline
- Client发送多个CLTOCS_WRITE_DATA消息到Chunk Server pipeline(管道),CLTOCS_WRITE_DATA包含要写入的数据,偏移和长度等信息。
- Chunk Server收到消息后, 写请求到下一个Chunk Server, 同时调用写本地Chunk文件,写Chunk文件过程如下:
- 检查请求版本和Chunk版本是否一致、检查请求的CRC校验是否正确(Chunk分为64KB block,每个block对应32位CRC校验),检查其他参数
- 修改Chunk文件(写到操作系统缓存)
- 重新计算block checksum
- 如果写Chunk文件成功,且后续Chunk Server也返回成功,则返回成功到前一个Chunk Server或者Client
- Client收到Chunk Server响应消息之后, 通知Master写操作完成, Master记录必要的日志,并释放Chunk Lease
五、MooseFs的系统结构说明
服务器名 |
系统 |
IP |
备注 |
master |
Centos5.8 |
192.168.108.108 |
vm |
chunkserver1 |
Centos5.8 |
192.168.108.161 |
vm |
Chunkserver2 |
Centos5.8 |
192.168.108.162 |
vm |
Chunkserver3 |
Centos5.8 |
192.168.108.163 |
vm |
Chunkserver4 |
Centos5.8 |
192.168.108.164 |
vm |
client |
Centos5.8 |
192.168.108.109 |
vm |
六、MooseFs备份、故障恢复机制说明
1、MooseFs元数据的备份
通常元数据有两部分的数据
- 要元数据文件metadata.mfs,当mfsmaster运行的时候会被命名为metadata.mfs.back
- 元数据改变日志changelog.*.mfs,存储了过去的N小时的文件改变(N的数值是由BACK_LOGS参数设置的,默认50,参数的设置在mfschunkserver.cfg配置文件中)
主要的元数据文件需要定期备份,备份的频率取决于取决于多少小时changelogs储存。元数据changelogs应该实时的自动复制。自从MooseFS 1.6.5,这两项任务是由mfsmetalogger守护进程做的。
2、MooseFs Master的恢复
一旦mfsmaster崩溃(例如因为主机或电源失败),需要最后一个元数据日志changelog并入主要的metadata中。这个操作时通过mfsmetarestore工具做的,最简单的方法是:mfsmetarestore -a
如果master数据被存储在MooseFS编译指定地点外的路径,则要利用-d参数指定使用,如:mfsmetarestore -a -d /storage/mfsmaster
3、从备份恢复MooseFS master
为了从备份中恢复一个master,需要做:
1、安装一个mfsmaster
2、利用同样的配置来配置这台mfsmaster(利用备份来找回mfsmaster.cfg),可见配置文件也是需要备份的。
3、找回metadata.mfs.back文件,可以从备份中找,也可以中metalogger主机中找(如果启动了metalogger服务),然后把metadata.mfs.back放入data目录,一般为${prefix}/var/mfs。
4、从在master宕掉之前的任何运行metalogger服务的服务器上拷贝最后metadata文件,然后放入mfsmaster的数据目录。
5、利用mfsmetarestore命令合并元数据changelogs,可以用自动恢复模式mfsmetarestore –a,也可以利用非自动化恢复模式,语法如下:mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog_ml.*.mfs
七、MooseFs安装配制说明
1、安装mfs的前提条件:
由于mfs的客户端程序也就是加载mfs磁盘系统的命令是使用fuse编写的,因此只要是想挂载mfs的服务器,必要的前提条件就是先安装fuse,这样编译mfs的时候才能顺利通过。另外一点需要注意:linux 2.6.18-164.e15 版本的linux内核中已经内置了fuse模块。但在该版本之前的linux内核中是不包含这个模块的。另fuse 从2.8.0-pre1 版本的源码包中去掉了fuse系统模块的源码部分,原因就是上一点提到的。这样我们在编译安装当前最新版本的fuse(2.8以上版本) 且正在使用的linux内核版本低于2.6.18-164.e15版本,则系统中是不包含fuse模块的。
2、解决的方法:
- 升级系统内核为2.6.18-164版本:为了方便起见直接利用yum升级系统内核即可【yum install kernel】。安装成功后需重启系统
- 使用fuse 2.7x版本编译安装。该版本的fuse中包含了linux内核需要的fuse模块,配置编译选项时指定 –enable-kernel-module 选项,make的时候就会编译相应的fuse模块,make intall会将fuse.ko复制到 /lib/modules/`uname -r`/kernel/fs/fuse/ 目录下安装后利用【modprobe -l | grep fuse /lib/modules/2.6.18-128.el5xen/kernel/fs/fuse/fuse.ko】查看是否正常安装
- 利用yum安装当前内核版本的fuse模块【yum install -y dkms-fuse dkms】
3、本次实验均在VMWARE虚拟机下进行实验
- 机器配置:内存:256MCPU:双核
- 虚拟机数量:1台
- 操作系统RedHat 4.1.2 内核版本:2.6.18-308
- MFS版本:mfs-1.6.27-1
- 使用其它补丁:fuse-2.7.4
①最新的 MooseFS 稳定发行版本下载:http://jaist.dl.sourceforge.net/project/moosefs/moosefs/1.6.27/mfs-1.6.27-1.tar.gz
②在安装 MooseFS 系统客户端时,应当确保系统已经安装了正确的 fuse 版本,fuse版本下载:http://jaist.dl.sourceforge.net/project/fuse/fuse-2.X/2.7.4/fuse-2.7.4.tar.gz
③安装fuse如果只编译元数据服务端或数据存储服务端的话是没有必要安装fuse的。只有mfsmount需要fuse支持(编译时需要fuse的开发包,使用mfsmount挂载时需要fuse.ko系统模块)所以可以使用源码或yum两种方式安装fuse
#cd /usr/src #tar -zxvf fuse-2.7.4.tar.gz #cd fuse-2.7.4 #./configure #make #make install
④安装MooseFs
#groupadd mfs #useradd -g mfs mfs #cd /usr/src #tar -zxvf mfs-1.6.27-1.tar.gz #cd mfs-1.6.27-1 #./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var/lib --with-default-user=mfs --with-default-group=mfs –-enable-mfsmount #make #make install
其中prefix=安装目录,sysconfdir=配置文件目录,localstatedir=数据存放路径,存放metadate和changelog文件等。
⑤配置文件将会建立在/etc/mfs下扩展名为.dist,我们使用这些作为我们最终的配置文件:
#cd /etc/mfs #cp mfschunkserver.cfg.dist mfschunkserver.cfg #cp mfsexports.cfg.dist mfsexports.cfg #cp mfshdd.cfg.dist mfshdd.cfg #cp mfsmaster.cfg.dist mfsmaster.cfg #cp mfsmetalogger.cfg.dist mfsmetalogger.cfg #cp mfstopology.cfg.dist mfstopology.cfg
⑥二进制metadata文件和changelog文本文件存放在一个文件夹,该文件夹是在编译期间localstatedir所设置-在我们的例子中这个文件夹是:/var/lib/mfs.首次安装会建立一个名字为metadata.mfs.empty的空的metadata文件.我们把这个空文件改变为metadata.mfs:
#cd /var/lib/mfs #cp metadata.mfs.empty metadata.mfs
⑦mfsexports.cfg文件指定哪个客户端可以挂载MooseFS文件系统并且拥有什么权限.在我们的例子中指定仅仅192.168.56.x的机器能读写MooseFS的整个架构.该文件的第一行,并有这行没有注释我们把星号(*)改变为192.168.56.0/255 因此像下面这样:
192.168.56.0/255 / rw,alldirs,maproot=0
⑧在我们的示例中mfsmaster.cfg和mfschunkserver.cfg文件中的选项没有做任何改变。
⑨也把下面一行添加到/etc/hosts:192.168.56.103 mfsmaster
⑩此时可以运行master server,CGI monitor的进程:
#/usr/sbin/mfsmaster start #/usr/sbin/mfscgiserv
⑪开启cgi监控可以通过192.168.56.103:9425 查看mfs服务器的信息,查看时要关闭防火墙
#service iptables stop
⑫建立使用的目录:
#mkdir /mnt/chunkserver1 #mkdir /mnt/chunkserver2
在这里/mnt/chunkserver1和/mnt/chunkserver2是两个给mfs的分区,但在本机上是一个独立的磁盘挂载目录。
⑬修改分区的所有者为mfs:
#chown –R mfs:mfs /mnt/chunkserver1 #chown –R mfs:mfs /mnt/chunkserver2
⑭修改配置文件:
#cd /etc/mfs #vim mfsadd.cfg
mfshdd.cfg配置文件是服务器用来分配给MFS使用的空间,配置如下:
/mnt/chunkserver1 /mnt/chunkserver2
⑮此时可以启动chunk server的进程:
#/usr/sbin/mfschunkserver start
⑯现在挂载系统到/mnt/mfs
#mkdir /mnt/mfs #/usr/bin/mfsmount /mnt/mfs -H mfsmaster
5、出现的问题
Fuse安装不上,后来改用centos镜像里带的fuse的rpm包安装上的
上一篇: MySQL存储引擎
下一篇: Java定时任务的实现