原文 http://www.tuicool.com/articles/vQvEZ3yjavascript
MooseFS是一款具备冗余容错功能的分布式文件系统。它把数据分散在多台服务器上,确保一份数据多个备份副本,对外提供统一的结构。php
对于标准的文件操做,MooseFS表现与其余类Unix文件系统一致。支持的经过文件系统特性:java
Master(元数据服务器)负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复,多节点拷贝。node
Metalogger(元数据日志服务器)sql
负责备份Master服务器的changelog。文件类型为 changelog.*.mfs
,以便在Master出问题时接替其工做vim
Chunk(数据存储服务器)负责链接Master,遵从Master调度,提供存储空间,并为客户端提供数据传输浏览器
Client(客户端挂载)经过FUSE内核接口挂载远程管理服务器(master)上所管理的数据存储服务器,使用起来和本地文件系统同样安全
CentOS Linux release 7.2.1511 (Core)
chunk上有四块硬盘,第一块为系统,剩下三块做为数据存储,每块容量为4TBruby
curl "http://ppa.moosefs.com/RPM-GPG-KEY-MooseFS" > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
//For EL7 family:
curl "http://ppa.moosefs.com/MooseFS-stable-el7.repo" > /etc/yum.repos.d/MooseFS.repo //For EL6 family: curl "http://ppa.moosefs.com/MooseFS-stable-el6.repo" > /etc/yum.repos.d/MooseFS.repo For EL5 family: Due to GPGv4 incompatibility with CentOS 5, CentOS 5 is deprecated. If you really need CentOS 5 packages, please contact support@moosefs.com.
// For Master Server:
yum install moosefs-master moosefs-cli moosefs-cgi moosefs-cgiserv
// For Chunkservers: yum install moosefs-chunkserver //For Metaloggers: yum install moosefs-metalogger For Clients: //yum install moosefs-client
//To start process manually: mfsmaster start mfschunkserver start //For systemd OS family - EL7: systemctl start moosefs-master.service systemctl start moosefs-chunkserver.service //For SysV OS family - EL6: service moosefs-master start service moosefs-chunkserver start
wget http://ppa.moosefs.com/src/moosefs-2.0.88-1.tar.gz
useradd -s /sbin/nologin -M mfs
tar-zxf moosefs-2.0.88-1.tar.gz cd moosefs-2.0.88 // For master ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount // For metalogger ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount // For chunk ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount --disable-mfscgi --disable-mfscgiserv
client安装须要fuse支持,fuse能够从源码和仓库中安装服务器
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver --disable-mfscgi --disable-mfscgiserv
// mfsmaster.cfg
# WORKING_USER = mfs 运行 master server 的用户 # WORKING_GROUP = mfs 运行 master server 的组 # SYSLOG_IDENT = mfsmaster master server 在 syslog中的标识,说明是由 master serve 产生的 # LOCK_MEMORY = 0 是否执行 mlockall()以免 mfsmaster 进程溢出(默认为 0) # NICE_LEVEL = -19 运行的优先级(若是能够默认是 -19; 注意: 进程必须是用 root启动) # EXPORTS_FILENAME = /usr/local/mfs/etc/mfsexports.cfg 被挂接目录及其权限控制文件的存放位置 # TOPOLOGY_FILENAME = /usr/local/mfs/etc/mfs/mfstopology.cfg # DATA_PATH = /usr/local/mfs/var/mfs 数据存放路径,此目录下大体有三类文件,changelog,sessions和 stats; # BACK_LOGS = 50 metadata 的改变 log 文件数目(默认是 50); # BACK_META_KEEP_PREVIOUS = 1 # REPLICATIONS_DELAY_INIT = 300 延迟复制的时间(默认是 300s); # REPLICATIONS_DELAY_DISCONNECT = 3600 chunkserver 断开的复制延迟(默认是 3600); # MATOML_LISTEN_HOST = * metalogger 监听的 IP 地址(默认是*,表明任何 IP); # MATOML_LISTEN_PORT = 9419 metalogger 监听的端口地址(默认是 9419); # MATOML_LOG_PRESERVE_SECONDS = 600 # MATOCS_LISTEN_HOST = * 用于 chunkserver 链接的 IP 地址(默认是*,表明任何 IP); # MATOCS_LISTEN_PORT = 9420 用于 chunkserver 链接的端口地址(默认是 9420); # MATOCU_LISTEN_HOST = * 用于客户端挂接链接的 IP 地址(默认是*,表明任何 IP); # MATOCU_LISTEN_PORT = 9421 用于客户端挂接链接的端口地址(默认是 9421); # CHUNKS_LOOP_MAX_CPS = 100000 # CHUNKS_LOOP_MIN_TIME = 300 chunks 的回环频率(默认是:300 秒); 注:原文为Chunks loop frequency in seconds (default is 300) # CHUNKS_SOFT_DEL_LIMIT = 10 # CHUNKS_HARD_DEL_LIMIT = 25 # CHUNKS_WRITE_REP_LIMIT = 2 # CHUNKS_READ_REP_LIMIT = 10 # ACCEPTABLE_DIFFERENCE = 0.1 # SESSION_SUSTAIN_TIME = 86400 # REJECT_OLD_CLIENTS = 0 弹出低于 1.6.0 的客户端挂接(0 或 1,默认是 0)注意mfsexports 访问控制对于那些老客户是没用的 # deprecated: # CHUNKS_DEL_LIMIT - use CHUNKS_SOFT_DEL_LIMIT instead # LOCK_FILE - lock system has been changed, and this option is used only to search for old lockfile \\ mfsexport.cfg #* / ro #192.168.1.0/24 / rw #192.168.1.0/24 / rw,alldirs,maproot=0,password=passcode #10.0.0.0-10.0.0.5 /test rw,maproot=nobody,password=test * . rw #* / rw,alldirs,maproot=0 172.16.18.221 . rw \\ 回收站 172.16.18.221 / rw,alldirs,maproot=0 172.16.18.134 / rw,alldirs,maproot=0
cd /usr/local/mfs/etc/
mv mfsmaster.cfg.dist mfsmaster.cfg
mv mfsexports.cfg.dist mfsexports.cfg
mfsmaster.cfg : master的主配置文件,配置文件中全部的选项都是用#注释掉的,这表明的是将会使用的选项的默认参数,若是要修改只需取消注释修改其值为你所要使用的值便可;
mfsexportes.cfg 为共享mfs文件系统的控制文件,NFS要共享一个目录时,咱们会使用vim /etc/exports命令,编写共享给谁,所要共享的目录,共享出去的属性这些内容,而mfsexports.cfg的做用与其相似其书写格式以下:
client Directory Property * / rw,alldirs,maproot=0 client支持格式:ip、ip/netmask、ip/位数掩码、ip-ip、*
该文件每个条目分为三部分:
第一部分:客户端的ip 地址
第二部分:被挂接的目录
第三部分:客户端拥有的权限
//地址能够指定的几种表现形式:
* 全部的ip 地址
n.n.n.n 单个ip 地址
n.n.n.n/b IP 网络地址/位数掩码
n.n.n.n/m.m.m.m IP 网络地址/子网掩码
f.f.f.f-t.t.t.t IP 段
//目录部分须要注意两点: / 标识MooseFS 根; . 表示MFSMETA 文件系统 //权限部分: ro 只读模式共享 rw 读写的方式共享 alldirs 许挂载任何指定的子目录
/usr/local/mfs/sbin/mfsmaster start //为了监控moosefs的当前运行状态,咱们能够运行cgi服务,这样就能够用浏览器查看整个moosefs的运行状况 /usr/local/mfs/sbin/mfscgiserv
mv mfsmetalogger.cfg.dist mfsmetalogger.cfg META_DOWNLOAD_FREQ = 24 \\元数据备份下载请求频率,设置为1小时 MASTER_HOST = 172.16.18.137 \\修改MASTER_HOST的值,为MASTER_HOST的ip地址
/usr/local/mfs/sbin/mfsmetalogger start
parted -s /dev/sdb 'mklabel gpt';parted -s /dev/sdc 'mklabel gpt';parted -s /dev/sdd 'mklabel gpt' parted -s /dev/sdb 'mkpart primary 0 -1'; parted -s /dev/sdc 'mkpart primary 0 -1'; parted -s /dev/sdd 'mkpart primary 0 -1' mkfs.ext4 -q -T largefile /dev/sdb1;mkfs.ext4 -q -T largefile /dev/sdc1;mkfs.ext4 -q -T largefile /dev/sdd1 mkdir /MFS_data{1,2,3} mount /dev/sdb1 /MFS_data1; mount /dev/sdc1 /MFS_data2; mount /dev/sdd1 /MFS_data3 chown mfs:mfs /MFS_data*
mv mfschunkserver.cfg.dist mfschunkserver.cfg 修改MASTER_HOST的值,为MASTER_HOST的ip地址: MASTER_HOST = 172.16.18.137 mv mfshdd.cfg.dist mfshdd.cfg 增长挂载目录信息 /MFS_data1 /MFS_data2 /MFS_data3
/usr/local/mfs/sbin/mfschunkserver start
mkdir /MFS_data
/usr/local/mfs/bin/mfsmount /MFS_data -H 172.16.18.137 mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root
特别须要注意的是,全部的MFS 都是挂接同一个元数据服务器master 的IP,而不是其余数据存储服务器chunkserver 的IP
Client经过MFS软件提供的工具来管理MFS文件系统,下面是工具介绍
/usr/local/mfs/bin/mfstools -h
mfs multi tool
usage:
mfstools create - create symlinks (mfs<toolname> -> /usr/local/mfs/bin/mfstools)
tools:
mfsgetgoal // 设定副本数 mfssetgoal // 获取副本数 mfsgettrashtime // 设定回收站时间 mfssettrashtime // 设定回收站时间 mfscheckfile // 检查文件 mfsfileinfo // 文件信息 mfsappendchunks mfsdirinfo // 目录信息 mfsfilerepair // 文件修复 mfsmakesnapshot // 快照 mfsgeteattr // 设置权限 mfsseteattr mfsdeleattr deprecated tools: // 递归设置 mfsrgetgoal = mfsgetgoal -r mfsrsetgoal = mfssetgoal -r mfsrgettrashtime = mfsgettreshtime -r mfsrsettrashtime = mfssettreshtime -r
MooseFS 文件系统利用下面的命令:
mfsmount mountpoint [-d][-f] [-s][-m] [-n][-p] [-HMASTER][-PPORT] [-S PATH][-o OPT[,OPT...]]
-H MASTER:是管理服务器(master server)的ip 地址
-P PORT: 是管理服务器( master server)的端口号,要按照mfsmaster.cfg 配置文件中的变量 MATOCU_LISTEN_POR 的之填写。若是master serve 使用的是默认端口号则不用指出。 -S PATH:指出被挂接mfs 目录的子目录,默认是/目录,就是挂载整个mfs 目录。
Mountpoint:是指先前建立的用来挂接mfs 的目录。
在开始mfsmount 进程时,用一个-m 或-o mfsmeta 的选项,这样能够挂接一个辅助的文件系统
MFSMETA,这么作的目的是对于意外的从MooseFS 卷上删除文件或者是为了释放磁盘空间而移动的
文件而又此文件又过去了垃圾文件存放期的恢复,例如:
/usr/local/mfs/bin/mfsmount -m /MFS_meta/ -H 172.16.18.137
目标(goal),是指文件被拷贝副本的份数,设定了拷贝的份数后是能够经过mfsgetgoal 命令来证明的,也能够经过mfsrsetgoal 来改变设定。
mfssetgoal 3 /MFS_data/test/ mfssetgoal 3 /MFS_data/test/
用 mfsgetgoal –r
和 mfssetgoal –r
一样的操做能够对整个树形目录递归操做,其等效于 mfsrsetgoal
命令。实际的拷贝份数能够经过 mfscheckfile
和 mfsfile info
命令来证明。
能够经过mfsdirinfo来查看整个目录树的信息摘要。
一个被删除文件可以存放在一个“ 垃圾箱”的时间就是一个隔离时间, 这个时间能够用 mfsgettrashtime
命令来验证,也可使用`mfssettrashtime 命令来设置。
mfssettrashtime 64800 /MFS_data/test/test1 mfsgettrashtime /MFS_data/test/test1
时间的单位是秒(有用的值有:1 小时是3600 秒,24 - 86400 秒,1天 - 604800 秒)。就像文件被存储的份数同样, 为一个目录设定存放时间是要被新建立的文件和目录所继承的。数字0 意味着一个文件被删除后, 将当即被完全删除,在想回收是不可能的。
删除文件能够经过一个单独安装MFSMETA 文件系统。特别是它包含目录/ trash (包含任然能够被还原的被删除文件的信息)和/ trash/undel (用于获取文件)。只有管理员有权限访问MFSMETA(用户的uid 0,一般是root)。
/usr/local/mfs/bin/mfsmount -m /MFS_meta/ -H 172.16.18.137
被删文件的文件名在“垃圾箱”目录里还可见,文件名由一个八位十六进制的数i-node 和被删文件的文件名组成,在文件名和i-node 之间不是用“/”,而是用了“|”替代。若是一个文件名的长度超过操做系统的限制(一般是255 个字符),那么部分将被删除。经过从挂载点起全路径的文件名被删除的文件任然能够被读写。
移动这个文件到trash/undel 子目录下,将会使原始的文件恢复到正确的MooseFS 文件系统上路径下(若是路径没有改变)。若是在同一路径下有个新的同名文件,那么恢复不会成功。
从“垃圾箱”中删除文件结果是释放以前被它站用的空间(删除有延迟,数据被异步删除)。
在MFSMETA中还有另外一个目录reserved,该目录内的是被删除但依然打开的文件。在用户关闭了这些被打开的文件后,reserved 目录中的文件将被删除,文件的数据也将被当即删除。在reserved 目录中文件的命名方法同trash 目录中的同样,可是不能有其余功能的操做。
MooseFS 系统的另外一个特征是利用mfsmakesnapshot 工具给文件或者是目录树作快照
mfsmakesnapshot source ... destination
Mfsmakesnapshot 是在一次执行中整合了一个或是一组文件的拷贝,并且任何修改这些文件的源文件都不会影响到源文件的快照, 就是说任何对源文件的操做,例如写入源文件,将不会修改副本(或反之亦然)。
也可使用mfsappendchunks:
mfsappendchunks destination-file source-file ...
当有多个源文件时,它们的快照被加入到同一个目标文件中(每一个chunk 的最大量是chunk)。
安全的启动MooseFS 集群(避免任何读或写的错误数据或相似的问题)的方式是按照如下命令步骤:
安全的中止MooseFS 集群:
若每一个文件的goal(目标)都不小于2,而且没有under-goal 文件(这些能够用mfsgetgoal –r和mfsdirinfo 命令来检查),那么一个单一的chunkserver 在任什么时候刻均可能作中止或者是从新启动。之后每当须要作中止或者是从新启动另外一个chunkserver 的时候,要肯定以前的chunkserver 被链接,并且要没有under-goal chunks。
一般元数据有两部分的数据:
主要的元数据文件须要按期备份,备份的频率取决于取决于多少小时changelogs 储存。元数据changelogs 实时的自动复制。1.6版本中这个工做都由metalogger完成。
一旦mfsmaster 崩溃(例如由于主机或电源失败),须要最后一个元数据日志changelog 并入主要的metadata 中。这个操做时经过 mfsmetarestore
工具作的,最简单的方法是:
mfsmetarestore -a
若是master 数据被存储在MooseFS 编译指定地点外的路径,则要利用-d 参数指定使用,如:
mfsmetarestore -a -d /opt/mfsmaster
若是mfsmetarestore -a没法修复,则使用metalogger也可能没法修复,暂时没遇到过这种状况,这里不暂不考虑。
mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog_ml.*.mfs
或:强制使用metadata.mfs.back建立metadata.mfs,能够启动master,但丢失的数据暂没法肯定。
生产环境使用 MooseFS 时,须要保证 master 节点的高可用。 使用 ucarp
是一种比较成熟的方案,或者 DRBD+[hearbeat|keepalived]
。 ucarp
相似于 keepalived
,经过主备服务器间的健康检查来发现集群状态,并执行相应操做。另外 MooseFS商业版本已经支持双主配置,解决单点故障。