####################################
##### 网络架构 #########################################(一) 网络架构M1: 192.168.1.138 主服务器,存储块服务器,客户端M2: 192.168.1.139 日志服务器,备份主控服务器,存储块服务器
####################################
#### 具体安装配置测试 ##########################################(一) 主服务器M11 创建默认用户与用户组。这里我们使用的是www用户组的www用户 创建过程略2 解压安装mfs-1.6.24-1.tar.gz[root@M1 software]# tar -zxvf mfs-1.6.24-1.tar.gz [root@M1 software]# cd mfs-1.6.24[root@M1 mfs-1.6.24]# ./configure --prefix=/data/apps/mfs --with-default-user=www --with-default-group=www --enable-mfsmount # 由于等下M1还要用来做客户端,所以这里要加上--enable-mfsmount选项。如果出现 configure: error: mfsmount build was forced, but fuse library is too old or not installed的错误则[root@M1 mfs-1.6.24]# yum -y install fuse*[root@M1 mfs-1.6.24]# make[root@M1 mfs-1.6.24]# make install
(二) 元数据日志服务器、备份主控服务器安装
和主服务器相同。。。。。略。。。。。(三) 客户端安装M11 安装fuseyum -y install fuse* (或者yum install kernel.x86_64 kernel-devel.x86_64 kernel-headers.x86_64 ###reboot server#### yum install fuse.x86_64 fuse-devel.x86_64 fuse-libs.x86_64)2 安装mfs-1.6.24-1.tar.gz 由于这里是共用的服务器M1,所以在第一步时已经安装好
(四) 配置各个服务器
1 主控服务器M1配置1.1[root@M1 etc]# cp -a mfsmaster.cfg.dist mfsmaster.cfg # 主配置文件我们使用默认的配置,把文件里面的注释打开即可1.2 [root@M1 etc]# vi mfsexports.cfg# 配置客户端挂载相关的权限文件 192.168.1.138 和 192.168.1.139 有读写的权限并且密码为123456 并且文件自动映射为www用户192.168.1.138 / rw,alldirs,maproot=503,password=123456192.168.1.139 / rw,alldirs,maproot=503,password=1234561.3[root@M1 etc]# cp /data/apps/mfs/var/mfs/metadata.mfs.empty /data/apps/mfs/var/mfs/metadata.mfs # 复制出初始的元数据文件1.4# 启动master服务[root@M1 etc]# /data/apps/mfs/sbin/mfsmaster start
2 元数据日志服务器配置2.1 更改日志服务器[root@M2 mfs]# cd /data/apps/mfs/etc/[root@M2 etc]# cp mfsmetalogger.cfg.dist mfsmetalogger.cfg[root@M2 etc]# vi mfsmetalogger.cfg # 把主服务器的ip和端口地址写上MASTER_HOST = 192.168.1.138MASTER_PORT = 9419META_DOWNLOAD_FREQ = 1 # 即每小时复制一次metadata.mfs.back文件,减少恢复的延迟时间2.2 启动日志服务器[root@M2 etc]# /data/apps/mfs/sbin/mfsmetalogger start
3 存储块服务器配置由于我的M1与M2均为存储块服务器,两台服务器配置相同这里值列出M1上存储块服务器的配置。M2类似3.1 配置mfschunkserver.cfg[root@M1 etc]# cp mfschunkserver.cfg.dist mfschunkserver.cfg[root@M1 etc]# vi mfschunkserver.cfg # 指定元数据服务器的ip地址和相应的端口MASTER_HOST = 192.168.1.138MASTER_PORT = 94203.2 服务器上创建存储文件的目录[root@M1 etc]# mkdir /mfstest[root@M1 etc]# chown -R www:www /mfstest3.3 配置 /data/apps/mfs/etc/mfshdd.cfg[root@M1 etc]# cp mfshdd.cfg.dist mfshdd.cfg[root@M1 etc]# vi mfshdd.cfg/mfstest3.4 存储块服务器启动[root@M1 etc]# /data/apps/mfs/sbin/mfschunkserver start
4 客户端配置,这里我把M1配置成客户端[root@M1 etc]# /data/apps/mfs/bin/mfsmount /data/wwwroot/web/sharemfs -p -H 192.168.1.138MFS Password:mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root[root@M1 etc]# df -Th # 可以看到下面一行说明挂载成功192.168.1.138:9421 fuse.mfs 23G 0 23G 0% /home/data/wwwroot/web/sharemfs
5 客户端测试[root@M1 etc]# cd /data/wwwroot/web/sharemfs[root@M1 sharemfs]# echo "111111111111111111" > 1.txt[root@M1 sharemfs]# ls1.txt此时我们要是把M2也做成客户端挂载的话也可以看到1.txt 这个文件
######################################
### mfs服务的管理 ##########################################(一) 启动MooseFS集群1 启动mfsmaster进程[root@M1 ~]# /data/apps/mfs/sbin/mfsmaster start # 如果元服务器启动不了,则cp metadata.mfs.empty metadata.mfs2 启动所有的mfschunkserver进程[root@M1 ~]# /data/apps/mfs/sbin/mfschunkserver start3 启动mfsmetalogger 进程[root@M2 ~]# /data/apps/mfs/sbin/mfsmetalogger start4 挂载 /data/apps/mfs/bin/mfsmount /data/wwwroot/web/sharemfs -p -H 192.168.1.138
(二) 停止MooseFS集群安全的停止MooseFS集群
1 在所有的客户端卸载MooseFS 文件系统 (在M1和M2上都要卸载)[root@M1 sharemfs]# umount /home/data/wwwroot/web/sharemfs/2 用mfschunkserver -s 命令停止所有的chunkserver进程[root@M1 ~]# /data/apps/mfs/sbin/mfschunkserver -s3 用mfsmetalogger –s命令停止metalogger进程[root@M2 ~]# /data/apps/mfs/sbin/mfsmetalogger -s4 停止掉元服务器[root@M1 ~]# /data/apps/mfs/sbin/mfsmaster -s
(三) 文件备份次数设置(副本份数),和查看
默认情况下我们在服务器上创建的文件或者是文件夹只是在一个chunk中有保存,如果组成整个mfs系统的某一个chunk块宕机的话,会造成整个mfs系统的数据不完整。这样就没有达到高可用的要求。所以我们要在客户端设置文件在创建的时候同时保存在chunk1 和 chunk2 上各一份,这样无论是chunk1宕机或chunk2宕机客户端都可以得到一份完整的数据1 [root@M1 sharemfs]# /data/apps/mfs/bin/mfsfileinfo /data/wwwroot/web/sharemfs/3.txt # 这是默认情况下在客户端创建的3.txt文件,现在这个文件只在192.168.1.139有一份数据/data/wwwroot/web/sharemfs/3.txt: chunk 0: 0000000000000003_00000001 / (id:3 ver:1) copy 1: 192.168.1.139:94222 改成在两台服务器上都保存有数据(设置副本数为2。注:具体数目看当前chunk服务器数量)[root@M1 sharemfs]# /data/apps/mfs/bin/mfssetgoal -r 2 /data/wwwroot/web/sharemfs/过一段时间后(这段时间主要是同步用)[root@M1 sharemfs]# /data/apps/mfs/bin/mfsfileinfo /data/wwwroot/web/sharemfs/3.txt # 发现文件已经在两台服务器上都有数据/data/wwwroot/web/sharemfs/3.txt: chunk 0: 0000000000000003_00000001 / (id:3 ver:1) copy 1: 192.168.1.138:9422 copy 2: 192.168.1.139:9422# 其实我们在创建文件夹或者是指定挂载目录的时候就指定文件的保存份数,这样以后在创建文件的时候就会马上有两份。如下[root@M1 sharemfs]# echo "bbbbbbbbbbbbbbbb" > html2/b.html[root@M1 sharemfs]# /data/apps/mfs/bin/mfsfileinfo /data/wwwroot/web/sharemfs/html2/b.html /data/wwwroot/web/sharemfs/html2/b.html: chunk 0: 0000000000000006_00000001 / (id:6 ver:1) copy 1: 192.168.1.138:9422 copy 2: 192.168.1.139:9422注:对一个目录设定“goal”,此目录下的新创建文件和子目录均会继承此目录的设定,但不会改变已经存在的文件及目录的copy份数。但使用-r选项可以更改已经存在的copy份数。
(四) 挂载点管理
比如我们想创建多个挂载点来挂载文件,比如说我们想把/data/wwwroot/web/sharemfs/mfsshare/share2/挂载到 /data/wwwroot/web/sharemfs2,把/data/wwwroot/web/sharemfs/mfsshare/share1/,挂载到/data/wwwroot/web/sharemfs1 上1 [root@M1 ~]# vi /data/apps/mfs/etc/mfsexports.cfg # 更改挂载点的配置文件192.168.1.138 / rw,alldirs,maproot=0,password=passcode192.168.1.139 / rw,alldirs,maproot=0,password=passcode192.168.1.138 /mfsshare/share1 rw,alldirs,maproot=0,password=passcode192.168.1.139 /mfsshare/share1 rw,alldirs,maproot=0,password=passcode192.168.1.138 /mfsshare/share2 rw,alldirs,maproot=0,password=passcode192.168.1.139 /mfsshare/share2 rw,alldirs,maproot=0,password=passcode2 重启mfs服务器 注:#如果修改挂载点但是我们的元服务器又在线上运行则可以使用[root@M1 etc]# /data/apps/mfs/sbin/mfsmaster reload 重新加载配置文件3 首先挂载 / 目录[root@M1 etc]# /data/apps/mfs/bin/mfsmount /data/wwwroot/web/sharemfs -p -H 192.168.1.1384 挂载完之后再创建/data/wwwroot/web/sharemfs/mfsshare/share1/ 文件夹[root@M1 sharemfs]# mkdir /data/wwwroot/web/sharemfs/mfsshare/share1/ [root@M1 sharemfs]# chown -R www:www /data/wwwroot/web/sharemfs/mfsshare/share1/5 创建挂载点[root@M1 sharemfs]# mkdir /data/wwwroot/web/sharemfs1[root@M1 sharemfs]# chown -R www:www /data/wwwroot/web/sharemfs16 挂载相应的目录[root@M1 sharemfs]# /data/apps/mfs/bin/mfsmount /data/wwwroot/web/sharemfs1 -p -H 192.168.1.138 -S /mfsshare/share1 (因为挂载点的根目录是/data/wwwroot/web/sharemfs -S 后面接的参数是相对于根目录所以是/mfsshare/share1。注意挂载其他目录之前一定要先挂载根目录)
(五)图形化界面管理
[root@M1 ~]# /data/apps/mfs/sbin/mfscgiserv 启动图形话相关的web gui在浏览器上输入http://192.168.1.138:9425/mfs.cgi即可访问到相应的界面[root@M1 ~]# /data/apps/mfs/sbin/mfscgiserv stop # 停止web gui 进程
(六)回收站
[root@M1 ~]# mkdir /home/data/wwwroot/web/sharemfsrecover # 创建回收站挂载点[root@M1 ~]# chown -R www:www /home/data/wwwroot/web/sharemfsrecover # 修改权限[root@M1 ~]# vi /data/apps/mfs/etc/mfsexports.cfg # 如果不添加这一行会出现权限问题* . rw # 添加这一行[root@M1 ~]# /data/apps/mfs/sbin/mfsmaster reload # 重新加载配置文件reload signal has beed sent[root@M1 ~]# /data/apps/mfs/bin/mfsmount -m /data/wwwroot/web/sharemfsrecover/ -p -H 192.168.1.138 # -m参数设置挂载点MFS Password:mfsmaster accepted connection with parameters: read-write,restricted_ip[root@M1 ~]# /data/apps/mfs/bin/mfsgettrashtime /data/wwwroot/web/sharemfs/1.txt # 查看文件在回收站的保存时间/data/wwwroot/web/sharemfs/1.txt: 86400[root@M1 ~]# /data/apps/mfs/bin/mfssettrashtime 0 /data/wwwroot/web/sharemfs/2.txt # 设置在回收站中保存的时间/data/wwwroot/web/sharemfs/2.txt: 0[root@M1 ~]# /data/apps/mfs/bin/mfsgettrashtime /data/wwwroot/web/sharemfs/2.txt /data/wwwroot/web/sharemfs/2.txt: 0# 文件删除后恢复[root@M1 ~]# rm -f /data/wwwroot/web/sharemfs/3.txt [root@M1 trash]# cd /data/wwwroot/web/sharemfsrecover/trash/[root@M1 trash]# ls00000005|3.txt 00000010|mfsxwj.txt 00000012|mfsdwj.txt undel0000000E|mfsxwj.txt 00000011|mfsxwj2.txt 00000013|mfsdwj2.txt[root@M1 trash]# mv 00000005\|3.txt ./undel/ # 恢复文件[root@M1 trash]# ls /data/wwwroot/web/sharemfs/3.txt # 发现文件已经恢复/data/wwwroot/web/sharemfs/3.txt
(七) 元数据文件的备份
主要备份的数据有:/data/apps/mfs/var/mfs/metadata.mfs.back # 主要元数据文件metadata.mfs,当mfsmaster 运行的时候会被命名为metadata.mfs.back。这个文件是保存在元数据服务器上的相应目录[root@M2 ~]# ll /data/apps/mfs/var/mfs/ # 元数据改变日志changelog.*.mfs,存储了过去的N 小时的文件改变(N 的数值是由BACK_LOGS参数设置的,参数的设置在mfschunkserver.cfg 配置文件中)total 964-rw-r----- 1 www www 31 Mar 15 07:21 changelog_ml.19.mfs-rw-r----- 1 www www 792 Mar 16 01:38 changelog_ml.1.mfs-rw-r----- 1 www www 159 Mar 15 03:41 changelog_ml.23.mfs-rw-r----- 1 www www 26 Mar 15 23:25 changelog_ml.3.mfs-rw-r----- 1 www www 33 Mar 14 07:20 changelog_ml.43.mfs-rw-r----- 1 www www 159 Mar 14 03:46 changelog_ml.47.mfs-rw-r----- 1 www www 19020 Mar 15 22:06 changelog_ml.4.mfs-rw-r----- 1 www www 1704 Mar 13 07:31 changelog_ml.50.mfs-rw-r----- 1 www www 2063 Mar 15 21:59 changelog_ml.5.mfs-rw-r----- 1 www www 0 Mar 16 02:10 changelog_ml_back.0.mfs-rw-r----- 1 www www 792 Mar 16 02:10 changelog_ml_back.1.mfs-rw-r----- 1 www www 915016 Mar 16 02:00 csstats.mfs-rw-r--r-- 1 root root 8 Mar 12 02:34 metadata.mfs.empty-rw-r----- 1 www www 2309 Mar 16 02:10 metadata_ml.mfs.back-rw-r----- 1 www www 978 Mar 16 02:12 sessions_ml.mfs主要的元数据文件需要定期备份,备份的频率取决于取决于多少小时changelogs 储存。元数据changelogs 实时的自动复制。1.6版本中这个工作都由metalogger完成。
####################################################
#### 故障解决 ########################################################(一) 其中某一台chunk服务器宕机。注意:下面的情况是发生在每个文件的goal(目标)都不小于2 并且没有under-goal 文件(这些可以用mfsgetgoal –r和mfsdirinfo 命令来检查现在我们模拟M2服务器宕机,此时我们的数据只会显示在M2上的那一份。但是完全不影响我们访问[root@M1 sharemfs]# /data/apps/mfs/bin/mfsfileinfo /data/wwwroot/web/sharemfs/3.txt /data/wwwroot/web/sharemfs/3.txt: chunk 0: 0000000000000003_00000001 / (id:3 ver:1) copy 1: 192.168.1.138:9422[root@M1 sharemfs]# echo "66666666666666666666" > 6.txt # 现在我们创建一个新的文件[root@M1 sharemfs]# /data/apps/mfs/bin/mfsfileinfo /data/wwwroot/web/sharemfs/6.txt # 服务器上只保留了一份文件/data/wwwroot/web/sharemfs/6.txt: chunk 0: 000000000000000C_00000001 / (id:12 ver:1) copy 1: 192.168.1.138:9422 # 现在我们恢复M2服务器[root@M1 sharemfs]# /data/apps/mfs/bin/mfsfileinfo /data/wwwroot/web/sharemfs/6.txt /data/wwwroot/web/sharemfs/6.txt: chunk 0: 000000000000000C_00000001 / (id:12 ver:1) copy 1: 192.168.1.138:9422 copy 2: 192.168.1.139:9422发现新的文件直接就同步到M2上了
(二) 元服务器宕机与恢复
# 现在我们来模拟元服务器宕机[root@M1 sharemfs]# echo "mfs down test" > mfs_down_test.txt # 我们先往挂载点写入一个文件[root@M1 sharemfs]# ps aux | grep mfswww 15237 0.0 14.3 96644 33988 ? S< Mar12 3:52 /data/apps/mfs/sbin/mfsmaster start。。。。。。。 略。。。。。。。[root@M1 sharemfs]# cd1) 直接强制杀死主进程来终止服务[root@M1 ~]# kill -9 15237 # 直接强制杀死主进程来终止服务[root@M1 mfs]# /data/apps/mfs/sbin/mfsmaster start # 此时启动元服务器会失败[root@M1 mfs]# /data/apps/mfs/sbin/mfsmetarestore -a # 恢复元服务器[root@M1 mfs]# /data/apps/mfs/sbin/mfsmaster start # 再次启动,发现启动成功[root@M1 mfs]# cd /data/wwwroot/web/sharemfs[root@M1 sharemfs]# ls1.txt 2.txt 3.txt 4.txt 5.txt 6.txt html1 html2 mfs_down_test.txt mfsshare # 发现数据也都是存在的# 注:有时候执行 [root@M1 mfs]# /data/apps/mfs/sbin/mfsmetarestore -a 会出现 error: 32 (Data mismatch) # 数据不匹配出现的结果解决方法 [root@M1 mfs]# mv metadata.mfs.back metadata.mfs [root@M1 mfs]# /data/apps/mfs/sbin/mfsmaster start 不过会造成小部分数据丢失。这时候只要等待一小时后数据同步结束自然问题就解决了2) 误操作删除了元服务器的数据导致无法启动--这时我们可以利用日志服务器来恢复2[root@M1 mfs]# kill -9 19886 # 直接强制杀死主进程来终止服务[root@M1 mfs]# pwd/data/apps/mfs/var/mfs[root@M1 mfs]# mv ./* /root/backup/ # 移除掉mfs的元数据节点的元数据文件[root@M1 mfs]# /data/apps/mfs/sbin/mfsmetarestore -a # 发现恢复不了can't find backed up metadata file !!!# 从日志服务器上copy内容来恢复[root@M1 mfs]# scp -P 60920 192.168.1.139:/data/apps/mfs/var/mfs/* ./[root@M1 mfs]# chown www:www ./* # 更改权限[root@M1 mfs]# mv changelog_ml.0.mfs changelog.0.mfs # 重命名把文件名中的_ml去除[root@M1 mfs]# mv changelog_ml.21.mfs changelog.21.mfs 。。。。。。。。。。。。。。。。 略。。。。。。。。。。。。。。。。[root@M1 mfs]# mv metadata_ml.mfs.back metadata.mfs.back [root@M1 mfs]# mv sessions_ml.mfs sessions.mfs [root@M1 mfs]# /data/apps/mfs/sbin/mfsmetarestore -a # 再次恢复,发现成功了[root@M1 mfs]# /data/apps/mfs/sbin/mfsmaster start # 再次启动,发现成功了注:第一种恢复方法不会丢失数据;第二种恢复方法最多会丢失1h的数据(具体是在log服务器配置文件中的META_DOWNLOAD_FREQ项指定)。
(三) 误删文件恢复
参照回收站一节######################################################## 性能测试及比较(在虚拟机上进行的) ########################################################(一) 本机测试1 小文件[root@M1 ~]# dd if=/dev/zero of=xiaowenjian.txt bs=100K count=50005000+0 records in5000+0 records out512000000 bytes (512 MB) copied, 12.0778 s, 42.4 MB/s2 大文件[root@M1 ~]# dd if=/dev/zero of=dawenjian.txt bs=10M count=5050+0 records in50+0 records out524288000 bytes (524 MB) copied, 13.6094 s, 38.5 MB/s (二) GFS测试1 小文件[root@M1 ~]# dd if=/dev/zero of=/home/data/wwwroot/web/share/gfsxwj.txt bs=100K count=50005000+0 records in5000+0 records out512000000 bytes (512 MB) copied, 43.115 s, 11.9 MB/s2 大文件[root@M1 ~]# dd if=/dev/zero of=/home/data/wwwroot/web/share/gfsdwj2.txt bs=10M count=5050+0 records in50+0 records out524288000 bytes (524 MB) copied, 42.9625 s, 12.2 MB/s (三) MooseFs1 小文件[root@M1 ~]# dd if=/dev/zero of=/home/data/wwwroot/web/sharemfs/mfsxwj2.txt bs=100K count=50005000+0 records in5000+0 records out512000000 bytes (512 MB) copied, 32.6133 s, 15.7 MB/s[root@M1 ~]# dd if=/dev/zero of=/home/data/wwwroot/web/sharemfs/mfsdwj.txt bs=10M count=5050+0 records in50+0 records out524288000 bytes (524 MB) copied, 37.6028 s, 13.9 MB/s