(一)软件包的准备:php
(1)unison-2.32.52.tar.gzhtml
(2)ocaml-3.10.2.tar.gzlinux
(3)inotify-tools-3.14.tar.gzweb
以上包名自行复制粘贴到百度,搜索后下载。shell
或者去本人百度云盘下载:http://pan.baidu.com/s/1b0foSI 提取码:zqbpvim
(二)环境介绍:bash
(1)服务器A:192.168.23.116 CentOS_7.0服务器
(2)服务器B:192.168.23.117 CentOS_7.0app
服务器A和B须要实时同步的目录名称均为userfiles和test。这两个目录的路径均为/usr/local/web_server/userfiles和/usr/local/web_server/tset。ssh
(三)具体操做介绍:
-----------------如下操做在服务器A和服务器B上如出一辙-----------------
自行创建一个目录tongbuzhuanyong,用来作实验:
# mkdir /usr/local/tongbuzhuanyong
# cd /usr/local/tongbuzhuanyong
# tar xvf inotify-tools-3.14.tar.gz
# tar xvf ocaml-3.10.2.tar.gz
# tar xvf unison-2.32.52.tar.gz
编译安装inotify:
# cd /usr/local/tongbuzhuanyong/inotify-tools-3.14
# ./configure --prefix=/usr/local/tongbuzhuanyong/inotify
# make
# make install
# cd /usr/local/tongbuzhuanyong/inotify
# echo "PATH=/usr/local/tongbuzhuanyong/inotify/bin:$PATH" > /etc/profile.d/inotify.sh
# source /etc/profile.d/inotify.sh
# echo "/usr/local/tongbuzhuanyong/inotify/lib" > /etc/ld.so.conf.d/inotify.conf
# ldconfig -v | grep inotify
执行上述命令并看到上图红圈中内容后方可继续往下,不然回头检查错误。最后创建软连接,将库文件添加到系统能识别的路径:
# ln -sv /usr/local/tongbuzhuanyong/inotify/include
/usr/include/inotify
编译安装ocaml:
# cd /usr/local/tongbuzhuanyong/ocaml-3.10.2
#./configure
#make world opt
#make install
以上make过程须要几分钟的时间,耐心等待。
编译安装unison,先安装依赖包,再编译。yum安装依赖包便可:
# cd /usr/local/tongbuzhuanyong/unison-2.32.52
# yum -y install ctags-etags
# make UISTYLE=text
# make install
此时make install会报错,意思是没有找到/root/bin目录或者某个文件,以下作便可:
# cp ./unison /usr/local/bin
(四)创建服务器A和服务器B之间免密钥通讯:
-----------------如下操做在服务器A和服务器B上如出一辙-----------------
请务必先在A、B服务器上运行下列命令:
# ssh-keygen -t rsa # 连续回车三次,生成密钥
-----------------------如下操做在服务器A上执行------------------------
# cd /root/.ssh
# scp ./id_rsa.pub root@192.168.23.117:/root/.ssh/authorized_keys
-----------------------如下操做在服务器B上执行------------------------
# cd /root/.ssh
# scp ./id_rsa.pub root@192.168.23.116:/root/.ssh/authorized_keys
-----------------如下操做在服务器A和服务器B上如出一辙-----------------
如下命令务必在上述操做成功完成以后再执行:
# chmod 600 /root/.ssh/authorized_keys
# service sshd restart # CentOS_6.5重启sshd服务
# /bin/systemctl restart sshd.service # CentOS_7.0重启sshd服务
(五)编写unison的shell脚本进行同步:
由于本人测试的是同时同步两台服务器上两个目录,因此每台服务器上写有两个脚本,每一个脚本对应一个目录。
--------------------------服务器A上的同步脚本--------------------------
用于同步userfiles目录的脚本:
# vim /root/bash/userfiles.sh
-----------------------------------------------------------------------------------
#/bin/bash
ipB="192.168.23.117"
srcA="/usr/local/web_server/userfiles"
dstB="/usr/local/web_server/userfiles"
/usr/local/tongbuzhuanyong/inotify/bin/inotifywait -mrq -e create,delete,modify,move $srcA | while read line; do
/usr/local/bin/unison -batch $srcA ssh://$ipB/$dstB
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done
-----------------------------------------------------------------------------------
用于同步test目录的脚本:
# vim /root/bash/test.sh
-----------------------------------------------------------------------------------
#/bin/bash
ipB="192.168.23.117"
srcA="/usr/local/web_server/test"
dstB="/usr/local/web_server/test"
/usr/local/tongbuzhuanyong/inotify/bin/inotifywait -mrq -e create,delete,modify,move $srcA | while read line; do
/usr/local/bin/unison -batch $srcA ssh://$ipB/$dstB
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done
-----------------------------------------------------------------------------------
--------------------------服务器B上的同步脚本--------------------------
用于同步userfiles目录的脚本:
# vim /root/bash/userfiles.sh
-----------------------------------------------------------------------------------
#/bin/bash
ipB="192.168.23.116"
srcA="/usr/local/web_server/userfiles"
dstB="/usr/local/web_server/userfiles"
/usr/local/tongbuzhuanyong/inotify/bin/inotifywait -mrq -e create,delete,modify,move $srcA | while read line; do
/usr/local/bin/unison -batch $srcA ssh://$ipB/$dstB
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done
-----------------------------------------------------------------------------------
用于同步test目录的脚本:
# vim /root/bash/test.sh
-----------------------------------------------------------------------------------
#/bin/bash
ipB="192.168.23.116"
srcA="/usr/local/web_server/test"
dstB="/usr/local/web_server/test"
/usr/local/tongbuzhuanyong/inotify/bin/inotifywait -mrq -e create,delete,modify,move $srcA | while read line; do
/usr/local/bin/unison -batch $srcA ssh://$ipB/$dstB
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done
-----------------------------------------------------------------------------------
(六)后台运行脚本,实现24小时不间断实时同步:
-----------------如下操做在服务器A和服务器B上如出一辙-----------------
# cd /root/bash
# chmod 700 ./userfiles.sh
# chmod 700 ./test.sh
# nohup ./userfiles.sh &
# nohup ./test.sh &
# ls
看到上图出现nohup.out,说明脚本已经在后台运行了,此时关闭终端什么的都无所谓,只要不关机、不杀脚本的进程均可以。能够用“ps -ef | grep 脚本名”查看进程。为了保险起见,将脚本加入开机自启动中:
# vim /etc/rc.local
-----------------------------------------------------------------------------------
# 添加如下内容便可
iptables -F # 若是你的防火墙已经配置好了,请不要加这句话
setenforce 0 # 若是你的selinux启用了,请不要加这句话
nohup /root/bash/test.sh &
nohup /root/bash/userfiles.sh &
-----------------------------------------------------------------------------------
(七)测试双向同步效果:
首先确认服务器A和B的userfiles目录为空:
其次,在服务器A的userfiles目录中touch一个文件a.txt:
而后,在服务器B上查看相应目录:
能够看出,两个服务器上的a.txt几乎是同时产生的,说明同步效果很是好。下面尝试在服务器B上编辑a.txt文件:
接着,查看服务器A上的a.txt文件:
可见不管是文件,仍是文件里面的内容,彻底同步!
最后,尝试另外一个目录test的同步效果,与userfiles存在小小差别。
【特别注意】
测试test目录时,发现一个问题,当我删除服务器A的test目录下某个文件后,查看服务器B上的test目录,发现该文件仍然存在,直到服务器A或者服务器B的test目录下任一文件发生变化(除了删除文件操做)时,服务器A和服务器B的test目录才得以从新彻底同步。而反观userfiles目录却不存在这样的状况,不管在其目录下的任何操做,都会立刻被同步。
我的认为可能缘由是本人将test.sh、userfiles.sh两个脚本放到后台运行时是在同一目录下操做的,本来nohup是会对每一个脚本产生一个nohup.out文件的,由于在同一目录下,就仅仅产生了一个nohup.out文件。
还有一点就是,在同步脚本运行以前,目录中已经存在的文件是不会被双向同步的,请注意这点,除非你修改了本来已经存在的旧文件。
(八)防止阻塞致使不一样步,调整max_user_watches的默认值:
在使用了inotify几个月的时间里,发生了至少三次两边服务器不一样步的状况,缘由是客户端上传的文件致使inotify阻塞直至进程“死亡”,找了好久终于找到其中一个缘由,就是同步容许max_user_watches得默认值过小,下面将其调大。
# echo 8192000 >> /proc/sys/fs/inotify/max_user_watches
本来默认值为8192,之因此用echo,是由于这个文件没法直接被vim编辑。接下来写到文件中,永久生效:
# vim /etc/sysctl.conf
-----------------------------------------------------------------------------------
# 添加下面红色部分
# inotify change /proc/sys/fs/inotify/max_user_watches to 8192000
fs.inotify.max_user_watches = 8192000
-----------------------------------------------------------------------------------