unison+inotify实现目录数据实时双向同步

(一)软件包的准备: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/tsetssh

 

(三)具体操做介绍:

 

-----------------如下操做在服务器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

-----------------------------------------------------------------------------------

相关文章
相关标签/搜索