centos环境下部署moosefs(MFS)分布式文件系统
MFS简介
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连,分布式文件系统的实际基于客户机/服务器模式。目前常见的分布式文件系统有很多种,比如Hadoop、Moosefs、HDFS、FastDFS、Glusterfs、PNFS(Parallel NFS)、Lustre、TFS、GFS等等一系列。在众多的分布式文件系统解决方案中,MFS是搭建比较简单、使用起来也不需要过多的修改web程序,非常方便。
1、MooseFS是什么
MooseFS(即Moose File System,简称MFS)是一个具有容错性的网络分布式文件系统,它将数据分散存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本,对于访问MFS的客户端或者用户来说,整个分布式网络文件系统集群看起来就像一个资源一样,也就是说呈现给用户的是一个统一的资源。
MooseFS就相当于UNIX的文件系统(类似ext3、ext4、nfs),它是一个分层的目录树结构。MFS支持FUSE(用户空间文件系统Filesystem in Userspace,简称FUSE),客户端挂载后可以作为一个普通的Unix文件系统使用MooseFS。MFS可支持文件自动备份的功能,提高可用性和高扩展性。MogileFS不支持对一个文件内部的随机或顺序读写,因此只适合做一部分应用,如图片服务,静态HTML服务、文件服务器等,这些应用在文件写入后基本上不需要对文件进行修改,但是可以生成一个新的文件覆盖原有文件。1)高可靠性,每一份数据可以设置多个备份(多分数据),并可以存储在不同的主机上
2)高可扩展性,可以很轻松的通过增加主机的磁盘容量或增加主机数量来动态扩展整个文件系统的存储量 3)高可容错性,可以通过对mfs进行系统设置,实现当数据文件被删除后的一段时间内,依旧存放于主机的回收站中,以备误删除恢复数据 4)高数据一致性,即使文件被写入、访问时,依然可以轻松完成对文件的一致性快照 5)通用文件系统,不需要修改上层应用就可以使用(那些需要专门api的dfs很麻烦!)。 6)可以在线扩容,体系架构可伸缩性极强。(官方的case可以扩到70台了!) 7)部署简单。(sa们特别高兴,领导们特别happy!) 8)可回收在指定时间内删除的文件,即可以设置删除文件的空间回收时间("回收站"提供的是系统级别的服务,不怕误操作了,提供类似oralce 的闪回等高级dbms的即时回滚特性!),命令"mfsgettrashtime filename" 9)提供web gui监控接口。 10)提高随机读或写的效率(有待进一步证明)。 11)提高海量小文件的读写效率(有待进一步证明)3、MooseFS的优点
1)部署简单,轻量、易配置、易维护
2)易于扩展,支持在线扩容,不影响业务,体系架构可伸缩性极强(官方的case可以扩到70台) 3)通用文件系统,不需要修改上层应用就可以使用(比那些需要专门api的dfs方便多了)。 4)以文件系统方式展示:如存图片,虽然存储在chunkserver上的数据是二进制文件,但是在挂载mfs的client端仍旧以图片文件形式展示,便于数据备份 5)硬盘利用率高。测试需要较大磁盘空间 6)可设置删除的空间回收时间,避免误删除文件丢失就恢复不及时影响业务 7)系统负载,即数据读写分配到所有的服务器上 8)可设置文件备份的副本数量,一般建议3份,未来硬盘容量也要是存储单份的容量的三倍4、MooseFS的缺点
1)master目前是单点(虽然会把数据信息同步到备份服务器,但是恢复需要时间,因此,会影响上线,针对这个问题,可以通过DRBD+Keeaplived方案或者DRBD+Inotify方案解决),master和backup之间的同步,类似mysql的主从不同。
2)master服务器对主机的内存要求略高 3)默认metalogger复制元数据时间较长(可调整)5、MooseFS文件系统组成及原理
MFS文件的读写流程图


MFS组件
1)管理服务器managing server简称(master):
这个组件的角色是管理整个mfs文件系统的主服务器,除了分发用户请求外,还用来存储整个文件系统中每个数据文件的metadata信息,metadate(元数据)信息包括文件(也可以是目录,socket,管道,块设备等)的大小,属性,文件的位置路径等,很类似lvs负载均衡的主服务器,不同的是lvs仅仅根据算法分发请求,而master根据内存里的metadata信息来分发请求,内存的信息会被实时写入到磁盘,这个master只能有一台处于激活的状态。Master记录着管理信息,比如:文件路径|大小|存储的位置(ip,port,chunkid)|份数|时间等,元数据信息存在于内存中,会定期写入metadata.mfs.back文件中,定期同步到metalogger,操作实时写入changelog.*.mfs,实时同步到metalogger中。master启动将metadata.mfs载入内存,重命名为metadata.mfs.back文件。
这个组件的作用是备份管理服务器master的变化的metadata信息日志文件,文件类型为changelog_ml.*.mfs。以便于在管理服务器出问题时,可以经过简单的操作即可让新的主服务器进行工作。这类似mysql主从同步,只不过它不像mysql从库那样在本地应用数据,而只是接受主服务器上文写入时记录的文件相关的metadata信息,这个backup,可以有一台或多台,它很类似lvs从负载均衡服务器
这个组件就是真正存放数据文件实体的服务器了,这个角色可以有多台不同的物理服务器或不同的磁盘及分区来充当,当配置数据的副本多于一份时,据写入到一个数据服务器后,会根据算法在其他数据服务器上进行同步备份。这有点类似lvs集群的RS节点,确切点说应该类似于hadoop的datanode节点数据存储的方式。
文件以chunk大小存储,每chunk最大为64M,小于64M的,该chunk的大小即为该文件大小(验证实际chunk文件略大于实际文件),超过64M的文件将被切分,以每一份(chunk)的大小不超过64M为原则;块的生成遵循规则:目录循环写入(00-FF 256个目录循环,step为2)、chunk文件递增生成、大文件切分目录连续。站点类似于hadoop的datanode当文件大于128M时便被分片为多个128M的分片分别存储到多个datanode节点上。而且文件可以有多份copy,当goal为1时,文件会被随机存到一台chunkserver上,当goal的数大于1时,copy会由master调度保存到不同的chunkserver上,goal的大小不要超过chunkserver的数量,否则多出的copy,不会有chunkserver去存,官方建议设置副本数为3。
这个组件就是挂载并使用mfs文件系统的客户端,当读写文件时,客户端首先会连接主管理服务器获取数据的metadata信息,然后根据得到的metadata信息,访问数据服务器读取或写入文件实体,mfs客户端通过fuse mechanism实现挂载mfs文件系统的,因此,只有系统支持fuse,就可以作为客户端访问mfs整个文件系统,所谓的客户端并不是网站的用户,而是前端访问文件系统的应用服务器,如web
由于用户数量的不断攀升,对访问量大的应用实现了可扩展、高可靠的集群部署(即lvs+keepalived的方式),但仍然有用户反馈访问慢的问题。通过排查个服务器的情况,发现问题的根源在于共享存储服务器NFS。在我这个网络环境里,N个服务器通过NFS方式共享一个服务器的存储空间,使得NFS服务器不堪重负。察看系统日志,全是NFS服务超时之类的报错。一般情况下,当NFS客户端数目较小的时候,NFS性能不会出现问题;一旦NFS客户端数目过多,并且是那种读写都比较频繁的操作,所得到的结果就不是我们所期待的。
NFS虽然使用简单,但当NFS客户端访问量大时,通过NFS方式共享一个服务器的存储空间,使得NFS服务器不堪重负,并且执行读写都比较频繁的操作会出现意外的错误,对于高可靠的集群部署是有挑战的。这种架构除了性能问题而外,还存在单点故障,一旦这个NFS服务器发生故障,所有靠共享提供数据的应用就不再可用,尽管用rsync方式同步数据到另外一个服务器上做NFS服务的备份,但这对提高整个系统的性能毫无帮助。基于这样一种需求,我们需要对NFS服务器进行优化或采取别的解决方案,然而优化并不能对应对日益增多的客户端的性能要求,因此唯一的选择只能是采取别的解决方案:比如按照业务分成多个组的nfs服务或者使用分布式文件系统等。选择MFS分布式文件系统来作为共享存储服务器,主要考虑如下:
1)实施起来简单。MFS的安装、部署、配置相对于其他几种工具来说,要简单和容易得多。 2)不停服务扩容。MFS框架做好后,随时增加服务器扩充容量;扩充和减少容量皆不会影响现有的服务。注:hadoop也实现了这个功能。 3)恢复服务容易。除了MFS本身具备高可用特性外,手动恢复服务也是非常快捷的分布式文件系统MFS部署
| 主机名 | IP地址 | mfs角色 |
| mfsmaster | 192.168.80.171 | mfs master |
| mfsbackup | 192.168.80.172 | mfs metalogger |
| mfschunkserver1 | 192.168.80.173 | mfs chunkserver |
| mfschunkserver2 | 192.168.80.174 | mfs chunkserver |
| mfschunkserver3 | 192.168.80.175 | mfs chunkserver |
| mfsclient | 192.168.80.176 | mfs client |
| mfsmaster.goser.com | 192.168.80.180 | 提供mfs集群master节点的vip,做mfsbacku切换成master使用 |
[root@mfsmaster ~]# vim /etc/hosts 192.168.80.171 mfsmaster 192.168.80.172 mfsbackup 192.168.80.173 mfschunkserver1 192.168.80.174 mfschunkserver2 192.168.80.175 mfschunkserver3 192.168.80.180 mfsmaster.goser.com
2、mfsmaster部署
下载mfs对应的软件包,下载地址为:https://github.com/moosefs/moosefs/releases 或http://ppa.moosefs.com/src/ 这里下载mfs的版本为moosefs-3.0.101.tar.gz
对master服务器来说,资源要求就是内存大小了,为了整个系统访问更快,mfs会把所有反问的元数据metadata信息放在内存中提供给用户访问。因此,当文件数量增加时,内存使用量机会增加。根据官方的说法,处理1百万个文件chunkservers。大概需要300M的内存空间。据此,推算出如果未来要处理1亿个文件chunksevers。大概需要30G的内存空间。
部署mfsmaster
#创建master端的vip做msf集群的mfsmaster服务使用 [root@mfsmaster mfs]# cd /etc/sysconfig/network-scripts/ [root@mfsmaster network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0 [root@mfsmaster network-scripts]# vim ifcfg-eth0:0 DEVICE=eth0:0 ..... IPADDR=192.168.80.180 NAME="System eth0:0" [root@mfsmaster network-scripts]# ifup eth0:0 [root@mfsmaster network-scripts]# cd /tools/ [root@mfsmaster tools]# wget http://ppa.moosefs.com/src/moosefs-3.0.101-1.tar.gz [root@linux-node1 tools]# tar xf moosefs-3.0.101-1.tar.gz #创建mfs服务对应的用户,接下来安装mfs的时候会用到 [root@linux-node1 tools]# useradd -u 505 mfs -s /sbin/nologin -M #安装mfs master服务,去掉chunkserver、client、metalogger服务 [root@linux-node1 tools]# cd moosefs-3.0.101 [root@linux-node1 moosefs-3.0.101]# ./configure --prefix=/application/moosefs-3.0.101 --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount --disable-mfsmetalogger #安装的时候如果出现fuse、zlib错误的话,安装fuse-devel和zlib-devel即可(yum install fuse-devel zlib-devel -y),如果没有报错说明这些工具包已经存在 [root@linux-node1 moosefs-3.0.101]# make && make install [root@linux-node1 moosefs-3.0.101]# ln -s /application/moosefs-3.0.101/ /application/mfs #修改mfsmaster配置文件,使mfsmaster配置生效 [root@mfsmaster ~]# cd /application/mfs/etc/mfs/ [root@linux-node1 mfs]# cp mfsexports.cfg.sample mfsexports.cfg [root@linux-node1 mfs]# cp mfsmaster.cfg.sample mfsmaster.cfg #mfsmaster.cfg只要修改MASTER-HOST=mfsmaster.goser.com,其他配置参数暂时不需要修改,修改nfsexports.cfg,对访问mfs集群的权限做调整如下: [root@linux-node1 mfs]# vim mfsexports.cfg # Allow everything but "meta". 192.168.80.0/24 / rw,alldirs,mapall=mfs:mfs,password=111111 # Allow "meta". * . rw #启动mfsmaster服务,报如下错误.说明metadata文件无法初始化 [root@linux-node1 mfs]# /application/mfs/sbin/mfsmaster start .... init: metadata manager failed !!! error occurred during initialization - exiting #调整metadata.mfs后再1启动mfsmaster即可。9419端口监听metalogger服务,9420端口监听chunkserver服务,9421端口监听client连接 [root@mfsmaster mfs]# cp var/mfs/metadata.mfs.empty var/mfs/metadata.mfs [root@linux-node1 mfs]# /application/mfs/sbin/mfsmaster start master <-> metaloggers module: listen on *:9419 master <-> chunkservers module: listen on *:9420 main master server module: listen on *:9421 #如果启动mfsmaster服务时报权限不足的时,可以对mfs用户授予mfs应用的权限([root@linux-node1 ~]# chown mfs.mfs -R /application/mfs/) #添加mfs环境变量到profile文件中 [root@linux-node1 ~]# echo "export PATH=/application/mfs/sbin/:/application/mfs/bin:$PATH" >>/etc/profile [root@linux-node1 ~]# source /etc/profile #设置mfsmaster服务和mfscgiserv服务开启自启动 [root@linux-node1 ~]# echo "/application/mfs/sbin/mfsmaster start" >> /etc/rc.local [root@linux-node1 ~]# echo "/application/mfs/sbin/mfscgiserv start" >> /etc/rc.local
启动mfs的web监控界面
[root@mfsmaster ~]# /application/mfs/sbin/mfscgiserv start lockfile created and locked starting simple cgi server (host: any , port: 9425 , rootpath: /application/moosefs-3.0.101/share/mfscgi)
访问192.168.80.180:9425界面如下:

3、metalogger热备服务器部署
官方提供的这个热备方案不是很好,当mfsmaster服务宕掉的话,切到metalogger服务器上也不会立即生效成mfsmaster服务,还是需要对mfs存储做初始化才可生效(这就需要一些时间后才能将metalogger服务提升为mfsmaster服务),而且作为热备服务器的配置要和master基本一致,这就相对来说浪费了资源。如果这样的话,不如直接使用rsysnc方式将mfsmaster上metadata和changelog数据备份下来,带mfsmaster服务出现问题后直接恢复备份的数据到新部署的mfsmaster服务器上。当然也可用drbd+heartbeat的方式让mfsmaster和metalogger服务器做数据一致性同步,当mfsmaster出现问题,直接在metalogger服务上直接启动mfsmaster服务即可。
部署metalogger服务
[root@mfsbackup tools]# useradd -u 505 -s /sbin/nologin -M mfs [root@mfsbackup tools]# tar xf moosefs-3.0.101-1.tar.gz [root@mfsbackup tools]# cd moosefs-3.0.101 #这里在做./configure的时候,保留mfsmaster和mfscgiserv,当master切过来的时,可以启动mfsmaster服务,让热备服务做主服务 [root@mfsbackup moosefs-3.0.101]# ./configure --prefix=/application/moosefs-3.0.101 --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount [root@mfsbackup moosefs-3.0.101]# make && make install root@mfsbackup moosefs-3.0.101]# ln -s /application/moosefs-3.0.101 /application/mfs [root@mfsbackup ~]# cd /application/mfs/etc/mfs/ [root@mfsbackup mfs]# cp mfsmetalogger.cfg.sample mfsmetalogger.cfg #修改mfsmetalogger.cfg配置文件中定义的MASTER_HOST主机地址和mfsmaster定义的vip地址对应的主机名mfsmaster.goser.com保持一致 [root@mfsbackup mfs]# vim mfsmetalogger.cfg # MASTER_HOST = mfsmaster.goser.com [root@mfsbackup mfs]# /application/mfs/sbin/mfsmetalogger start #如果启动metalogger服务的时候报权限的问题,可以对var/mfs目录授予mfs用户的权限([root@mfsbackup ~]# chown mfs.mfs -R /application/mfs/var/mfs/) #设置mfsmetalogger的环境变量到profile文件中 [root@mfsbackup ~]# echo "export PATH=/application/mfs/sbin:/application/mfs/bin:$PATH" >>/etc/profile [root@mfsbackup ~]# source /etc/profile #查看metalogger服务的启动情况 [root@mfsbackup ~]# netstat -an|grep -i est Active Internet connections (servers and established) tcp 0 0 192.168.80.172:44966 192.168.80.171:9419 ESTABLISHED #设置metalogger服务开机自启动 [root@mfsbackup ~]# echo "/application/mfs/sbin/mfsmetalogger start" >>/etc/rc.local
4、chunkserver部署
部署chunkserver
[root@mfschunkserver1 ~]# useradd -u 505 -s /sbin/nologin -M mfs [root@mfschunkserver1 ~]# cd /tools/ [root@mfschunkserver1 ~]# tar xf moosefs-3.0.101-1.tar.gz [root@mfschunkserver1 ~]# cd moosefs-3.0.101 [root@mfschunkserver1 ~]# ./configure --prefix=/application/moosefs-3.0.101 --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmetalogger --disable-mfsmount --disable-mfscgiserv [root@mfschunkserver1 ~]# make && make install [root@mfschunkserver1 ~]# ln -s /application/moosefs-3.0.101 /application/mfs
添加一块2G硬盘做测试用,挂载用于mfs文件系统的磁盘
#使用fdisk工具对新加入的磁盘做分区处理 [root@mfschunkserver1 ~]# fdisk /dev/sdb #格式化新创建的分区 [root@mfschunkserver1 ~]# mkfs.ext4 /dev/sdb1 #创建挂载目录并将新的分区添加到磁盘分区表中 [root@mfschunkserver1 ~]# blkid /dev/sda1: UUID="586c5d14-ab2c-4e82-86b7-2474af10949b" TYPE="ext4" /dev/sda2: UUID="83f36e97-9bef-4a3c-bf5c-1b10fad6eed0" TYPE="swap" /dev/sda3: UUID="c7a747f2-9148-45ff-9adf-69037b8e61df" TYPE="ext4" /dev/sdb1: UUID="14f62101-0d67-4456-8d7b-531d662af5d7" TYPE="ext4" [root@mfschunkserver1 ~]# vim /etc/fstab UUID=14f62101-0d67-4456-8d7b-531d662af5d7 /mfsdata ext4 defaults 0 0 #挂载新创建的分区 [root@mfschunkserver1 ~]# mount -a [root@mfschunkserver1 ~]# df -h /dev/sdb1 2.0G 3.0M 1.9G 1% /mfsdata
如果mfsmaster对应的主机名不是mfsmaster,那么就需要修改mfschunkserver.cfg(同样如果需要修改chunkserver监听的端口一样也要改配置文件)
[root@mfschunkserver1 mfs]# cp mfschunkserver.cfg.sample mfschunkserver.cfg [root@mfschunkserver1 mfs]# cp mfshdd.cfg.sample mfshdd.cfg [root@mfschunkserver1 mfs]# vim mfschunkserver.cfg # MASTER_HOST = mfsmaster.goser.com # MASTER_PORT = 9420 # CSSERV_LISTEN_HOST = * # CSSERV_LISTEN_PORT = 9422
修改mfshdd.cfg配置文件,添加mfs的共享分区,可以添加多个
[root@mfschunkserver1 mfs]# vim mfshdd.cfg /mfsdata
授权mfs用户管理/mfsdata挂载点
[root@mfschunkserver1 ~]# chown mfs.mfs -R /mfsdata/
启动mfschunkserver,这时候挂载的/mfsdata目录便被初始化了,在mfs监控界面中看到已经使用了200多M,这是由于chunkserver默认会保留256的空间,当chunkserver存储空间小于256M就不提供数据存储了。
[root@mfschunkserver1 ~]# /application/mfs/sbin/mfschunkserver start main server module: listen on *:9422 no charts data file - initializing empty charts mfschunkserver daemon initialized properly [root@mfschunkserver1 ~]# cd /mfsdata/ [root@mfschunkserver1 mfsdata]# ls 00 0F 1E 2D 3C 4B 5A 69 78 87 96 A5 B4 C3 D2 E1 F0 FF 01 10 1F 2E 3D 4C 5B 6A 79 88 97 A6 B5 C4 D3 E2 F1 lost+found 02 11 20 2F 3E 4D 5C 6B 7A 89 98 A7 B6 C5 D4 E3 F2 03 12 21 30 3F 4E 5D 6C 7B 8A 99 A8 B7 C6 D5 E4 F3 04 13 22 31 40 4F 5E 6D 7C 8B 9A A9 B8 C7 D6 E5 F4 05 14 23 32 41 50 5F 6E 7D 8C 9B AA B9 C8 D7 E6 F5 06 15 24 33 42 51 60 6F 7E 8D 9C AB BA C9 D8 E7 F6 07 16 25 34 43 52 61 70 7F 8E 9D AC BB CA D9 E8 F7 08 17 26 35 44 53 62 71 80 8F 9E AD BC CB DA E9 F8 09 18 27 36 45 54 63 72 81 90 9F AE BD CC DB EA F9 0A 19 28 37 46 55 64 73 82 91 A0 AF BE CD DC EB FA 0B 1A 29 38 47 56 65 74 83 92 A1 B0 BF CE DD EC FB 0C 1B 2A 39 48 57 66 75 84 93 A2 B1 C0 CF DE ED FC 0D 1C 2B 3A 49 58 67 76 85 94 A3 B2 C1 D0 DF EE FD 0E 1D 2C 3B 4A 59 68 77 86 95 A4 B3 C2 D1 E0 EF FE
添加chunkserver环境变量和开启自启动
[root@mfschunkserver1 mfsdata]# echo "export PATH=/application/mfs/sbin:/application/mfs/bin:$PATH" >>/etc/profile [root@mfschunkserver1 mfsdata]# source /etc/profile [root@mfschunkserver1 mfsdata]# echo "/application/mfs/sbin/mfschunkserver start" >>/etc/rc.local
5、mfs客户端部署
1)、mfs client安装依赖与系统包fuse,通过yum方式安装(也可以源码安装)。并将fuse添加到系统内核中
[root@mfsclient ~]# yum -y install fuse fuse-devel [root@mfsclient ~]# modprobe fuse #将添加的fuse添加到开机自启动中 [root@mfsclient ~]# echo "modprobe fuse" >>/etc/rc.local
2)、安装mfsclient依赖包zlib,没装这个zlib包的话,在./configure mfsclient的时候会报错
[root@mfsclient ~]# yum install zlib-devel -y
3)、部署mfsclient
[root@mfsclient ~]# useradd -u 505 -s /sbin/nologin -M mfs [root@mfsclient ~]# cd /tools/ [root@mfsclient tools]# tar xf moosefs-3.0.101-1.tar.gz [root@mfsclient tools]# cd moosefs-3.0.101 [root@mfsclient moosefs-3.0.101]# ./configure --prefix=/application/moosefs-3.0.101 --with-default-user=mfs --with-default-group=mfs --enable-mfsmount [root@mfsclient moosefs-3.0.101]# make && make install [root@mfsclient moosefs-3.0.101]# ln -s /application/moosefs-3.0.101 /application/mfs #设置mfsclient命令的环境变量 [root@mfsclient moosefs-3.0.101]# echo "export PATH=/application/mfs/bin:$PATH" >>/etc/profile [root@mfsclient moosefs-3.0.101]# source /etc/profile
4)、创建挂载mfs集群的数据目录和回收站目录
#创建挂载mfs集群的数据目录 [root@mfsclient ~]# mkdir /mnt/mfs #创建挂载mfs集群的回收站目录 [root@mfsclient ~]# mkdir /mnt/mfs-trash
5)、开始挂载mfs集群
#挂载mfs数据存储的方式可以使用交换式密码输入和非交互式 #交互式密码挂载mfs [root@mfsclient ~]# /application/mfs/bin/mfsmount /mnt/mfs -H mfsmaster.goser.com -p #非交互式密码挂载mfs [root@mfsclient ~]# /application/mfs/bin/mfsmount /mnt/mfs -H mfsmaster.goser.com -o mfspassword=111111 #挂载mfs集群的回收站 [root@mfsclient ~]# /application/mfs/bin/mfsmount -H mfsmaster.goser.com -m /mnt/mfs-trash/ [root@mfsclient mfs]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 14G 1.6G 11G 13% / tmpfs 364M 0 364M 0% /dev/shm /dev/sda1 477M 35M 417M 8% /boot mfsmaster:9421 2.8G 519M 2.3G 19% /mnt/mfs
6、向mfs集群中写入数据
[root@mfsclient mfs]# cd /mnt/mfs
#可以在mfs挂载目录下设计多级目录,当一个目录太大了可以分离成另一组mfs集群
[root@mfsclient mfs]# mkdir dir{1..3}
#向mfs集群写入数据,新版本mfs默认写书的数据以两个副本的方式存储,而旧版本的mfs默认是1个副本的方式存储
[root@mfsclient mfs]# echo "test mfs" >> dir2/test1.txt
[root@mfsclient mfs]# mfsfileinfo dir2/test1.txt
dir2/test1.txt:
chunk 0: 0000000000000008_00000001 / (id:8 ver:1)
copy 1: 192.168.80.173:9422 (status:VALID)
copy 2: 192.168.80.175:9422 (status:VALID)
#根据官方的建议,对chunkserver应该在3台以上,副本数应该在3个或以上。现在对写入的数据设置副本数为3。比如对dir2目录存储到mfs设置的副本数为3
[root@mfsclient mfs]# mfssetgoal -r 3 dir2/
#这时候再查看dir2/test1.txt文件的副本数变成了3
[root@mfsclient mfs]# mfsfileinfo dir2/test1.txt
dir2/test1.txt:
chunk 0: 0000000000000008_00000001 / (id:8 ver:1)
copy 1: 192.168.80.173:9422 (status:VALID)
copy 2: 192.168.80.174:9422 (status:VALID)
copy 3: 192.168.80.175:9422 (status:VALID)
#测试mfs存储的数据是否在大于64M要分片处理
#当文件大小在63M的时候没有被分片
[root@mfsclient mfs]# dd if=/dev/zero of=dir2/63M.jpg bs=1M count=63
[root@mfsclient mfs]# mfsfileinfo dir2/63M.jpg
dir2/63M.jpg:
chunk 0: 0000000000000009_00000001 / (id:9 ver:1)
copy 1: 192.168.80.173:9422 (status:VALID)
copy 2: 192.168.80.174:9422 (status:VALID)
copy 3: 192.168.80.175:9422 (status:VALID)
#当文件大小在65M时被分成两个分片
[root@mfsclient mfs]# dd if=/dev/zero of=dir2/65M.jpg bs=1M count=65
[root@mfsclient mfs]# mfsfileinfo dir2/65M.jpg
dir2/65M.jpg:
chunk 0: 000000000000000A_00000001 / (id:10 ver:1)
copy 1: 192.168.80.173:9422 (status:VALID)
copy 2: 192.168.80.174:9422 (status:VALID)
copy 3: 192.168.80.175:9422 (status:VALID)
chunk 1: 000000000000000B_00000001 / (id:11 ver:1)
copy 1: 192.168.80.173:9422 (status:VALID)
copy 2: 192.168.80.174:9422 (status:VALID)
copy 3: 192.168.80.175:9422 (status:VALID)
7、对误删的文件做恢复处理
#测试查出了dir2/test1.txt文件 [root@mfsclient mfs]# rm -f dir2/test1.txt [root@mfsclient mfs]# ls dir2/ 63M.jpg 65M.jpg #找回dir2/test1.txt,只要查找到test1.txt被删除的位置,然后将这个位置文件移到undel目录即可恢复 [root@mfsclient mfs]# find /mnt/mfs-trash/ -name "*test1*" /mnt/mfs-trash/trash/00D/0000000D|dir2|test1.txt [root@mfsclient mfs]# mv /mnt/mfs-trash/trash/00D/0000000D\|dir2\|test1.txt /mnt/mfs-trash/trash/undel/ [root@mfsclient mfs]# ls dir2/ 63M.jpg 65M.jpg test1.txt
8、MFS系统可以利用mfsmakesnapshot工具给文件或者目录做快照(snapshot)
#在做快照的时候,特别要注意的是:不能将快照放到MFS文件系统之外的其他文件系统下,快照文件和源文件必须要在同一个MFS文件系统下(即路径一致)
[root@mfsclient mfs]# mfsmakesnapshot dir2/test1.txt dir2/test1.txt-snapshot
[root@mfsclient mfs]# mfsfileinfo dir2/test1.txt
dir2/test1.txt:
chunk 0: 0000000000000008_00000001 / (id:8 ver:1)
copy 1: 192.168.80.173:9422 (status:VALID)
copy 2: 192.168.80.174:9422 (status:VALID)
copy 3: 192.168.80.175:9422 (status:VALID)
[root@mfsclient mfs]# mfsfileinfo dir2/test1.txt-snapshot
dir2/test1.txt-snapshot:
chunk 0: 0000000000000008_00000001 / (id:8 ver:1)
copy 1: 192.168.80.173:9422 (status:VALID)
copy 2: 192.168.80.174:9422 (status:VALID)
copy 3: 192.168.80.175:9422 (status:VALID)
#通过mfsfileinfo命令可以查看创建出来的文件快照,它只占用了一个inode,并不占用磁盘空间,就像ln命令创建硬链接类似!!!!
#mfsmakesnapshot是一次执行中整合了一个或者一组文件的副本,而且对这些文件的源文件进行任何修改都不会影响源文件的快照,就是说任何对源文件的操作,如写入操作,将会不修改副本。
#mfsmakesnapshot可以实现这个快照功能,当有多个源文件时,他们的快照会被加入到同一个目标文件中,通过对比快照的测试,可以发现快照的本质:
1)一个MFS系统下的文件做快照后,查看两个文件的块信息,他们是同一个块。接着,把原文件删除,删除源文件后(最初会留在回收站上,但过一段时间后回收站的文件也删除了),快照
文件仍然存储,并且可以访问。使用mfsfileinfo查看,发现还是原来的块。
2)对一个文件做快照后,查看两个文件的块信息,发现是同一个块。把原文件修改后,发现原文件的使用块信息变了,即使用了一个新块。而快照文件仍然使用原来的块,保持文件内容不变。
9、MFS根据业务挂载目录
#Moosefs系统支持客户端根据需要挂载对应子目录;默认不指定-S的话会挂载到根目录(/)下,当通过df –sh查看空间使用used显示的是当前整个mfs系统的硬盘使用情况; #在Moosefs的管理中,可以找一台机器作为管理型的client端,在master管理节点的配置 #文件mfsexports.cfg中限制只有该台机器可以挂载到根目录下,同时也可限制只有该台机器 #可以挂载metadata目录(恢复误删除时可用到),而其他普通client端,则根据不同业务的 #需要让管理client端为其创建独立用途的目录,分别挂载到对应的子目录下,这样就可以细化管理控制权限。 #在master管理节点修改mfsexports.cfg的配置如下: [root@mfsmaster mfs]# vim mfsexports.cfg 192.168.80.176 / rw,alldirs,mapall=mfs:mfs,password=111111 192.168.80.0/24 /tech rw,mapall=mfs:mfs 192.168.80.0/24 /web ro,mapall=mfs:mfs [root@mfsmaster mfs]# /application/mfs/sbin/mfsmaster reload #在客户机192.168.80.176上挂载MFS文件系统的根目录,命令如下(挂载后,df -h或mount命令都能查看到挂载信息) [root@mfsclient ~]# /application/mfs/bin/mfsmount /mnt/mfs -H mfsmaster.goser.com -o mfspassword=111111 [root@mfsclient ~]# /application/mfs/bin/mfsmount -H mfsmaster.goser.com -m /mnt/mfs-trash/ #在根目录/mnt/mfs下创建mfs系统子目录tech和web,这些子目录要按照mfsmaster上 # mfsexports.cfg配置文件中定义的子目录一致 [root@mfsclient ~]# cd /mnt/mfs [root@mfsclient mfs]# mkdir tech [root@mfsclient mfs]# mkdir web #在其他地址在192.168.80.0/24网段的客户端主机上挂载MFS文件系统的子目录 #这个挂载的子目录tech是可读可写到mfs系统中的 [root@mfsclient02 ~]# /application/mfs/bin/mfsmount /opt/mfssubdata01 -H mfsmaster.goser.com -S /tech #这个挂载的子目录web是对mfs系统只读权限,是无法写入数据到mfs系统中的 [root@mfsclient02 ~]# /application/mfs/bin/mfsmount /opt/mfssubdata01 -H mfsmaster.goser.com -S /web [root@mfsclient02 ~]# df -h mfsmaster:9421 3.7G 777M 3.0G 21% /opt/mfssubdata02 mfsmaster:9421 3.7G 777M 3.0G 21% /opt/mfssubdata01 #Moosefs可以节省空间 通过测试发现,拷贝到mfs目录下的文件大小比ext3下的小了很多,开始以为是少同步了一些文件,于是又将mfs下的所有文件拷回到ext3下,发现大小和之前的一致。 所以说,mfs对小文件(测试文件为8K左右)存储空间的节省非常明显,可以节省一半的空间。 对于大文件存储,mfs同样可以节省空间。拷贝了一个1.7G文件到mfs下,大小为1.6G。
10、MFS元数据损坏后的恢复(简单解决Master单点故障的瓶颈)
当master管理节点(即元数据服务器)出现故障导致元数据损坏后,可以通过Metalogger元数据日志服务器上的备份数据进行恢复! 通常元数据有两部分的数据: 1)主要元数据文件metadata.mfs,当mfsmaster运行的时候会被命名为metadata.mfs.back 2)元数据改变日志changelog.*.mfs,存储了过去的N小时的文件改变。主要的元数据文件需要定期备份,备份的频率取决于取决于多少小时changelogs储存。 元数据changelogs应该实时的自动复制。自从MooseFS 1.6.5,这两项任务是由mfsmetalogger守护进程做的。 元数据损坏是指由于各种原因导致master上的metadata.mfs数据文件不可用。一旦元数据损坏,所有的存储在moosefs上的文件都不可使用。 一旦master管理节点出现崩溃(比如因为主机或电源失败),需要最后一个元数据日志changelog并入主要的metadata中。 #这里模拟生产环境中使用rsync方式备份master上的metadata和changlog到备份服务器上 #待master宕掉的时候,然后从备份服务器上宕下以前备份的元数据到新部署的master上 #当然也可以从metalogger服务器上备份元数据到备份服务器上,待master当掉后从备份服务器上挡下元数据来恢复 #现在开始模拟master宕机,先备份 [root@mfsmaster mfs]# tar czf mfsmaster-bak.tar.gz changelog.* metadata.mfs.* [root@mfsmaster mfs]# mv mfsmaster-bak.tar.gz /opt/ [root@mfsmaster mfs]# mfsmaster stop [root@mfsmaster mfs]# rm -fr * #然后重新启动master将报错: [root@mfsmaster ~]# mfsmaster start open files limit has been set to: 16384 working directory: /application/moosefs-3.0.101/var/mfs lockfile created and locked initializing mfsmaster modules ... exports file has been loaded mfstopology configuration file (/application/moosefs-3.0.101/etc/mfstopology.cfg) not found - using defaults loading metadata ... can't find metadata.mfs - try using option '-a' init: metadata manager failed !!! error occurred during initialization - exiting #将备份元数据放到var/mfs下重新启动master,还是报错 [root@mfsmaster ~]# cd /opt/ [root@mfsmaster opt]# tar xf mfsmaster-bak.tar.gz -C /application/mfs/var/mfs/ [root@mfsmaster mfs]# mfsmaster start open files limit has been set to: 16384 working directory: /application/moosefs-3.0.101/var/mfs lockfile created and locked initializing mfsmaster modules ... exports file has been loaded mfstopology configuration file (/application/moosefs-3.0.101/etc/mfstopology.cfg) not found - using defaults loading metadata ... can't find metadata.mfs - try using option '-a' init: metadata manager failed !!! error occurred during initialization - exiting mfs的操作日志都记录到changelog.0.mfs里面。changelog.0.mfs每小时合并一次到metadata.mfs中 此时应该利用mfsmetarestore命令合并元数据changelogs,可以用自动恢复模式命令"mfsmetarestore –a" [root@mfsmaster mfs]# mfsmetarestore -a #然后需要以-a方式启动master [root@mfsmaster mfs]# mfsmaster -a [root@mfsmaster mfs]# netstat -lntup|grep 94 tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 54566/mfsmaster tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 54566/mfsmaster tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 54566/mfsmaster tcp 0 0 0.0.0.0:9425 0.0.0.0:* LISTEN 51548/python #通过metalogger服务器提升为master来恢复master单点故障 #首先将前期备份的master端的配置文件mfsmaster.cfg mfsexports.cfg和master上的vip配置文件ifcfg-eth0:0拷贝到metalogger服务器上 #使用自动恢复模式命令"mfsmetarestore -a" [root@mfsbackup mfs]# /application/mfs/sbin/mfsmetarestore -a #然后需要以-a方式启动master,这样metalogger备份服务器就会被提升为mfsmaster服务器了 [root@mfsbackup mfs]# /application/mfs/sbin/mfsmaster -a
浙公网安备 33010602011771号