Rootop 服务器运维与web架构

mfs分布式集群安装及解决mfs单点故障

| 暂无评论

mfs中mfsmaster存在单点故障,这里通过keepalived+shell脚本解决。

思路:
利用keepalived进行vip切换,mfschunkserver包括客户端挂载全部用vip挂载。
当master当掉时,vip漂移到slave,通过任务计划,每分钟执行一下shell脚本,脚本检测是否发现vip。
如果发现,表明master当掉,slave执行日志恢复数据。
并启动slave中的mfsmaster服务,slave身份变为master。其中,数据变化日志部分通过scp+密钥认证定时推送
(或者是通过inotify+rsync实时同步。)

系统环境信息:
mfsmaster               centos6_x64   ip:192.168.0.8
mfsslave                   centos6_x64  ip:192.168.0.9
mfschunkserver_1 centos6_x64  ip:192.168.0.7
mfschunkserver_2 centos6_x64  ip:192.168.0.6
mfsclient                   centos6_x64  ip:192.168.0.127
keepalived VIP                                 ip:192.168.0.10

selinux关闭,iptables关闭

第一部分:配置keepalived

安装keepalived参考:http://www.rootop.org/pages/2102.html
配置keepalived参考:http://www.rootop.org/pages/2108.html
关于keepalived的配置一提而过,不需要太多配置,只要能实现vip漂移即可。
现在我的环境中已经实现keepalived正常运行,vip现漂移到mfsmaster。

第二部分:安装mfs

安装mfsmaster、chunkserver、mfsclient 日志服务器可用可不用,或者直接在某台chunkserver中运行即可。
至于mfsslave,其实就是mfsmaster,只是安装以后不需要启动服务(下面出现的脚本安装完成后会启动,并加入到/etc/rc.local自己去修改即可。)
安装过程可参考:http://www.rootop.org/pages/2227.html
这里的安装步骤如下:

从 http://www.rootop.org/rs/shell_scripts/install_mfs_v1.6.sh 下载写好的mfs安装脚本。
此脚本包含了安装mfsmaster、mfslog、mfschunkserver、mfsclient
有些地方需要修改为自己的实际配置,主要为变量部分:

tgz_name=mfs-1.6.11.tar.gz             #mfs版本源码包,如果是新版本需要修改
mfs_name=mfs-1.6.11                       #mfs解压后文件夹名称,如果是新版本需要修改
fuse=fuse-2.9.3.tar.gz                        #fuse版本源码包,如果是新版本需要修改
fuse_name=fuse-2.9.3                       #fuse解压后文件夹名称,如果是新版本需要修改

mfs_user=mfs                                    #mfs运行的用户
mfs_group=mfs                                  #mfs运行的用户组

mfs_path=/usr/local/mfs                  #mfs安装路径
mfs_sbin_path=$mfs_path/sbin     #mfs相关命令路径
mfs_data_path=$mfs_path/var/mfs     #元服务器数据日志路径,默认即可
allow_access=”192.168.0.0/24 / rw,maproot=0″    #允许访问mfsmaster的网段,需要修改为实际信息。
master_host=192.168.0.10       #vip的地址,用来mfschunkserver的连接和mfsclient的挂载
mfs_data=/mnt/mfs                #chunkserver的数据存储路径,根据实际情况修改。
mount_dir=/mnt/mfs             #mfsclient客户端挂载路径,根据实际情况修改。
其它无需修改。

执行 sh install_mfs_v1.6.sh 时,有4个安装选项。
——————Press 1 To install mfsmaster ———
——————Press 2 To install mfslog ———
——————Press 3 To install mfschunkserver ———
——————Press 4 To install mfsclient ———

1安装mfsmaster,2安装日志服务器,3安装chunkserver,4安装客户端


mfsmaster(192.168.0.8)选择1开始安装。
mfsslave(192.168.0.9)选择1开始安装。
mfschunkserver_1(192.168.0.7)选择3开始安装。
mfschunkserver_2(192.168.0.6)选择3开始安装。
mfsclient(192.168.0.127)选择4开始安装。

安装完成后去mfsclient查看是否写入数据。
安装完成!

第三部分:配置master->slave推送
之前想采用inotify+rsync,但是担心在传输过程中意外停止的话,会导致mfsmaster到slave的数据不完整。
采用了scp定时拷贝。因为scp拷贝数据会要求输入密码,这里采用密钥认证,略过密码输入。

在master中生成密钥:
[root@localhost ~]# ssh-keygen -t rsa
“`信息略过
[root@localhost ~]# cd .ssh/
[root@localhost .ssh]# ll
总用量 8
-rw——-. 1 root root 1675 4月 17 00:59 id_rsa
-rw-r–r–. 1 root root 408 4月 17 00:59 id_rsa.pub
[root@localhost .ssh]# scp id_rsa.pub root@192.168.0.9:/root/.ssh/authorized_keys #把master的公钥复制到slave的/root/.ssh/下并改为为authorized_keys

到slave中,更改公钥权限:
[root@localhost ~]# chmod 400 .ssh/authorized_keys
master通过scp再复制数据到slave时就不再提示密码。

在master中添加任务计划,每分钟复制一次数据变化日志到slave中:
*/1 * * * * scp /usr/local/mfs/var/mfs/* root@192.168.0.9:/usr/local/mfs/var/mfs/
重启任务计划。

第四部分:日志恢复
下面实现mfs的主从切换及数据恢复:
将下面脚本放到任务计划,每分钟执行一次。(不完美,想做到一秒一执行)

#!/bin/bash
VIP=192.168.0.10

if [ "$(ip a | grep $VIP | awk {'print $2'} | cut -d/ -f1)" == "$VIP" ];then
 if [ -a /tmp/mfs.lock ];then
 exit
 else
 touch /tmp/mfs.lock
 cd /usr/local/mfs/var/mfs
 /usr/local/mfs/sbin/mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog.*.mfs
 /usr/local/mfs/sbin/mfsmaster start

 fi

else
 exit
fi

脚本思想就是检测本机是否获取到vip,如果检测到表明master宕机,slave接管vip,然后需要恢复数据日志,继续提供服务。

至此,完成。

ps:
如果修复master后要把服务切换到master,首先需要把keepalived中的vip切换到master,然后停止slave的mfsmaster服务
删除/tmp/mfs.lock ,要将slave的数据变化日志拷贝到master,执行恢复。
以此保证宕机期间数据变化带来的数据不完整问题。

暂时能想到这么多,有什么问题可以email给我: venus@rootop.org

原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/2398.html

作者:Venus

专注于 服务器运维与web架构 E-mail:venus#rootop.org

发表评论