MooseFS分布式文件系统+keepalived高可用+unison和intoify实时双机同步
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MooseFS分布式文件系统+keepalived高可用+unison和intoify实时双机同步相关的知识,希望对你有一定的参考价值。
3、Unison双向同步工具配置
3.1、Unison简介
Unison是Windows、Linux以及其他Unix平台下都可以使用的文件同步工具,它能使两个文件夹(本地或网络上的)保持内容的一致。Unison拥有与其它一些同步工具或文件系统的相同的特性,但也有自身的特点:
1.跨平台使用;
2.对内核和用户权限没有特别要求;
3.Unison是双向的,它能自动处理两分拷贝中更新没有冲突的部分,有冲突的部分将会显示出来让用户选择更新策略;
4.只要是能连通的两台主机,就可以运行unison,可以直接使用socket连接或安全的ssh连接方式,对带宽的要求不高,使用类似rsync的压缩传输协议。
3.2、安装Unison
我们需要在主机192.168.1.237和备机192.168.1.236上分别安装unison
1、安装ocaml
在Linux下通过源码安装unison的时候,需要首先安装一个名为objective caml compiler的工具,ocaml的版本应至少为3.0.7或者更高。
Ocaml下载地址 http://caml.inria.fr/pub/distrib/
Unison下载地址http://www.seas.upenn.edu/~bcpierce/unison//download/releases/
这里选择ocaml版本为ocaml-3.12.0
[[email protected]~]# tar -xzvf ocaml-3.12.0.tar.gz
[[email protected]~]# cd ocaml-3.12.0
[[email protected]]# ./configure
[[email protected]]# make world opt
[[email protected]]# make install
1、 安装unison
[[email protected] ~]# tar -xzvfunison-2.40.63.tar.gz
[[email protected] ~]# cdunison-2.40.63
[[email protected] unison-2.40.63]#make UISTYLE=text
[[email protected]]# make install
注意:在执行make install的过程中,可能会出现以下错误提示:
mv: cannot stat ‘/root/bin//unison‘: No such file or directory
make: [doinstall] Error 1 (ignored)
cp unison /root/bin/
cp: cannot create regular file ‘/root/bin/‘: Is a directory
make: *** [doinstall] Error 1
出现错误的原因在与Unison默认是将文件Copy到/root/bin目录,但Linux默认是没有该目录的,因此我们需要将生成的可执行文件unison复制到系统的PATH目录。
[[email protected] unison-2.40.63]# cp unison /usr/local/bin 然后再执行make install
3.3、配置ssh双机信任
我们要配置非root用户下的普通用户的ssh双机信任。这里我们使用安装mfs文件系统的时的mfs用户
在两台服务器上创建unison用户,主机server1的IP为192.168.1.237,备机server2的IP为192.168.1.236
[[email protected]~]# useradd -m mfs
[[email protected]~]# passwd mfs
[[email protected]~]# useradd -m mfs
[[email protected]~]# passwd mfs
在server1上创建key并配置server2的信任
[[email protected]~]# su - mfs
[[email protected]~]$ ssh-keygen -t rsa
在提示保存私钥(key)和公钥(public key)的位置时,使用默认值;
在提示是否需要私钥密码(passphrase)时,直接敲回车,即不使用私钥密码。
之后,将生成一对密钥,id_rsa(私钥文件)和id_rsa.pub(公钥文件),保存在/home/unison/.ssh/目录下。
将公钥添加到server2的 authorized_keys 文件中
[[email protected]~]$ cd /home/mfs/.ssh/
[[email protected]~]$ ssh 192.168.1.237 cat /home/mfs/.ssh/id_rsa.pub >> authorized_keys
[[email protected]~]$ ssh 192.168.1.236 cat /home/mfs/.ssh/id_rsa.pub >> authorized_keys
[[email protected]~]$ scp authorized_keys 192.168.1.236:/home/mfs/.ssh/
两台机器上都执行chmod600 /home/mfs/.ssh/authorized_keys,这个文件的权限一定要是600,至于为什么,你知道的!!!
然后分别在两台机器上执行:
[[email protected]~]$ ssh 192.168.1.237 date
[[email protected]~]$ ssh 192.168.1.236 date
在第一次执行时,会要求输入用户密码信息,再次执行时不需要输入密码就能显示系统日期,这说明ssh互相信任成功,在正式环境中,我们需要使用mfs这个用户,而不是unison用户。
注意:如果主备机更换了IP或者使用其他用户名用来同步,则需要重新配置ssh双机信任。否则同步无法使用。
3.4、Unison的使用
在正式使用unison之前最好测试一下,测试过之后它会自动在普通用户的家目录生成一个.unison的隐藏目录,这个隐藏目录里有三类文件,一种是随机命名的文件,记录文件同步实时信息,内容较少。default.prf默认配置文件,我们后面需要修改。unison.log记录所有同步事件。
在两台服务器上创建test目录,用于测试
[[email protected]~]# su - mfs
[[email protected]~]$ mkdir test
[[email protected]~]# su - mfs
[[email protected]~]$ mkdir test
在两台服务器上分别执行一次unison,如果出现提示确认,则直接敲回车选择默认值
需要说明的是:两台机器上需要同步的文件夹最好权限都是一样的,不然会出现错误信息。
[[email protected]~]$unison/home/mfs/test/ ssh://[email protected]//home/mfs/test/
[[email protected]~]$unison/home/mfs/test/ ssh://[email protected]//home/mfs/test/
注意事项:如果出现
bash:unisoncommand not found
Fatal error:Lost connection with the server
查看你的unison命令是否是系统的可执行命令,如果不是,加入到系统路径中。在上面的命令末尾加入参数-servercmd=/usr/local/bin/unison来告诉unison命令的位置。
如果正式使用的话,我们需要通过配置文件来使用unison。
修改两台服务器的unison配置文件,输入以下内容
[[email protected]~]$ vim /home/mfs/.unison/default.prf
#Unison preferences file
#force=/home/unison/test local->remote
root=/usr/local/mfs/var/mfs
root=ssh://[email protected]//usr/local/mfs/var/mfs
#path=aaa
#path=bbb
batch=true
#maxthreads=300
owner=true
group=true
perms=-1
fastcheck=false
rsync=false
sshargs=-C
xferbycopying=true
confirmbigdel=false
log=true
logfile=/home/mfs/.unison/unison.log
[[email protected]~]$ vim /home/mfs/.unison/default.prf
#Unison preferences file
#force=/home/unison/test local->remote
root=/usr/local/mfs/var/mfs
root=ssh://[email protected]//usr/local/mfs/var/mfs
#path=aaa
#path=bbb
batch=true
#maxthreads=300
owner=true
group=true
perms=-1
fastcheck=false
rsync=false
sshargs=-C
xferbycopying=true
confirmbigdel=false
log=true
logfile=/home/mfs/.unison/unison.log
相关注解如下:
两个root表示需要同步的文件夹。
force表示会以本地所指定文件夹为标准,将该目录同步到远端。这里需要注意,如果指定了force参数,那么Unison就变成了单项同步了,也就是说会以force指定的文件夹为准进行同步,类似与rsync。
ignore = Path表示忽略指定目录,即同步时不同步它。
batch = true,表示全自动模式,接受缺省动作,并执行。
-fastcheck true 表示同步时仅通过文件的创建时间来比较,如果选项为false,Unison则将比较两地文件的内容。
log = true 表示在终端输出运行信息。
logfile 指定输出的log文件。
另外,Unison有很多参数,这里仅介绍常用的几个,详细的请参看Unison手册。
-auto //接受缺省的动作,然后等待用户确认是否执行。
-batch //batch mode, 全自动模式,接受缺省动作,并执行。
-ignore xxx //增加 xxx 到忽略列表中
-ignorecase [true|false|default] //是否忽略文件名大小写
-follow xxx //是否支持对符号连接指向内容的同步
owner = true //保持同步过来的文件属主
group = true //保持同步过来的文件组信息
perms = -1 //保持同步过来的文件读写权限
repeat = 1 //间隔1秒后,开始新的一次同步检查
retry = 3 //失败重试
sshargs = -C //使用ssh的压缩传输方式
xferbycopying = true"
-immutable xxx //不变目录,扫描时可以忽略
-silent //安静模式
-times //同步修改时间
-path xxx 参数 //只同步 -path 参数指定的子目录以及文件,而非整个目录,-path 可以多次出现。
confirmbigdel = false #true表示当需要同步的两个目录一个为空时,unison将停止 false表示同步的某个目录为空时不会停止运转
PS:Windows下的unison配置文件默认位于C:\Documentsand Settings\currentuser\.unison目录,默认的配置文件名是default.prf。
Unison双向同步基本原理是:假如有A B两个文件夹,A文件夹把自己的改动同步到B,B文件夹也把自己的改动同步到A,最后A B两文件夹的内容相同,是AB文件夹的合集。
Unison双向同步的一个缺点是,对于一个文件在两个同步文件夹中都被修改时,unison是不会去同步的,因为unison无法判断以那个为准,需要人工指定。
3.5、Unison测试
首先分别在server1与server2的/usr/local/mfs/var/mfs目录下创建文件或目录,然后在server1上执行unison,接着如果在server1与server2上都能看到各自创建的文件,就说明同步成功。
分别在server1与server2上创建文件
[[email protected]~]$ cd /usr/local/mfs/var/mfs
[[email protected]]$ touch 1.txt touch 3.txt
[[email protected]~]$ cd /usr/local/mfs/var/mfs
[[email protected]]$ touch 2.txt touch 4.txt
在server1上执行unison
[[email protected]~]$ unison
在server1与server2上查看文件是否同步
[[email protected]~]$ cd /usr/local/mfs/var/mfs
[[email protected]]$ ls
1.txt2.txt 3.txt 4.txt
[[email protected]~]$ cd /usr/local/mfs/var/mfs
[[email protected]]$ ls
1.txt2.txt 3.txt 4.txt
均看到了“1.txt 2.txt 3.txt4.txt”所有文件,说明文件同步已经成功!
3.6、安装inotify-tools
考虑到unison的双向同步性,我们不可能使用日常调度来执行unison同步,所以加入监控机制inotify。
1、查看系统是否支持inotify
[[email protected]~]# ls -l /proc/sys/fs/inotify
total0
-rw-r--r--1 root root 0 Nov 11 11:25 max_queued_events
-rw-r--r--1 root root 0 Nov 11 11:25 max_user_instances
-rw-r--r--1 root root 0 Nov 11 11:25 max_user_watches
则说明支持inotify.
inotify可以监视的文件系统事件包括:
IN_ACCESS,即文件被访问
IN_MODIFY,文件被 write
IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
IN_CLOSE_WRITE,可写文件被 close
IN_CLOSE_NOWRITE,不可写文件被 close
IN_OPEN,文件被 open
IN_MOVED_FROM,文件被移走,如 mv
IN_MOVED_TO,文件被移来,如 mv、cp
IN_CREATE,创建新文件
IN_DELETE,文件被删除,如 rm
IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
2、安装inotify
[[email protected]~]# tar -zxvf inotify-tools-3.14.tar.gz
[[email protected]~]# cd inotify-tools-3.14
[[email protected] ~ inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify
[[email protected] ~ inotify-tools-3.14]# make && make install
可能出现的问题:
Please increase the amount of inotify watches allowed per user via`/proc/sys/fs/inotify/max_user_watches‘.
cat一下这个文件,默认值是8192,
echo 8192000 >> /proc/sys/fs/inotify/max_user_watches
我们增大一下线程即可~,这样加入后重启后没了,需要加入开机启动中。
2、 编写inotify实时监控脚本
[[email protected]~]# vim unison.sh
#!/bin/bash
DESTHOST=192.168.1.56
DESTHOSTDIR=/home/unison/test
SRCDIR=/home/unison/test
/usr/local/inotify/bin/inotifywait-mrq --timefmt ‘%d/%m/%y %H:%M‘ --format‘%T %w %f‘ -e create,delete,modify,move$SRCDIR | while read files
do
unison-servercmd=/usr/local/bin/unison
done
chmod755 unison.sh, 按同样方法在server2安装inotify和编写同步脚本
3、 分别在server1和server2的unison用户下让脚本在后台运行
[[email protected] ~]$ nohup./unison.sh &
[[email protected] ~]$nohup ./unison.sh &
在正式环境中,只在主机上执行了nohup./unison.sh &,备机不用执行,这样也是可以的,如果主机发生故障,切换到备机上,备机开始工作,数据读写记录到metadata里,当主机恢复后,备机工作那段时间内所记录的数据可能不会马上同步过来,不过不用担心,这部分数据不会丢失,只要有新数据在mfs客户端写入或者主机有变化之后,备机上那部分数据就会自动同步过来。这样在主机上执行unison同步的方式,可能会导致在故障情况下数据的不及时性,为了同步更加及时,建议主备机上都执行unison同步。
Unison因为是双向同步,必然有它的弊端,如果发生意外故障,破坏了同步目录里面的文件,那么会影响正常业务的使用的,所以做好同步目录的数据备份是很重要的。
3.7、模拟mfs故障测试
1、当主机故障时,自动切换到备机,备机正常启动了mfsmaster而且没有数据丢失。但是在恢复主机mfsmaster时,提示由于缺少metadata.mfs造成无法启动,这时我们可以在主机执行恢复性操作,让它自动产生metadata.mfs,具体方法为使用/usr/local/mfs/sbin/mfsmaster -a 就可以启动mfsmaster,而且数据不会丢失。这是和先前的mfs1.6.27版本的恢复方式不一样的地方。
2、在同步相同文件时,如果该文件被锁定(比如mfsmaster启动时的.lock文件)或者是同时修改,unison不会对该文件进行同步,会自动跳过。
3.8、mfs监控脚本
1、需在被监控机上需要安装好nagios-plugins和nrpe,我们直接编辑一个check_mfs的脚本,编写完把这个脚本复制到/usr/local/nagios/libexec/下,并赋权755,内容如下:
#!/bin/bash
#a nagios plugin for checkmoosefs healthy
CHECK_OK=0
CHECK_WARNING=1
CHECK_CRITICAL=2
CHECK_UNKNOWN=3
CHECK_MASTER () {
check_process=`psaux|grep ‘/usr/local/mfs/sbin/mfsmaster‘|grep -v grep`
check_port=`netstat-lunpt|grep ‘:9419‘`
if [ -n"$check_process" -a -n "$check_port" ]
then
echo "mfsmasteris OK"
exit 0
else
echo "mfsmasteris not running"
exit 2
fi
}
CHECK_CHUNK () {
check_process=`psaux|grep ‘/usr/local/mfs/sbin/mfschunkserver‘|grep -v grep`
check_port=`netstat-lunpt|grep ‘:9422‘`
if [ -n"$check_process" -a -n "$check_port" ]
then
echo"mfschunkserver is OK"
exit 0
else
echo"mfschunkserver is not running"
exit 2
fi
}
CHECK_CLIENT () {
check_process=`psaux|grep ‘/usr/local/mfs/bin/mfsmount‘|grep -v grep`
if [ -n"$check_process" ]
then
echo "mfsclientis OK"
exit 0
else
echo "mfsclientis not running"
exit 2
fi
}
CHECK_METALOGGER () {
check_process=`psaux|grep ‘/usr/local/mfs/sbin/mfsmetalogger‘|grep -v grep`
if [ -n"$check_process" ]
then
echo"mfschunkserver is OK"
exit 0
else
echo"mfschunkserver is not running"
exit 2
fi
}
case "$1" in
-M)
CHECK_MASTER
;;
-c)
 
以上是关于MooseFS分布式文件系统+keepalived高可用+unison和intoify实时双机同步的主要内容,如果未能解决你的问题,请参考以下文章