共计 10796 个字符,预计需要花费 27 分钟才能阅读完成。
mooseFS 简介
MooseFS 正式的推出是在 2008-05-30,到 2009-10-12 为止,最新的版本是 1.5.12。
mooseFS 是一款网络分布式文件系统。它把数据分散在多台服务器上,但对于用户来讲,看到的只是一个源。MFS 也像其他类 unix 文件系统一样,包含了层级结构(目录树),存储着文件属性(权限,最后访问和修改时间),可以创建特殊的文件(块设备,字符设备,管道,套接字),符号链接,硬链接。
mooseFS 系统的组成
1.master(元数据服务器)
master 负责在整个系统中管理数据。是整个系统的维护者。但是它有个弱点就是 master 只有一个!也就是说如果 master 坏掉,整个系统将停止工作!不过这算不上致命弱点,因为我们做好数据备份以后,恢复 master 是很简单的事。
2.chunkserver(数据存储服务器)
chunkserver 是 mfs 系统中的数据存储者。真正的用户数据按照算法被分成 chunk,并分发到各个 chunkserver 上。这样就保证了数据的安全性。
3.client
凡是使用 mfs 文件系统的机器都可以被称为 client。client 是 mfs 系统的使用者。当 client 把 mfs 文件系统挂载到本机以后,它可以像使用一个普通的磁盘分区一样,来使用 mfs。
试验环境
本文只介绍 moosefs 的部署与应用,出于试验的目的,并没有考虑性能因素,因此所有的服务器均使用虚拟机来实现。以后有机会做单独的物理服务器,然后对其性能进行测试。
拓扑图
备注:
(1)chunkserver1-4 均添加了一块虚拟的磁盘 sda(磁盘空间一定要大于 1G,我这里设置了 4G),挂载到系统的 /data 下。所有服务器均升级内核为 2.6.18-164 本版,为什么要升级内核,下文会有介绍。
(2)所有服务器均安装了完整版的 mfs 组件
安装与配置
安装 mfs 的前提条件
由于 mfs 的客户端程序也就是加载 mfs 磁盘系统的命令是使用 fuse 编写的,因此只要是想挂载 mfs 的服务器,必要的前提条件就是先安装 fuse,这样编译 mfs 的时候才能顺利通过。另外一点需要注意:linux 2.6.18-164.e15 版本的 linux 内核中已经内置了 fuse 模块。但在该版本之前的 linux 内核中是不包含这个模块的。另 fuse 从 2.8.0-pre1 版本的源码包中去掉了 fuse 系统模块的源码部分,原因就是上一点提到的。这样我们在编译安装当前最新版本的 fuse(2.8 以上版本) 且正在使用的 linux 内核版本低于 2.6.18-164.e15 版本,则系统中是不包含 fuse 模块的。
解决的方法:
1、升级系统内核为 2.6.18-164 版本
为了方便起见直接利用 yum 升级系统内核即可。yum install kernel
安装成功后需重启系统
2、使用 fuse 2.7x 版本编译安装
该版本的 fuse 中包含了 linux 内核需要的 fuse 模块,配置编译选项时指定 –enable-kernel-module 选项,make 的时候就会编译相应的 fuse 模块,make intall 会将 fuse.ko 复制到 /lib/modules/`uname -r`/kernel/fs/fuse/ 目录下 安装后利用
- # modprobe -l | grep fuse
- /lib/modules/2.6.18-128.el5xen/kernel/fs/fuse/fuse.ko
查看是否正常安装
3、利用 yum 安装当前内核版本的 fuse 模块
- yum install -y dkms-fuse dkms
安装 fuse
如果只编译元数据服务端或数据存储服务端的话是没有必要安装 fuse 的。只有 mfsmount 需要 fuse 支持(编译时需要 fuse 的开发包,使用 mfsmount 挂载时需要 fuse.ko 系统模块)。可以使用源码或 yum 两种方式安装 fuse
1、源码安装
- # wget http://ncu.dl.sourceforge.net/project/fuse/fuse-2.X/2.8.1/fuse-2.8.1.tar.gz
- # tar -xvzf fuse-2.8.1.tar.gz
- # cd fuse-2.8.1
- # ./configure –prefix=/usr/ –libdir=/usr/lib64
- # make && make install
由于我系统为 64 位,因此在编译 fuse 时将 lib 目录定为 /usr/lib64。这样在下面编译安装 mfs 时就不会因为找不到 fuse 的 lib 文件报错了。
2、yum 安装
- # yum install -y fuse fuse-devel
安装 mfs
- # useradd mfs -s /sbin/nologin
- # ./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs –enable-mfsmount
- # make && make install
查看安装后目录结构
- # ll /usr/local/mfs/
- total 20
- drwxr-xr-x 2 root root 4096 Oct 14 15:14 bin
- drwxr-xr-x 2 root root 4096 Oct 14 12:13 etc
- drwxr-xr-x 2 root root 4096 Oct 14 15:14 sbin
- drwxr-xr-x 3 root root 4096 Oct 14 12:13 share
- drwxr-xr-x 3 root root 4096 Oct 14 12:13 var
bin – 客户端工具
etc – 元数据服务器,数据存储服务器的配置文件都放在该目录中
sbin – 元数据服务器端程序 mfsmaster、数据存储服务器端服务程序 mfschunkserver
share – 文档
var – 元数据目录(可在配置文件中自定义到其他目录)
配置 master(元数据服务器)
IP:192.168.108.108
- [root@master~]#vi/usr/local/mfs/etc/mfsmaster.cfg
- #WORKING_USER=mfs
- #WORKING_GROUP=mfs
- #LOCK_FILE=/var/run/mfs/mfsmaster.pid
- #DATA_PATH=/usr/local/mfs/var/mfs
- #SYSLOG_IDENT=mfsmaster
- #BACK_LOGS=50
- #REPLICATIONS_DELAY_INIT=300
- #REPLICATIONS_DELAY_DISCONNECT=3600
- MATOCS_LISTEN_HOST=192.168.108.108
- #MATOCS_LISTEN_PORT=9420
- #MATOCU_LISTEN_HOST=*
- #MATOCU_LISTEN_PORT=9421
- #CHUNKS_LOOP_TIME=300
- #CHUNKS_DEL_LIMIT=100
- #CHUNKS_REP_LIMIT=15
注:这个配置文件中所有注掉的设置都是默认的配置。在这里我只更改了 MATOCS_LISTEN_HOST 的值,也就是将它修改为本机的 ip 地址:192.168.108.108。如果又需要还可以修改 DATA_PATH 的设置将元数据目录存储到其他的分区或磁盘。其他的参数都很简单根据需要调整即可。
master 会打开 9420 端口等待 mfschunkserver 连接
启动 mfsmaster
- [root@master~]#/usr/local/mfs/sbin/mfsmaster
- [root@master~]#ps-ef|grepmfsmaster|grep-vgrep
- mfs101321017:37?00:00:00/usr/local/mfs/sbin/mfsmaster
- [root@master~]#netstat-tulnp|grepmfsmaster
- tcp00192.168.108.108:94200.0.0.0:*LISTEN10132/mfsmaster
- tcp000.0.0.0:94210.0.0.0:*LISTEN10132/mfsmaster
查看系统日志
- [root@master~]#tail-f/var/log/messages
- Oct1417:37:35mastermfsmaster:config:usingdefaultvalueforoption‘SYSLOG_IDENT’–‘mfsmaster’
- Oct1417:37:35mastermfsmaster[10130]:config:usingdefaultvalueforoption‘WORKING_USER’–‘mfs’
- Oct1417:37:35mastermfsmaster[10130]:config:usingdefaultvalueforoption‘WORKING_GROUP’–‘mfs’
- …
- Oct1417:37:35mastermfsmaster[10132]:config:usingdefaultvalueforoption‘CHUNKS_LOOP_TIME’–’300′
# 以上日志内容省略的很多,主要是程序读取配置的过程。
# 下面的部分为检查元数据和检查数据存储服务器的情况(每 1 分钟检查一次)。
# 由于我这里还没有启动 chunkservers 因此在 chunkservers status: 的显示结果为空。total: usedspace: 的结果也为空。
- Oct1417:38:00mastermfsmaster[10132]:inodes:45
- Oct1417:38:00mastermfsmaster[10132]:dirnodes:3
- Oct1417:38:00mastermfsmaster[10132]:filenodes:42
- Oct1417:38:00mastermfsmaster[10132]:chunks:14
- Oct1417:38:00mastermfsmaster[10132]:chunkstodelete:0
- Oct1417:38:00mastermfsmaster[10132]:chunkserversstatus:
- Oct1417:38:00mastermfsmaster[10132]:total:usedspace:0(0GB),totalspace:0(0GB),usage:0.00%
设置服务随系统启动
- [root@master~]#echo“/usr/local/mfs/sbin/mfsmaster”>>/etc/rc.local
配置 chunkserver(数据存储服务器)
IP:192.168.108.161~164
- [root@chunkserver-1~]#vi/usr/local/mfs/etc/mfschunkserver.cfg
- #WORKING_USER=mfs
- #WORKING_GROUP=mfs
- #DATA_PATH=/usr/local/mfs/var/mfs
- #LOCK_FILE=/var/run/mfs/mfschunkserver.pid
- #SYSLOG_IDENT=mfschunkserver
- #BACK_LOGS=50
- #MASTER_RECONNECTION_DELAY=30
- MASTER_HOST=192.168.108.108
- #MASTER_PORT=9420
- #MASTER_TIMEOUT=60
- #CSSERV_LISTEN_HOST=*
- #CSSERV_LISTEN_PORT=9422
- #CSSERV_TIMEOUT=60
- #CSTOCS_TIMEOUT=60
- #HDD_CONF_FILENAME=/usr/local/mfs/etc/mfshdd.cfg
配置存储分区
- [root@chunkserver-1~]#vi/usr/local/mfs/etc/mfshdd.cfg
- 删除
- /mnt/hd1
- /mnt/hd2
- /mnt/hd3
- /mnt/hd4
添加独立的分区
/data
修改分区所有者为 mfs
- [root@chunkserver-1~]#chownmfs.mfs/data
注:mfschunkserver 服务器的主配置很简单,没有特殊要求只需要修改 MASTER_HOST 的地址即可。存储分区的配置选择一个独立的磁盘分区(分区必须大于 1G)。
启动 mfschunkserver
- [root@chunkserver-1~]#/usr/local/mfs/sbin/mfschunkserver
- [root@chunkserver-1~]#netstat-an|grep9420
- tcp00192.168.108.161:15099192.168.108.108:9420ESTABLISHED
同时查看系统日志
- Oct1417:53:45vm_web_1mfschunkserver[1992]:connecting…
- Oct1417:53:45vm_web_1mfschunkserver[1992]:connectedtoMaster
说明已经和 master 服务器成功连接
再查看 master 的日志查看
- Oct1417:59:00experimentmfsmaster[10132]:server1(192.168.108.161):usedspace:560484352(0GB),totalspace:4226125824(3GB),usage:13.26%
- Oct1417:59:00experimentmfsmaster[10132]:total:usedspace:560484352(0GB),totalspace:4226125824(3GB),usage:13.26%
同样也说明有一台 chunkserver 与自己连接,并给出了使用空间和剩余磁盘空间
剩余的 3 台 mfschunkserver 利用同样的方法配置好后启动 mfschunkserver 程序,这时候再查看 master 系统日志:
- Oct1615:27:00experimentmfsmaster[10132]:inodes:9
- Oct1615:27:00experimentmfsmaster[10132]:dirnodes:1
- Oct1615:27:00experimentmfsmaster[10132]:filenodes:8
- Oct1615:27:00experimentmfsmaster[10132]:chunks:18
- Oct1615:27:00experimentmfsmaster[10132]:chunkstodelete:0
- Oct1615:27:00experimentmfsmaster[10132]:chunkserversstatus:
- Oct1615:27:00experimentmfsmaster[10132]:server1(192.168.108.162):usedspace:924282880(0GB),totalspace:4226125824(3GB),usage:21.87%
- Oct1615:27:00experimentmfsmaster[10132]:server2(192.168.108.164):usedspace:924282880(0GB),totalspace:4226125824(3GB),usage:21.87%
- Oct1615:27:00experimentmfsmaster[10132]:server3(192.168.108.163):usedspace:924282880(0GB),totalspace:4226125824(3GB),usage:21.87%
- Oct1615:27:00experimentmfsmaster[10132]:server4(192.168.108.161):usedspace:924028928(0GB),totalspace:4226125824(3GB),usage:21.86%
- Oct1615:27:00experimentmfsmaster[10132]:total:usedspace:3696877568(3GB),totalspace:16904503296(15GB),usage:21.87%
这里可以看到有 4 台 chunkserver 已经连接到了 master
客户端挂载与工具使用
192.168.108.109
挂载 MFS
mfsmount
- [root@client~]#mkdir/mnt/mfs
- [root@client~]#mfsmount-h192.168.108.108
- *mfsmount 默认情况下将分区加载到 /mnt/mfs 目录下。如果想加载到其他目录请利用 - w 参数。
- mfsmount–help
- usage:/usr/local/mfs/bin/mfsmount[-r][-m][-c][-v0..2][-hmasterhost][-pmasterport][-lpath][-wmountpoint]
- r:readonlymode
- m:mountmetadata
- c:allowusingcache
- v:verboselevel
- defaults:
- h:mfsmaster
- p:9421
- l:/
- w:/mnt/mfs
修改 MFS 文件删除延迟时间
- mfsrsettrashtime
- [root@client~]#mfsrsettrashtime100/mnt/mfs/
- /mnt/mfs/:
- inodeswithtrashtimechanged:1(1)
- inodeswithtrashtimenotchanged:0(0)
- inodeswithpermissiondenied:0(0)
查看 MFS 文件删除延迟时间
- mfsrgettrashtime
- #mfsrgettrashtime/mnt/mfs/
- /mnt/mfs/:
- directorieswithtrashtime100:1(1)
- mfssettrashtime
- [root@client~]#mfssettrashtime60/mnt/mfs/
- /mnt/mfs/:60
- mfsgettrashtime
- [root@client~]#mfsgettrashtime/mnt/mfs/
- /mnt/mfs/:60
- 设置文件保存份数
- mfssetgoal
- [root@client~]#mfssetgoal4/mnt/mfs/
- /mnt/mfs/:4
- 查看文件保存保存数
- mfsgetgoal
- [root@client~]#mfsgetgoal/mnt/mfs/
- /mnt/mfs/:4
- mfsrsetgoal
- [root@client~]#mfsrsetgoal3/mnt/mfs/
- /mnt/mfs/:
- inodeswithgoalchanged:1(1)
- inodeswithgoalnotchanged:0(0)
- inodeswithpermissiondenied:0(0)
- mfsrgetgoal
- [root@client~]#mfsrgetgoal/mnt/mfs/
- /mnt/mfs/:
- directorieswithgoal3:1(1)
文件(文件夹)的查看(检查)命令
- 先生成 1 个 10M 的文件
- [root@client~]#ddif=/dev/zeroof=filebs=1Mcount=10
- [root@client~]#cpfile/mnt/mfs
- 文件信息查看
- mfsfileinfo
- [root@client~]#mfsfileinfo/mnt/mfs/file
- /mnt/mfs/file:
- chunk0:0000000000000001_00000001/(id:1ver:1)
- copy1:192.168.108.161:9422
- copy2:192.168.108.162:9422
- copy3:192.168.108.163:9422
- 文件检查
- mfscheckfile
- [root@client~]#mfscheckfile/mnt/mfs/file
- /mnt/mfs/file:
- 3copies:1chunks
目录信息查看
mfsdirinfo
- [root@client~]#rm/mnt/mfs/file
- [root@client~]#mkdir/mnt/mfs/newdir
- [root@client~]#cpfile/mnt/mfs/newdir
- [root@client~]#mfsdirinfo/mnt/mfs/newdir
- /mnt/mfs/newdir/:
- inodes:2(2)//inode 个数,1 个目录,1 个文件
- directories:1(1)// 1 个目录
- files:1(1)// 1 个文件
- goodfiles:1(1)// 正常文件个数
- undergoalfiles:0(0)
- missingfiles:0(0)
- chunks:1(1)
- goodchunks:1(1)
- undergoalchunks:0(0)
- missingchunks:0(0)
- length:10M(10485760)
- size:10M(10490880)// 这里是文件大小
- hddusage:30M(31472640)// 由于我设置文件份数为 3,因此这里为 3 *100M
- [root@client~]#cp/data/filenewdir/file_2
- /mnt/mfs/newdir/:
- inodes:3(3)
- directories:1(1)
- files:2(2)
- goodfiles:2(2)
- undergoalfiles:0(0)
- missingfiles:0(0)
- chunks:2(2)
- goodchunks:2(2)
- undergoalchunks:0(0)
- missingchunks:0(0)
- length:20M(20971520)
- size:20M(20981760)
- hddusage:60M(62945280)
创建文件快照
mfssnapshot
- [root@client/mnt/mfs/newdir]#mfssnapshotmysnapshotfile
- [root@client/mnt/mfs/newdir]#ll
- total30720
- -rw-r–r–1rootroot10485760Oct1616:43file
- -rw-r–r–1rootroot10485760Oct1616:44file_2
- -rw-r–r–1rootroot10485760Oct1616:58mysnapshot
- [root@monitor/mnt/mfs/newdir]#mfsfileinfomysnapshot
- mysnapshot:
- chunk0:0000000000000003_00000001/(id:3ver:1)
- copy1:192.168.108.161:9422
- copy2:192.168.108.162:9422
- copy3:192.168.108.163:9422
- [root@monitor/mnt/mfs/newdir]#mfsfileinfofile
- file:
- chunk0:0000000000000003_00000001/(id:3ver:1)
- copy1:192.168.108.161:9422
- copy2:192.168.108.162:9422
- copy3:192.168.108.163:9422
通过 mfsfileinfo 命令可以查看创建出来的文件快照,它只占用了一个 inode,并不占用磁盘空间,就像 ln 命令创建硬链接类似。但 mfsdirinfo 的显示似乎有些问题:
- [root@monitor/mnt/mfs/newdir]#mfsdirinfo/mnt/mfs/newdir/
- /mnt/mfs/newdir/:
- inodes:4(4)
- directories:1(1)
- files:3(3)
- goodfiles:3(3)
- undergoalfiles:0(0)
- missingfiles:0(0)
- chunks:3(3)
- goodchunks:3(3)
- undergoalchunks:0(0)
- missingchunks:0(0)
- length:30M(31457280)
- size:30M(31472640)
- hddusage:90M(94417920)
利用 mfsdirinfo 查看目录信息发现刚刚创建的快照文件也占用了与原文件相同大小的磁盘空间。但实际情况真的如此吗?
查看 master 的系统日志
- Oct1617:14:00experimentmfsmaster[24445]:inodes:5
- Oct1617:14:00experimentmfsmaster[24445]:dirnodes:2
- Oct1617:14:00experimentmfsmaster[24445]:filenodes:3
- Oct1617:14:00experimentmfsmaster[24445]:chunks:2
- Oct1617:14:00experimentmfsmaster[24445]:chunkstodelete:0
通过日志的 chunks: 2 可知有 2 个 chunks 刚刚 mfsfineinfo 查看文件得知 file 文件占用 1 个 chunks 那么 2 个 chunks 说明有 2 个文件。再往上看一行 filenodes: 3 说明文件 inode 数为 3 说明有 3 个文件,这正是 2 个文件 + 1 个快照文件。
查看各个 mfschunkserver 的 mfs 文件
通过查看 master 日志和查看各个数据存储服务器上的 mfs 文件,验证了我们刚才用 mfsfileinfo 的检查结果!文件快照,它只占用了一个 inode,并不占用磁盘空间,就像 ln 命令创建硬链接类似。
MooseFS 的详细介绍 :请点这里
MooseFS 的下载地址 :请点这里
相关阅读 :
分布式文件系统 MooseFS http://www.linuxidc.com/Linux/2012-06/62008.htm
在 CentOS 上安装部署 MooseFS 分布式文件系统 http://www.linuxidc.com/Linux/2013-06/85753.htm
MooseFS 分布式文件系统安装配置常见问题集 http://www.linuxidc.com/Linux/2013-06/85752.htm
MooseFS 分布式文件系统安装向导 PDF http://www.linuxidc.com/Linux/2013-06/85751.htm
DRBD+Heartbeat+Pacemaker 实现 MFS(MooseFS) 的高可用 http://www.linuxidc.com/Linux/2012-05/60699.htm