Mfs使用与介绍
一,关于MooseFS
1,MooseFS是容错网络的分布式文件系统。将数据分散在多个物理服务器作为一个资源的用户是可见的。对于标准的文件操作MooseFS充当其他Unix相似的文件系统:
l 分层次结构(目录树)
l 存储POSIX文件属性(权限,最后访问和修改时间)
l 支持特殊文件(块设备和字符设备,管道和套接字)
l 符号链接(指向目标文件的文件名次,不一定MooseFS上的)和硬链接(MooseFS相同的数据文件不同的名字)
2,基于IPMooseFS的鲜明特点是:
l 高可靠性(分布在不同的电脑,可以存储的数据的多个副本)
l 通过安装新的计算机/磁盘容量动态扩展
l 删除的文件保留一个可配置的一段时间内(文件系统级别的“垃圾桶”)
l 相关快照的文件,即使文件被写入/访问
3,架构
MooseFS由四部分组成:
l 元数据服务器:在整个体系中负责管理管理文件系统,目前 MFS 只支持一个元数据服务器 master,这是一个单点故障,需要一个性能稳定的服务器来充当。希望今后 MFS能支持多个 master 服务器,进一步提高系统的可靠性。
l 元数据日志服务器:备份 master 服务器的变化日志文件,文件类型为 changelog_ml.*.mfs。当元数据服务器数据丢失或者损毁,可从日志服务器取得文件进行恢复。
l 数据存储服务器 chunkserver:真正存储用户数据的服务器。存储文件时,首先把文件分成块,然后这些块在数据服务器 chunkserver 之间复制(复制份数可以手工指定,建议设置副本数为 3)。 数据服务器可以是多个,并且数量越多,可使用的 “磁盘空间”越大,可靠性也越高。
l 客户端。使用 MFS 文件系统来存储和访问的主机称为 MFS 的客户端,成功挂接 MFS文件系统以后,就可以像以前使用 NFS 一样共享这个虚拟性的存储了。
Mfs读数据流程
Client——》master——》client——》chunk——》client
Client向master读取元数据(包括inode号),返回给client。然后根据inode去chunk中读取,将结果返回client。
写数据流程
Client——》master——》chunk——》master——》client——》chunk——》chunk——》client
Client先向master获取到inode号,但是master要到chunk上查看并创建新的空间,将结果返回给client,client这些开始向chunk的block中写入数据,而chunk之间自己将数据同步,完成之后,将成功的结果返回给client,client成功后,发送信号给master。
4, 该系统是如何工作的
已安装MooseFS客户端计算机上的所有文件的操作是完全一样的,因为他们将与其他文件系统。操作系统的内核将所有的文件操作FUSE模块,通信mfsmount进程。mfsmount进程通信随后通过网络管理服务器和数据服务器(块服务器)。这整个过程中用户是完全透明的。
(1)mfsmount与管理服务器进行通信,每个文件的元数据上的操作需要的时间:
创建文件
删除文件
读取目录
读取和修改属性
改变文件大小
在读取或写入数据的开始
任何访问在MFSMETA特殊文件
mfsmount使用直接连接到数据服务器(组块服务器),其存储有关一个文件的块。当写入文件时,写过程完成后,管理服务器接收信息从mfsmount更新文件的长度和最后修改时间。此外,数据服务器(数据块的服务器)通信的互相复制,以便实现适当数量的数据不同的机器上的文件的副本。
(2)容错
管理命令允许系统管理员指定的“目标”,或副本应保持数,每个目录或每个文件级别上。目标设置一个以上的和具有一个以上的数据服务器提供容错。当文件数据被存储在许多副本(在一个以上的数据服务器),该系统是,耐故障或一个单一的数据服务器的临时网络中断。这当然并不是指“目标”设置为1的文件,在这种情况下,该文件将只存在一个单一的数据服务器上,不论有多少数据服务器部署在系统中。格外重要文件可能有他们的目标设定一个高于2的数字,这将使这些文件要耐的情况下,在一个单一的数据服务器出现故障或多个服务器的细分一次。一般设置副本的数量应该是超过预期的数量无法访问或不序服务器。从网络断开,文件存储在其中的至少两个拷贝,将保持从另一个数据服务器访问。现在根据其目标的数据将被复制到另一个可访问的数据服务器再次提供所需的份数,应当指出,如果可用的服务器的数目是低于“目标”设置为一个给定的文件,所需的份数不会被保留。同样,如果有相同数量的服务器作为当前设定的目标,如果一个数据服务器已达到其容量的100%,这将是无法开始持有一个文件的副本,现在的目标阈值以下,因为另一个数据服务器进入脱机状态。在这些情况下,一个新的数据服务器应尽快系统连接,以保持所需数量的文件的副本,在任何时候一个新的数据服务器可以连接到该系统。立即成为新的容量将可用于存储新文件或担任其他数据服务器的文件复制副本,管理工具存在查询状态的文件系统内的文件,以确定是否有任何的文件目前低于他们的目标(设置数量的副本)。此实用程序也可以被用来改变目标设定需要的数据片段存储在块中的版本管理,所以旧的数据副本(如它已离线一段时间重新连接数据服务器) ,不会造成文件变得语无伦次。数据服务器将同步保持当前的版本过时块将被删除,*空间将被重新分配给持有新块的块,不会有任何的故障的客户机(mfsmount过程运行)影响的文件系统的一致性,或对其他客户的业务。在最坏的情况下,尚未从失败的客户端计算机发送的数据可能会丢失。
二,实验图
在上图中比较典型的网站架构
三,MFS编译与安装
1,安装
Master server
#wget http://jaist.dl.sourceforge.net/project/moosefs/moosefs/1.6.26/mfs-1.6.26.tar.gz
创建mfs用户来运行mfs进程
#useradd mfs -s /sbin/nologin
#tar xf mfs-1.6.26.tar.gz
#cd mfs-1.6.26
#./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs
如果提示下面错误
******************************** mfsmount disabled ********************************
* fuse library is too old or not installed - mfsmount needs version 2.6 or higher *
***********************************************************************************
checking for fuse_version in -lfuse... no
checking for zlibVersion in -lz... no
configure: error: zlib development library not found
#yum -y install zlib-devel fuse*
#./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs
#Make && make install
2,配置
#cd /usr/local/mfs/etc
主配置文件mfsmaster.cfg,mfsexports.cfg设置需要被共享的目录与权限
1,解释mfsmaster.cfg,并不需要做任何修改可以使用
#cp msfmaster.cfg.dist mfsmaster.cfg
#grep -v '^$' mfsmaster.cfg
# WORKING_USER = mfs
# WORKING_GROUP = mfs
# SYSLOG_IDENT = mfsmaster 在syslog日志中的标识为mfsmaster,说明是master产生。
# LOCK_MEMORY = 0 是否执行mlockall()以避免mfsmaster进程溢出,0表示不执行
# NICE_LEVEL = -19 进程运行的优先级
# EXPORTS_FILENAME = /usr/local/mfs/etc/mfsexports.cfg 被共享的目录文件的存放位置
# TOPOLOGY_FILENAME = /usr/local/mfs/etc/mfstopology.cfg 定义mfs的网络访问
# DATA_PATH = /usr/local/mfs/var/mfs 数据存储路径
# BACK_LOGS = 50 元数据改变日志文件数量
# BACK_META_KEEP_PREVIOUS = 1 保持之前的元数据备份数量
# REPLICATIONS_DELAY_INIT = 300 初始延迟复制的时间300秒
# REPLICATIONS_DELAY_DISCONNECT = 3600 chunk server断开复制的延迟(默认是3600秒)
# MATOML_LISTEN_HOST = * mata server连接的IP,默认是*,代表任何IP
# MATOML_LISTEN_PORT = 9419 mata server连接的端口
# MATOCS_LISTEN_HOST = * chunk server连接的ip
# MATOCS_LISTEN_PORT = 9420 chunk server连接的端口
# MATOCL_LISTEN_HOST = * 客户端连接的ip。
# MATOCL_LISTEN_PORT = 9421 客户端连接的端口
# CHUNKS_LOOP_CPS = 100000
# CHUNKS_LOOP_TIME = 300
# CHUNKS_SOFT_DEL_LIMIT = 10
# CHUNKS_HARD_DEL_LIMIT = 25
# CHUNKS_WRITE_REP_LIMIT = 2
# CHUNKS_READ_REP_LIMIT = 10
# REJECT_OLD_CLIENTS = 0 拒绝客户比1.6.0版本低的连接,默认0
# 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
2,mfsexports.cfg配置
#cp mfsexports.cfg.dist mfsexport.cfg
#vim mfsexports.cfg 添加一行
192.168.1.0/24 / rw
其余的都是注释说明,因此大家只需要自行了解
3,复制文件
#cp /usr/local/mfs/var/mfs/metadata.mfs.empty /usr/local/mfs/var/mfs/metadata.mfs
这是一个 8 字节的文件,为 mfs-1.6.x 新增项目
# cp mfstopology.cfg.dist mfstopology.cfg 可以不修改,但是启动mfsmaster时会报错
#/usr/local/mfs/sbin/mfsmaster start
mfstopology: incomplete definition in line: 7
mfstopology: incomplete definition in line: 7
mfstopology: incomplete definition in line: 22
mfstopology: incomplete definition in line: 22
mfstopology: incomplete definition in line: 28
mfstopology: incomplete definition in line: 28
上面的错误只要将mfstopology.cfg里的行删除就ok。有资料说这个版本有这个bug。下个版本已经修复了。
#/usr/local/mfs/sbin/mfsmaster restart应该不会提示错误了。
# ps -ef |grep mfs
root 9723 1 0 Apr27 ? 00:00:02 python sbin/mfscgiserv
mfs 10103 1 0 00:14 ? 00:00:06 /usr/local/mfs/sbin/mfsmaster restart
root 10141 10110 0 01:35 pts/1 00:00:00 grep mfs
#/usr/local/mfs/sbin/mfsmaster -h 查看支持哪些参数
usage: /usr/local/mfs/sbin/mfsmaster [-vdu] [-t locktimeout] [-c cfgfile] [start|stop|restart|reload|test]
-v : print version number and exit
-d : run in foreground
-u : log undefined config variables
-t locktimeout : how long wait for lockfile
-c cfgfile : use given config file
#tail -f /var/log/messages
2,meta server
安装过程与上面一样,只介绍配置文件
配置文件
#cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
# grep -v '^$' mfsmetalogger.cfg
# WORKING_USER = mfs
# WORKING_GROUP = mfs
# SYSLOG_IDENT = mfsmetalogger
# LOCK_MEMORY = 0
# NICE_LEVEL = -19
# DATA_PATH = /usr/local/mfs/var/mfs
# BACK_LOGS = 50
# BACK_META_KEEP_PREVIOUS = 3 保持之前的元数据备份
# META_DOWNLOAD_FREQ = 24 元数据备件文件的下载请求频率。默认24小时,即每隔一天从master server 的/usr/local/mfs/var/mfs/下载此文件metadata.mfs.back。当元数据服务关闭或出现故障时,metadata.mfs.back文件会自动消失,此时要恢复整个mfs,需要从元数据日志服务器中取得该文件。这个文件与日志文件共同使用才能够恢复整个被损坏的分布式文件系统。
# MASTER_RECONNECTION_DELAY = 5
MASTER_HOST = 192.168.1.18 只需要修改这一行,改成master server的IP或主机名
# MASTER_PORT = 9419
# MASTER_TIMEOUT = 60
# deprecated, to be removed in MooseFS 1.7
# LOCK_FILE = /var/run/mfs/mfsmetalogger.lock
启动服务
#/usr/local/mfs/sbin/mfsmetaloger -h
usage: sbin/mfsmetalogger [-vdu] [-t locktimeout] [-c cfgfile] [start|stop|restart|reload|test]
-v : print version number and exit
-d : run in foreground
-u : log undefined config variables
-t locktimeout : how long wait for lockfile
-c cfgfile : use given config file
#/usr/local/mfs/sbin/mfsmetaloger start
#losf -i:9419
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mfsmetalo 1561 mfs 8u IPv4 12934 0t0 TCP 192.168.1.19:51647->192.168.1.18:9419 (ESTABLISHED)
已经连接到master server的9419端口,如果不能正常连接请检查日志,是否关闭iptables,selinux。
3,配置chunk server
安装步骤与master server雷同
配置文件解释
#cd /usr/local/mfs/etc
#cp mfschunkserver.cfg.dist mfschunkserver.cfg
# grep -v '^$' mfschunkserver.cfg
# WORKING_USER = mfs
# WORKING_GROUP = mfs
# SYSLOG_IDENT = mfschunkserver
# LOCK_MEMORY = 0
# NICE_LEVEL = -19
# DATA_PATH = /usr/local/mfs/var/mfs
# MASTER_RECONNECTION_DELAY = 5
# BIND_HOST = *
MASTER_HOST = 192.168.1.18
# MASTER_PORT = 9420
# MASTER_TIMEOUT = 60
# CSSERV_LISTEN_HOST = * 监听来自客户端的连接,这里的客户端指其他chunk server。
# CSSERV_LISTEN_PORT = 9422
# HDD_CONF_FILENAME = /usr/local/mfs/etc/mfshdd.cfg 设置分配给mfs使用的磁盘空间文件的位置
# HDD_TEST_FREQ = 10块周期性测试10
# deprecated, to be removed in MooseFS 1.7
# LOCK_FILE = /var/run/mfs/mfschunkserver.lock
# BACK_LOGS = 50
# CSSERV_TIMEOUT = 5
配置mfshdd.cfg
#cp mfshdd.cfg.dist mfshdd.cfg
#vim mfshdd.cfg
/data
#chown -R mfs:mfs /data
#/usr/local/mfs/sbin/mfschunkserver start
# ps -ef |grep mfs
mfs 1463 1 0 May02 ? 00:01:10 sbin/mfschunkserver start
root 1959 1912 0 12:16 pts/0 00:00:00 grep mfs
4,客户端测试
编译mfs
#useradd mfs -s /sbin/nologin
#cd mfs-1.6.26
#./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --enable-mfsmount
#make;make install
挂载chunk server共享目录
#/usr/local/mfs/bin/mfsmount /mnt -H 192.168.1.18 注意是master的IP,不是chunk server的IP。
查看
# df -h
Filesystem Size Used Avail Use% Mounted on
192.168.1.18:9421 15G 0 15G 0% /mnt/
在master server 启动mfscgiserv监控客户连接状态
#/usr/local/mfs/mfscgiserv
在浏览器中输入 http://192.168.1.18:9425
卸载直接用umont,如果提示不能卸载,不要强制卸载。用fuser ,lsof -p命令查出哪个进程在使用fuser -u /mnt 查找出进程
Lsof -p 跟踪进程是哪个
四,管理与使用MFS
1,mfsmount用法
Mfsmount [-H master] [-P port] [-S path] mountpoint
-H master 管理服务器的IP地址
-P port 管理服务器的端口号,如果是默认的则不必再写
-S path 指出挂载MFS目录的子目录,默认是/目录,即挂载整个MFS目录
Mountpoint 挂载到哪个目录下
2,在启动管理服务器进程时,用了一个“-m”或“-o mfsmeta”的选项,这样可以挂载一个辅助的文件系统mfsmeta。辅助文件系统可以在两个方面恢复丢失的数据。
(1)从mfs卷上误删除的的文件,而此文件又过了垃圾文件存放期
(2)为了释放磁盘空间而删除或移动文件,当需要恢复这些文件时,文件又过了垃圾文件存放期。
使用MFS辅助文件系统,可以执行
#mfsmount -m /mnt -H 192.168.1.18 这样才可以在垃圾桶里找到删除了文件但还未过期
# ll -R /mnt/mfsmeta/
/mnt/mfsmeta/:
total 0
dr-x------. 2 root root 0 May 3 16:56 reserved
drwx------. 3 root root 0 May 3 16:56 trash 垃圾桶
如果决定挂载mfsmeta,要在master server的mfsexport.cfg文件中添加如下
*.Rw
每个文件可以被储存为多个副本,这种情况下,每一个文件所占用的空间要比其文件本身大得多。此外,被删除且在有效期内的文件都放在一个”垃圾箱“中,所以它们也占空间,其大小也依赖文件的份数。
3,设置文件被复制的份数
#mfssetgoal 3 /mnt/ 设置3份比较可靠 加-r递归,对整个目录树操作。
#mfsgetgoal /mnt/ 查看设置的份数
4,mfscheckfile与mfsfileinfo
#mfscheckfile /mnt/
#mfsfileinfo /mnt
#mfsdirinfo /mnt 等同于du -s
5,设置垃圾箱时间
#mfssetrashtime 600 /mnt 600秒,10分钟之后就会被自动删除
#mfsgetrashtime /mnt 查看当前设置的时间,默认是七天
五,启动mfs集群
1,启动mfsmaster进程
2,启动所有的mfschunkserver进程
3,启动mfsmetalogger进程
停止mfs集群
1,所有客户端卸载mfs文件系统
2,mfschunkserver -s
3,mfsmetalogger -s
4,mfsmaster -s
Chunk server的维护
如果每个文件的goal(目标)都大于2,并且没有under-goal文件(这些可以通过mfsgetgoal -r和mfsdirinof命令来检查),那么其中一个chunk server在任何时刻都可以停止或重新启动。以后每当需要停止或都重新启动另一个chunk server的时候,要确定之前的数据存储服务器被连接,而且没有under-goal chunks。
元数据的备份
1,主要元数据文件metadata.mfs在master上。
2,元数据改变日志changelog.*.mfs,在meta server上,存储过去n小时内文件改变。N的数值是由back_logs参数设置。参数设置在mfschunkserver.cfg配置,
Master server的恢复
当master server崩溃,需要最后一个元数据改变日志changlog和主要元数据文件metadata.mfs,通过
Mfsmetarestore -a 默认会在/usr/local/mfs/var/mfs目录中自动需要的改变需要的改变日志文件和主要元数据文件。Mfsmetarestore命令在恢复时自动查找是metadata.mfs.back文件,而不是metadata.mfs文件,如果找不到metadata.mfs.back,会继续查找是否存在metadata_ml.mfs.back文件,如果没有,将提示恢复出错。
如果安装不是在/usr/local/mfs下,则需要指定路径
Mfsmetarestore -a -d /storage/mfsmaster