MooseFS,是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理server或单独diskpartition上,确保一份数据有多个备份副本,对于访问MFSclientuser来说,整个分布式网络文件系统集群看起来就像一个资源一样,从MFS对文件操作的情况看,相当于一个类unixFSext{3,4}nfs);

https://moosefs.com/index.html

特点:

分层的目录树结构;

存储支持POSIX标准的文件属性(权限、最后访问、修改时间);

支持特殊的文件,如:块设备、字符设备、管道、套接字、软硬链接;

支持基于IP和密码的访问方式;

高可靠性,每一份数据可设置多个副本,并可存储在不同的主机上;

高可扩展性,可通过增加主机增加主机数量或disk来动态扩展整个文件系统的存储量(尽量在前端加cache应用,而不是一味的扩充存储);

高可容错性,通过配置,当数据文件在删除后的一段时间内,仍存于主机的回收站中,以备恢复;

高数据一致性,即使文件被写入或访问,也可完成对文件的一致性快照;

优点:

轻量、易配置、易维护;

开发活跃、社区活跃、资料丰富;

扩容成本低,支持在线扩容(不影响业务);

以文件系统方式展示(例如图片,虽存在chunkserver上的是binary文件,但在挂载的mfs client仍以图片方式展示);

磁盘利用率较高,测试需要较大磁盘空间;

可设置删除文件的空间回收时间,避免误删文件丢失及恢复不及时影响业务;

系统负载,即数据rw分配到所有server上;

可设置文件备份的副本数量(一般建议3份);

缺点:

master是单点(虽会把数据信息同步到备份服务器,但恢复需要时间,会影响业务),解决:drbd+heartbeatdrbd+inotifymasterbackup之间的同步类似MySQL的主从同步;

master对主机的内存要求较高(所有metadata均加载在内存中);

backupmetalogger)复制metadata间隔时间较长(可调整);

应用场景:

大规模高并发的线上数据存储及访问(小文件、大文件);

大规模的数据处理,如:日志分析,小文件强调性能不用HDFShadoop);

LustrecephGlusterFSHDFSMogilefsFastDFSFreeNASMooseFS

MFS结构(4组件):

mastermanaging server,管理服务器,管理整个mfs的主服务器,master只能有一台处于工作状态,master除分发用户请求外,还用于存储整个FS中每个数据文件的metadatafile,directory,socket,pipe,device等的大小、属性、路径),类似LVS主服务器,LVS仅根据算法分发请求,而master根据内存中的metadata(会实时写入到disk)分发请求);

backupmetadata backupservermetalogger,元数据备份服务器,backup可有一台或多台,备份master的变化的metadata信息日志文件(changelog_ml.*.mfs),当master出问题简单操作即可让新主服务器进行工作,类似MySQL的主从同步(不像MySQL从库那样在本地应用数据,只接收master上文件写入时记录的与文件相关的metadata信息));

datadata serverchunk server,数据存储服务器,真正存放数据文件实体,这个角色可有多台不同的物理server或不同的diskpartition,当配置数据的副本多于一份时,当写入到一个数据服务器后,再根据算法同步备份到其它数据服务器上,类似LVS集群中的RS);

clientclient server,挂载并使用mfsclient,即前端访问FS的应用服务器,client首先会连接master获取数据的metadata,根据得到的metadata访问data server读取或写入文件实体,client通过FUSEmechanism实现挂载);

wKiom1j3GiTQAeoIAABCRfPfDzw134.jpg

wKioL1j3GjGzj-MxAABaV6jIfPQ082.jpg

高稳定性要求:

master(双电源分别接AB路电,机柜多的分开存放;多块disk使用raid1raid10,也可raid5rw慢));

backup(若确定在master失效后,用backup接管masterbackup应与master同等配置,另一方案是在master上使用heartbeat+drbd);

data(所有data server硬盘大小一致,否则io不均,生产下data至少3台以上);

  

操作:

 192.168.23.136mfsmaster

192.168.23.137mfsbackupmfsclient,两个角色)

192.168.23.138mfsdata

  

[root@mfsmaster ~]# vim /etc/hosts   #(三台主机hosts文件一致)

192.168.23.136  mfsmaster

192.168.23.137  mfsbackup

192.168.23.138  mfsdata

 mfsmaster

[root@mfsmaster ~]# groupadd mfs

[root@mfsmaster ~]# useradd -g mfs -s /sbin/nologin mfs

[root@mfsmaster ~]# yum -y install fuse-devel zlib-devel

 [root@mfsmaster ~]# tar xf mfs-1.6.27-5.tar.gz

[root@mfsmaster ~]# cd mfs-1.6.27

[root@mfsmaster mfs-1.6.27]# ./configure –help   #--disable-mfsmaster--disable-mfschunkserver--disable-mfsmount

[root@mfsmaster mfs-1.6.27]# ./configure --prefix=/ane/mfs-1.6.27 --with-default-user=mfs --with-default-group=mfs   #(完全安装,只在配置文件上区分)

[root@mfsmaster mfs-1.6.27]# make

[root@mfsmaster mfs-1.6.27]# make install

 [root@mfsmaster ane]# cp mfs/etc/mfs/mfsmaster.cfg.dist mfs/etc/mfs/mfsmaster.cfg

[root@mfsmaster ane]# vimmfs/etc/mfs/mfsmaster.cfg   #(按默认,9419用于master<-->metalogger9420用于master<-->chunkserver9421用于master<-->client

# MATOML_LISTEN_HOST = *

# MATOML_LISTEN_PORT = 9419

# MATOML_LOG_PRESERVE_SECONDS = 600

 # MATOCS_LISTEN_HOST = *

# MATOCS_LISTEN_PORT = 9420

 # MATOCL_LISTEN_HOST = *

# MATOCL_LISTEN_PORT = 9421

[root@mfsmaster ane]# cp mfs/etc/mfs/mfsexports.cfg.dist mfs/etc/mfs/mfsexports.cfg

[root@mfsmaster ane]# vimmfs/etc/mfs/mfsexports.cfg

#*                       /      rw,alldirs,maproot=0

*                       .       rw  #此处配置与文件误删后的恢复有关

192.168.23.0/24         /      rw,alldirs,mapall=mfs:mfs,password=passcode

 mfsexports.cfg注:

1列(格式:单ip*表示所有ipip段,如f.f.f.f-t.t.t.tip/netmaskip/netmask位数);

2列(/表示mfs根;.表示mfsdata文件系统);

3列(ro只读模式共享;rw读写模式共享;alldirs允许挂载任何指定的子目录;maproot映射为root或指定的用户;password指定client密码);

 [root@mfsmaster ane]# cd mfs/var/mfs/

[root@mfsmaster mfs]# cp metadata.mfs.empty metadata.mfs

 [root@mfsmaster mfs]# mfsmaster start   #(使用mfsmasterstop关闭,若用kill,无法正常启动时要用mfsmetastore修复)

[root@mfsmaster mfs]# mfscgiserv start   #mfs的图形监控,python编写)

http://192.168.23.136:9425

  wKiom1j3Gq6AGQA-AADXPzbI52o517.jpg

 mfsbackup

安装同mfsmaster

[root@mfsbackup ane]# cd mfs/etc/mfs/

[root@mfsbackup mfs]# cp mfsmetalogger.cfg.dist mfsmetalogger.cfg

[root@mfsbackup mfs]# vim mfsmetalogger.cfg   #(按默认,META_DOWNLOAD_FREQ元数据备份文件下载请求频率,默认为24h,即每隔一天从master上下载一个metadata.mfs.back文件,当mfsmaster故障时,metadata.mfs.back文件消失,若要恢复整个mfs,则需从backup取得文件,并结合日志文件changelog_ml_back.*.mfs一起才能恢复整个被损坏的分布式FSMASTER_HOST项已在hosts文件中指定)

# META_DOWNLOAD_FREQ = 24

# MASTER_HOST = mfsmaster

 [root@mfsbackup mfs]# mfsmetalogger start   #(只有进程无监听的端口)

[root@mfsbackup mfs]# ll /ane/mfs/var/mfs/   #(日志文件位置)

-rw-r-----. 1 mfs  mfs   0Apr 18 23:02 changelog_ml_back.0.mfs

-rw-r-----. 1 mfs  mfs   0Apr 18 23:02 changelog_ml_back.1.mfs

-rw-r--r--. 1 root root  8 Apr 18 22:47 metadata.mfs.empty

-rw-r-----. 1 mfs  mfs  95Apr 18 23:02 metadata_ml.mfs.back

-rw-r-----. 1 mfs  mfs  10Apr 18 23:04 sessions_ml.mfs

 [root@mfsbackup mfs]# netstat -an | grep ESTABLISHED

tcp       0      0 192.168.23.137:36622        192.168.23.136:9419         ESTABLISHED

 mfsdata

安装同mfsmaster

生产中至少3台以上;

[root@mfsdata ~]# df -h   #(用独立的磁盘放数据,生产上一般用raid1/raid10/raid5

/dev/sdb1       5.0G 138M  4.6G   3% /mfsdata

 [root@mfsdata ~]# cd /ane/mfs/etc/mfs/

[root@mfsdata mfs]# cp mfschunkserver.cfg.dist mfschunkserver.cfg

[root@mfsdata mfs]# cp mfshdd.cfg.dist mfshdd.cfg

[root@mfsdata mfs]# vim mfschunkserver.cfg   #(按默认)

[root@mfsdata mfs]# vim mfshdd.cfg   #(此文件配置挂载点)

/mfsdata

[root@mfsdata mfs]# chown -R mfs.mfs /mfsdata/

[root@mfsdata mfs]# mfschunkserver start

[root@mfsdata mfs]# ls /mfsdata/

00 0A  14  1E 28  32  3C 46  50  5A 64  6E  78 82  8C  96 A0  AA  B4 BE  C8  D2 DC  E6  F0  FA

01 0B  15  1F 29  33  3D 47  51  5B……

 [root@mfsdata mfs]# netstat -an | grepESTABLISHED

tcp       0      0 192.168.23.138:53956        192.168.23.136:9420         ESTABLISHED

wKioL1j3Gu_xk1bnAAB0EstCr7I068.jpg

注:#df -h的结果与web监控界面显示的不一样,相差256M,当mfs上的data空间剩余256m时将不会再存内容,masterdata申请空间是按最小256m申请的,低于256m将不再申请空间;

mfsclient(在mfsbackup上配置):

[root@mfsbackup mfs]# rpm -qa fuse   ##yum -y installfuse-devel

[root@mfsbackup mfs]# lsmod | grep fuse 

[root@mfsbackup mfs]# echo "modprobefuse" >> /etc/sysconfig/modules/fuse.modules   #(开机自动加载fuse,或echo "modprobefuse" >> /etc/rc.modules

[root@mfsbackup mfs]# chmod 755 !$

若报libfuse.so.2 cannot open shared object file……

#find / -name "libfuse.so.2"

#echo"/usr/local/lib/libfuse.so.2" >> /etc/ld.so.conf

#ldconfig

 [root@mfsbackup mfs]# mkdir /mnt/mfs

[root@mfsbackup mfs]# mfsmount -h

[root@mfsbackup mfs]# mfsmount /mnt/mfs/ -H 192.168.23.136 -o mfspassword=passcode   #(用-o mfspassword=指定密码,也可-p在交互模式下输入)

[root@mfsbackup mfs]# for i in `seq 10` ;do echo 123456 > test$i.txt ; done   #(查看masterchangelog.0.mfsbackupchangelog_ml.0.mfs变化情况)

[root@mfsdata mfs]# find /mfsdata -type f    #mfsdata上数据变化情况)

/mfsdata/04/chunk_0000000000000004_00000001.mfs

/mfsdata/.lock

/mfsdata/05/chunk_0000000000000005_00000001.mfs

/mfsdata/06/chunk_0000000000000006_00000001.mfs

/mfsdata/03/chunk_0000000000000003_00000001.mfs

/mfsdata/07/chunk_0000000000000007_00000001.mfs

/mfsdata/01/chunk_0000000000000001_00000001.mfs

/mfsdata/02/chunk_0000000000000002_00000001.mfs

/mfsdata/0A/chunk_000000000000000A_00000001.mfs

/mfsdata/08/chunk_0000000000000008_00000001.mfs

/mfsdata/09/chunk_0000000000000009_00000001.mfs

  

设备备份副本(在mfsclient操作即mfsbackup):

设置备份副本时,要在刚开始使用时设置好;

针对挂载点下的目录设置,不要对挂载点设置;

副本会同步到其它mfsdata

相关命令mfssetgoal、mfsgetgoal、  mfsfileinfo、   mfscheckfile

[root@mfsbackup mfs]# mfsfileinfo test1.txt  #(默认副本是1份)

test1.txt:

         chunk0: 0000000000000001_00000001 / (id:1 ver:1)

                   copy1: 192.168.23.138:9422

[root@mfsbackup mfs]# mfsgetgoal test1.txt

test1.txt: 1

[root@mfsbackup mfs]# for i in `seq 5` ; do mkdir a$i ; done   #(存文件尽可能放到不同的目录下,这样当某个目录占很大空间时,可单独划集群,否则无法拆分)

[root@mfsbackup mfs]# mfssetgoal -r 3 a1/

a1/:

 inodes with goal changed:               1

 inodes with goal not changed:           0

 inodes with permission denied:          0

[root@mfsbackup mfs]# mfsgetgoala1/test.txt

a1/test.txt: 3

[root@mfsbackup mfs]# mfsfileinfoa1/test.txt   #(此环境只一个mfsdata,在实际生产上三个以上dataserver就不会出现这个问题了)

大文件存放:

mfs的数据存放是分多个chunk,每个chunk大小为64m,一个文件若超过64m会占多个chunk

[root@mfsbackup mfs]# mfssetgoal -r 3 a2/

[root@mfsbackup mfs]# dd if=/dev/zero of=a2/63.img bs=1M count=63

[root@mfsbackup mfs]# dd if=/dev/zero of=a2/65.img bs=1M count=65

 设置文件删除后的回收时间:

默认864001day

[root@mfsbackup mfs]# mfsgettrashtime a2/63.img

[root@mfsbackup mfs]# mfssettrashtime -r 1200 a3/   #(对目录下的所有文件生效)

[root@mfsbackup mfs]# mfssettrashtime 1200 a2/65.img   #(公对某个文件生效)

[root@mfsbackup mfs]# rm -f a2/65.img

[root@mfsbackup mfs]# mkdir /mnt/mfs-trash

[root@mfsbackup mfs]# mfsmount /mnt/mfs-trash/ -m -H 192.168.23.136

[root@mfsbackup mfs]# mv /mnt/mfs-trash/trash/00000018|a2|65.img /mnt/mfs-trash/trash/undel/

验证mfs的容灾性:

1、依次将多个mfsdata停掉,在web监控上查看状态,并查看数据是否存在(备份副本设为3);

2、模拟用master上备份的metadata恢复宕机的master#mfsmetarestore -a   #mfsmaster-side

#umount -lf /mnt/mfs ; mfsmount -H192.168.23.136 -o mfspassword=passcode  #mfsclient));

3、模拟用backup上的文件恢复master#cd /ane/mfs/var/mfs/ ; mfsmetarestore -m metadata_ml.mfs.back*-o metadata.mfs changelog_ml*);

4master宕,将backup作为master#cd /ane/mfs/var/mfs ; mfsmetarestore -mmetadata_ml.mfs.back* -o metadata.mfs changelog_ml*);

启动顺序:

mfsmaster-->mfsdata-->mfsbackup-->client

关闭顺序:

clientumount-->mfsdata-->mfsdata-->mfsmaster

  

master单点解决:

1、部署多个mfsbackup

2heartbeat+drbd实现mfsmasterHAdrbd最好将安装路径同步);

3keepalived+inotify,对inotify的监控要准确;