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

https://moosefs.com/index.html

特点:

分层的目录树结构;

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

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

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

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

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

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

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

优点:

轻量、易配置、易维护;

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

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

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

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

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

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

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

缺点:

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

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

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

应用场景:

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

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

Lustre;ceph;GlusterFS;HDFS;Mogilefs;FastDFS;FreeNAS;MooseFS;

MFS结构(4组件):

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

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

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

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

高稳定性要求:

master(双电源分别接A、B路电,机柜多的分开存放;多块disk使用raid1或raid10,也可raid5(r好w慢));

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

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

操作:

192.168.23.136(mfsmaster)

192.168.23.137(mfsbackup,mfsclient,两个角色)

192.168.23.138(mfsdata)

[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<-->metalogger,9420用于master<-->chunkserver,9421用于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;*表示所有ip;ip段,如f.f.f.f-t.t.t.t;ip/netmask;ip/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

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一起才能恢复整个被损坏的分布式FS;MASTER_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

注:#df -h的结果与web监控界面显示的不一样,相差256M,当mfs上的data空间剩余256m时将不会再存内容,master向data申请空间是按最小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   #(查看master上changelog.0.mfs和backup上changelog_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

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

默认86400,1day;

[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*);

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

启动顺序:

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

关闭顺序:

client先umount-->mfsdata-->mfsdata-->mfsmaster

master单点解决:

1、部署多个mfsbackup;

2、heartbeat+drbd实现mfsmaster的HA(drbd最好将安装路径同步);

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

最新文章

  1. (原创) alljoyn物联网实验之手机局域网控制设备
  2. C#的输入、输出与运算符、数据类型
  3. 发送短信(string转换为JSON)
  4. 1.js基础
  5. 重拾C,一天一点点_3
  6. 从python run 和python unittest两种eclipse运行方式深入理解if __name__ == &quot;__main__&quot;
  7. Android Studio 创建aar包与引用
  8. 2326: [HNOI2011]数学作业 - BZOJ
  9. jquery全选,jquery全不选,jquery反选
  10. WEB架构师成长之路之三-架构师都要懂哪些知识
  11. 新建oracle数据库表空间
  12. 纯javascript代码编写计算器程序
  13. 开源 java CMS - FreeCMS2.2 模型管理
  14. debug经验汇总
  15. RESTful规范
  16. (PMP)解题技巧和典型题目分析(0903-2班)
  17. Python机器学习入门
  18. Python字符编码以及循环机制介绍
  19. OneNET麒麟座应用开发之七:控制采样电机
  20. mybatis自己学习的一些总结

热门文章

  1. github push时提示Username for &#39;https://github.com&#39; 解决办法
  2. 【C#表达式树 四】Expression类上的函数列表
  3. 3rd S-curve velocity profile
  4. JZ-049-把字符串转换成整数
  5. JZ-047-求 1+2+3+...+n
  6. LeetCode-029-两数相除
  7. python实现四则运算题库
  8. tp5.0使用JWT完成token认证技术
  9. LGP6011题解
  10. 腾讯2021LIGHT公益创新挑战赛赛题分析