Mfs分布式存储
MFS 特性:
1. Free(GPL)
2. 通用文件系统,不需要修改上层应用就可以使用
3. 可以在线扩容,体系架构可伸缩性极强。
4. 部署简单。
5. 高可用,可设置任意的文件冗余程度(提供比 raid1+0 更高的冗余级别,而绝对不会影响读或写的性能,只会加速!)
6. 可回收在指定时间内删除的文件( “ 回收站 ” 提供的是系统级别的服务,不怕误操作了,提供类似 oralce 的闪回等高级 dbms 的即时回滚特性!)
7. 提供 netapp,emc,ibm 等商业存储的 snapshot 特性。(可以对整个文件甚至在正在写入的文件创建文件的快照)
8. google filesystem 的一个 c 实现。
9. 提供 web gui 监控接口。
10. 提高随机读或写的效率。
11. 提高海量小文件的读写效率。
可能的瓶颈:
1. master 本身的性能瓶颈。mfs 系统 master 存在单点故障如何解决?moosefs+drbd+heartbeat来保证 master 单点问题?不过在使用过程
中不可能完全不关机和间歇性的网络中断!
2. 体系架构存储文件总数的可遇见的上限。(mfs 把文件系统的结构缓存到 master 的内存中,文件越多,master 的内存消耗越大,8g 对应 2500w
的文件数,2 亿文件就得 64GB 内存 )。
master 服务器 CPU 负载取决于操作的次数,内存的使用取决于文件和文件夹的个数。
MFS 文件系统结构:
包含 4 种角色:
管理服务器 managing server (master)
元数据日志服务器 Metalogger server(Metalogger)
数据存储服务器 data servers (chunkservers)
客户机挂载使用 client computers
各种角色作用:
1. 管理服务器:负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝。
2. 元数据日志服务器: 负责备份 master 服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在 master server 出问题的时候接替其进行工作。
3. 数据存储服务器:负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输。
4. 客户端: 通过 fuse 内核接口挂接远程管理服务器上所管理的数据存储服务器,看起来共享的文件系统和本地 unix 文件系统使用一样的效果。
MFS 读写原理:
原始的读/写速度很明显是主要取决于所使用的硬盘的性能、网络的容量和拓扑结构的,使用的硬盘和网络的吞吐量越好,整个系统的性能也就会越好。
MFS 部署:
主机环境:RHEL6.0 selinux and iptables disabled
Master:172.25.27.1
Chunkserver: 172.25.27.3 172.25.27.2
Client: 172.25.27.4
Master 端
[root@server1 3.0.97]# yum install moosefs-cgi-3.0.97-1.rhsysv.x86_64.rpm moosefs-cgiserv-3.0.97-1.rhsysv.x86_64.rpm
moosefs-master-3.0.97-1.rhsysv.x86_64.rpm -y
[root@server1 3.0.97]# vim /etc/hosts #master和chunkserevr端三台主机都添加
172.25.27.1 mfsmaster server1
[root@server1 3.0.97]# /etc/init.d/moosefs-master start #开启服务
[root@server1 3.0.97]# /etc/init.d/moosefs-cgiserv start #启动 MooseFS cgi server用于使用web端查看监控
chunkserver端
[root@server2~]#yum install moosefs-chunkserver-3.0.97-1.rhsysv.x86_64.rpm -y#server2、server3上都安装
给server2上先安装一块虚拟硬盘
[root@server2 ~]# fdisk /dev/vdb #给磁盘分区
[root@server2 ~]# fdisk -l
[root@server2 ~]# mkfs.ext4 /dev/sdb1 #格式化
[root@server2 ~]# mkfs.ext4 /dev/sdb1 #格式化
[root@server2 ~]# cd /mnt/
[root@server2 mnt]# mkdir chunk1
[root@server2 mnt]# mkdir chunk2
[root@server2 mnt]# cd
[root@server2 ~]# mount /dev/vdb1 /mnt/chunk1/
[root@server2 ~]# vim /etc/fstab #设置开机自动挂载
[root@server2 mnt]# chown mfs.mfs chunk1/
[root@server2 mnt]# cd /etc/mfs/
[root@server2 mfs]# vim mfshdd.cfg #定义 mfs 共享点
[root@server2 ~]# /etc/init.d/moosefs-chunkserver start
[root@server2 ~]# cd /mnt/chunk1/
[root@server2 chunk1]# ls
Server3上进行server2上一样的操作不同的是将挂载点和共享点设置为/mnt/chunk2
Clint 端:
[root@server4 ~]# yum install moosefs-client-3.0.97-1.rhsysv.x86_64.rpm -y
[root@server4 ~]# cd /mnt/
[root@server4 mnt]# mkdir mfs
[root@server4 mnt]# cd /etc/mfs/
[root@server4 mfs]# vim mfsmount.cfg #定义客户端默认挂载
[root@server4 mfs]# vim /etc/hosts
172.25.27.1 mfsmaster server
[root@server4 mfs]# mfsmount #挂载
[root@server4 mfs]# cd /mnt/mfs/
[root@server4 mfs]# mkdir dir1
[root@server4 mfs]# mkdir dir2
[root@server4 mfs]# mfsgetgoal dir1
dir1: 2
[root@server4 mfs]# mfsgetgoal dir2
dir2: 2
对一个目录设定 “ goal”,此目录下的新创建文件和子目录均会继承此目录的设定,但不会改变已经存在的文件及目录的 copy 份数。但使用-r 选项可以更改已
经存在的 copy 份数。
[root@server4 mfs]# cp /etc/passwd dir1/
[root@server4 mfs]# cp /etc/passwd dir2/
[root@server4 mfs]# cd dir1/
[root@server4 dir1]# ls
passwd
[root@server4 dir1]# mfsfileinfo passwd #此时默认存储两份,即每个chunkserver存一份
[root@server4 mfs]# rm -fr dir1/*
[root@server4 mfs]# rm -fr dir2/*
[root@server4 mfs]# mfssetgoal -r 1 dir1/ #设置在 dir1 中文件存储份数为一个,
[root@server2 ~]# /etc/init.d/moosefs-chunkserver stop
原本dir1中的shadow文件显示为chunkserver2上面的,这个时候将chunkserver2关掉,发现不能访问文件查看文件信息后发现:dir1下面的
shadow文件不存在了,原本dir2下面存储两份的文件只剩下了一份。
[root@server2 ~]# /etc/init.d/moosefs-chunkserver start #当chunkserver2重新启动后,发现数据又恢复了过来
当文件较大时,会分两个chounk来存储,即chunk0、chunk1各存储一部分
恢复误删文件
[root@server4 dir2]# rm -fr passwd
[root@server4 dir2]# mfsgettrashtime .
.: 86400
[root@server4 dir2]# mkdir /mnt/mfsmeta/
[root@server4 dir2]# mfsmount -m /mnt/mfsmeta/ -H mfsmaster
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@server4 dir2]# cd /mnt/mfsmeta/trash/
[root@server4 trash]# find -name *passwd*
./004/00000004|dir1|passwd
./005/00000005|dir2|passwd
./007/00000007|dir2|passwd
[root@server4 trash]# mv ./007/00000007\|dir2\|passwd undel/
[root@server4 trash]# cd /mnt/mfs/dir2/
[root@server4 dir2]# ls