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的监控要准确;

学习MFS(二)的更多相关文章

  1. crawler4j 学习(二)

    crawler4j 学习(二) 实现控制器类以制定抓取的种子(seed).中间数据存储的文件夹.并发线程的数目: public class Controller { public static voi ...

  2. 从零开始学习jQuery (二) 万能的选择器

    本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...

  3. Android Animation学习(二) ApiDemos解析:基本Animators使用

    Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...

  4. AspectJ基础学习之二搭建环境(转载)

    AspectJ基础学习之二搭建环境(转载) 一.下载Aspectj以及AJDT 上一章已经列出了他的官方网站,自己上去download吧.AJDT是一个eclipse插件,开发aspectj必装,他可 ...

  5. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  6. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  7. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  8. MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存

    目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...

  9. MyBatis学习 之 二、SQL语句映射文件(1)resultMap

    目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...

  10. UML学习(二)-----类图

    UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs ...

随机推荐

  1. 【C# TAP 异步编程】一 、async 修饰符(标记)

    async的作用: 1.async是一个标记,告诉编译器这是一个异步方法. 2.编译器会根据这个标志生成一个异步状态机. 3.编译器将原异步方法中的代码清空,写入状态机的配置,原先异步方法中的代码被封 ...

  2. 换行符号(\r\n)的历史

    文章来源:https://cloud.tencent.com/developer/article/1730918 \r\n与\n是有区别的. 如果要通用的则是\r\n,因为有些编辑器它不认\n &qu ...

  3. 多个n维向量围成的n维体积的大小

    前言 上周我们数学老师给了我们一道题,大意就是两个向量a和b,一个点M=$x*a+y*b$,x,y有范围,然后所有M组成的面积是一个定值,求x+y的最小值.当然这是道小水题,但我在想,如果把两个向量变 ...

  4. 熟悉JSP教程学习

  5. JZ-011-二进制中 1 的个数

    二进制中 1 的个数 题目描述 输入一个整数,输出该数32位二进制表示中1的个数.其中负数用补码表示. 题目链接: 二进制中 1 的个数 代码 /** * 标题:二进制中 1 的个数 * 题目描述 * ...

  6. 二级py--day2

    二级py day2-3 1.进程至少活动情况分为:运行状态.就绪状态.等待状态(阻塞状态).创建状态.终止状态 2.进程的特性包括: 并发性和动态性 3.计算机地址位数决定了内存的最大容量,决定了虚拟 ...

  7. web Javascript360°全景实现

    360 全景浏览是一种性价比很高的虚拟现实解决方案,给人一种全新的浏览体验,让你足不出户就能身临其境地感受到现场的环境.该技术被广泛地应用在房产.酒店.家居等领域. 下面我们使用三种方法讨论一个 36 ...

  8. java多线程中常用指令

    ------------恢复内容开始------------ 一.写在前面 好久没写博客了,这不快毕业了,应该会重新开始更新博客了.这次主要介绍查看线程状态等一系列常见指令,包括有jps.vmstat ...

  9. emu8086实现两位数乘法运算

    题目说明:从键盘上输入任意两个不大于2位数的正实数,计算其乘积,结果在屏幕上显示 一.准备材料 DOS功能调用表:https://blog.csdn.net/mybelief321/article/d ...

  10. JVM基本概念

    JVM基础概念 什么是JVM JVM:Java virtual machine,Java虚拟机,它是一种规范.是虚构出来的一台计算机.它可以将二进制字节码根据不同的操作系统转为当前操作系统识别的的字节 ...