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参考:https://www.rootop.org/pages/2102.html
配置keepalived参考:https://www.rootop.org/pages/2108.html
关于keepalived的配置一提而过,不需要太多配置,只要能实现vip漂移即可。
现在我的环境中已经实现keepalived正常运行,vip现漂移到mfsmaster。
第二部分:安装mfs
安装mfsmaster、chunkserver、mfsclient 日志服务器可用可不用,或者直接在某台chunkserver中运行即可。
至于mfsslave,其实就是mfsmaster,只是安装以后不需要启动服务(下面出现的脚本安装完成后会启动,并加入到/etc/rc.local自己去修改即可。)。
安装过程可参考:https://www.rootop.org/pages/2227.html
这里的安装步骤如下:
从 https://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