目前常见的分布式文件系统有很多种,例如我之前一篇文章里面提到的Hadoop、FastDFS、Moosefs、PNFS(Parallel NFS)、Lustre、TFS、GFS、HDFS等等一系列。在众多的分布式文件系统解决方案中,MFS是搭建比较简单、使用起来也不需要过多的修改web程序,非常方便。
MooseFS(MFS)是一个分布式存储的框架,其具有如下特性:
1.Free(GPL)
2.通用文件系统,不需要修改上层应用就可以使用(那些需要专门api的dfs很麻烦)。
3.可以在线扩容,体系架构可伸缩性极强。
4.部署简单。
5.高可用,可设置任意的文件冗余程度(提供比raid1+0更高的冗余级别,而绝对不会影响读或者写的性能,只会加速!)
6.可回收在指定时间内删除的文件(“回收站”提供的是系统级别的服务,不怕误操作了,提供类似oralce 的闪回等高级dbms的即时回滚特性)
7.提供netapp,emc,ibm等商业存储的snapshot特性。(可以对整个文件甚至在正在写入的文件创建文件的快照)
8.google filesystem的一个c实现。
9.提供web gui监控接口。
10.提高随机读或写的效率。
11.提高海量小文件的读写效率。
MFS 文件系统结构:
包含 4 种角色:
1. 管理服务器managing server (master):负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝。
2. 元数据日志服务器 Metalogger server(Metalogger): 负责备份 master 服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在 master server 出问题的时候接替其进行工作。
3. 数据存储服务器data servers (chunkservers):负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数
据传输。
4.客户端client computers: 通过 fuse 内核接口挂接远程管理服务器上所管理的数据存储服务器,看起来共享的文件系统和本地 unix 文件系统使用一样的效果。
原理图
参考 moosefs.org
server4为master,server5与server6为chunk,instructor为client
server4
#yum install -y rpm-build
#cp mfs-1.6.27-5.tar.gz mfs-1.6.27.tar.gz
#rpmbuild -tb mfs-1.6.27.tar.gz
#cd rpmbuild/RPMS/x86_64/
#rpm -ivh mfs-master-1.6.27-4.x86_64.rpm mfs-cgi* //mfs-cgi.x86-64是用于apache主机的cgi监控,如果你不用apache,可以不用安装的
#cd /etc/mfs
借用以.dist后缀命名的样例文件作为 MooseFS 主控服务器的目标配置文件
#cp mfsexports.cfg.dist mfsexports.cfg
配置文件 mfsexports.cfg 指定那些客户端主机可以远程挂接 MooseFS 文件系统,以及授予挂接客户端什么样的访问权限。例如,我们指定只有 192.168.2.x 网段的主机可以以读写模式访问 MooseFS 的整个共享结构资源(/)。在配置文件 mfsexports.cfg 文件的第一行,先取消注释,然后把星号(*)改成 192.168.2.0/24,以便我们可以得到下面的文本行:
192.168.2.0/24 / rw,alldirs,maproot=0
#cp mfsmaster.cfg.dist mfsmaster.cfg
Mfsmaster.cfg 配置文件包含主控服务器 master 相关的设置,在这里我们暂时不打算对其进行修改。如果你想知道关于该配置文件更多的信息,请查看它的手册页(使用命令 man mfsmaster.cfg)。
#cp mfstopology.cfg.dist mfstopology.cfg //
#chown nobody /var/lib/mfs //mfs依赖nobody用户
#cd /var/lib/mfs //mfs安装目录
#cp metadata.mfs.empty metadata.mfs
#cd /usr/share/mfscgi/
#chmod +x *.cgi
#vim /etc/hosts 绑定mfsmaster到172.25.0.4
#mfsmaster //启动服务
#mfscgiserv //Mfscgiserv是用python编写的一个web服务器,监听端口是9425。用户利用浏览器就可全面监控所有客户挂载、服务器状态、磁盘IO信息、客户端的各种操作等等
web上输入172.25.0.4:9425
#cd rpmbuild/RPMS/x86_64/
#scp mfs-chunkserver-1.6.27-4.x86_64.rpm 172.25.0.5~
#scp mfs-chunkserver-1.6.27-4.x86_64.rpm 172.25.0.6:~
#scp mfs-client-1.6.27-4.x86_64.rpm 172.25.0.1:~
server5
#vim /etc/hosts 绑定mfsmaster到172.25.0.4
#rpm -ivh mfs-chunkserver-1.6.27-4.x86_64.rpm
#cd /etc/mfs/
#cp mfschunkserver.cfg.dist mfschunkserver.cfg
#cp mfshdd.cfg.dist mfshdd.cfg
#mkdir /var/lib/mfs
#chown nobody /var/lib/mfs
#cd /mnt
#mkdir chunk1 //设立共享点chunk1。chunk 以独占方式使用专门磁盘分区是非常必要的--这样做的好处是便于管理剩余空间。MooseFS 并不考虑其剩余空间能被另作他用。
#chown nobody chunk1/
#vim /etc/mfs/mfshdd.cfg
/mnt/chunk1
#mfschunkserver //启动chunkserver
server6
同server5
#mfschunkserver
提示不能创建lock文件,是因为chunk2所有人不是nobody
#chown nobody /mnt/chunk2
#mfschunkserver
client端 instructor
#vim /etc/hosts 绑定mfsmaster到172.25.0.4
#yum install mfs-client-1.6.27-4.x86_64.rpm -y
#cd /etc/mfs
#mv mfsmount.cfg.dist mfsmount.cfg
#vim mfsmount.cfg
在最后加入
/mnt/mfs
#cd /mnt
#mkdir mfs //建立客户端挂接点
#chown nobody mfs/ -R
#cd mfs
#mfsmount
#cd mfs
#mkdir dir1
#mkdir dir2
#cd dir1
#cp /etc/passwd .
#mfsfileinfo passwd
显示文件只在server5上存储。mfs以块为单位存储,一般每块为64MB。
#mfsgetgoal . //查看文件的冗余份数
#cd ..
#mfssetgoal -r 2 dir2 //设置dir2下文件的冗余为2
#cd dir2
#cp /etc/fstab .
#mfsfileinfo fstab
server5与server6各存了1份
##dd if=/dev/zero of=file2 bs=1M count=200 需要4块来存储。
server6
#mfschunkserver stop
instructor
#mfsfileinfo file2
只有server5开启chunk
server6
#mfschunkserver 再启动
instructor
#mfsfileinfo file2
#cd /mnt/
#mkdir mfsmeta
#chown nobody /mnt/mfsmeta
#mfsmount -m /mnt/mfsmeta //挂载到本地/mnt/mfsmeta
#cd /mnt/mfs/dir1
#dd if=/dev/zero of=file1 bs=1M count=100
#rm -fr *
#cd /mnt/mfsmeta/trash
#mv 0000000D\|dir1\|file1 undel/ //恢复删除文件
#cd /mnt/mfs/dir1
文件恢复成功
#mfssettrashtim 1000 /mnt/mfs/dir1
//设置删除后文件保留时间,单位s,设置过小的时间可能不生效。
#mfsgettrashtime /mmt/mfs/dir1
显示 dir1/:10
修改 linux 下最大文件描述符的限制:
在进行大量小文件写时,可能会出现了一个严重错误,有可能和操作系统文件描述符有关。操作
系统默认文件描述符为 1024.
1.6.26 版本默认为 100000
建议上线时,master 和 chunker 修改文件描述符系统级限制:它是限制所有用户打开文件描述符的总和,可以通过修改内核参数来更改该限制:
# vi /etc/sysctl.conf 添加
fs.file-max=102400
如果此值默认够大可以不用更改
# sysctl -p
命令使其生效。
用户级限制:只是修改用户级的最大文件描述符限制,也就是说每一个用户登录后执行的程序占
用文件描述符的总数不能超过这个限制。
# vi /etc/security/limits.conf
* - nofile 102400
保存退出后重新登录,其最大文件描述符已经被永久更改了。
与 file-max 参数相对应的还有 file-nr,这个参数是只读的,可以查看当前文件描述符的使用情况。
# sysctl -a|grep file
fs.file-nr = 12800 0 782554
fs.file-max = 782554
在 kernel 2.6 之前的版本中,file-nr 中的值由三部分组成,分别为:1.已经分配的文件句柄数,2.
已经分配单没有使用的文件句柄数,3.最大文件句柄数。但在 kernel 2.6 版本中第二项的值总为
0,这并不是一个错误,它实际上意味着已经分配的文件句柄无一浪费的都已经被使用了
file-max 的值是 linux 内核可以分配的最大文件句柄数。如果你看到了很多关于打开文件数已经达
到了最大值的错误信息,你可以试着增加该值的限制。file-max 的默认值大概是系统内存的 10%
(系统内存以 kb 计算)
停止 MooseFS
为了安全停止 MooseFS 集群,建议执行如下的步骤:
在所有客户端用 Unmount 命令先卸载文件系统(本例将是: umount /mnt/mfs)
停止 chunk server 进程: /usr/sbin/mfschunkserver stop
停止 metalogger 进程: /usr/sbin/mfsmetalogger stop
停止主控 master server 进程: /usr/sbin/mfsmaster stop