inotify+unison 文件双向实时同步

回复 收藏
项目上线代码部署在做了LVS负载均衡的两台web服务器,那么问题来了,怎么样保证两台服务器的代码文件和资源文件实时同步呢?
在网上搜寻了很多方案,在liux下做文件同步,有如下几种方式:

1、nfs实现web数据共享
2、rsync+inotify实现web数据同步
3、rsync+sersync更快更节约资源实现web数据同步
4、rsync+lsyncd单向实时同步
5、unison+inotify实现web数据双向同步

在这里详细介绍第五种方案,前几种都有些各自的不足。只有第五种方案支持双向实时同步,且当其中一台服务器宕机,也不会影响web的访问。(ps:之前一直喜欢nfs,配置非常简单,但是其有个致命的缺点就是其中一台web服务挂掉之后,会直接导致web页面无法访问)。

环境部署,有如下两台服务器需要做双向同步
192.168.1.1是server1
192.168.1.2是server2

一、用户授权、保证两台服务器之间可以通过ssh无密码访问,操作如下(这里以root用户为例):
1、server1和server2上分别创建秘钥(server2也是同样操作、这里省略不写、如果不是root用户那么路径就写普通用户/home/user/.ssh即可)
[root@test1 ~]# mkdir ~/.ssh
[root@test1 ~]# chmod 700 ~/.ssh/
[root@test1 ~]# ssh-keygen -t rsa    ///生成RSA秘钥 连续三次回车
[root@test1 ~]# ll /root/.ssh/
total 8
-rw------- 1 root root 1675 Jul  6 14:57 id_rsa
-rw-r--r-- 1 root root  399 Jul  6 14:57 id_rsa.pub
2、server1上添加密钥到授权密钥文件中
[root@test1 ~]# cd /root/.ssh/
[root@test1 ~]# ssh "-p 22" 192.168.1.1 cat /root/.ssh/id_rsa.pub >> authorized_keys    #小写p
[root@test1 ~]# ssh "-p 22" 192.168.1.2 cat /root/.ssh/id_rsa.pub >> authorized_keys    #小写p
[root@test1 ~]# scp -P 22 authorized_keys 182.168.1.2:/root/.ssh/    #大写P
[root@test1 ~]# chmod 600 authorized_keys
3、server2上修改权限
[root@test2 ~]# chmod 600 authorized_keys
4、server1和server2执行如下测试(server2也是同样操作、这里省略不写、执行成功后都会有known_hosts)
[root@test1 ~]# ssh -p 22 192.168.1.1 date
Wed Jul  6 16:12:16 CST 2016
[root@test1 ~]# ssh -p 22 192.168.1.2 date
Wed Jul  6 16:12:51 CST 2016
[root@test1 ~]# ll /root/.ssh/
total 16
-rw------- 1 root root  798 Jul  6 15:54 authorized_keys
-rw------- 1 root root 1675 Jul  6 14:57 id_rsa
-rw-r--r-- 1 root root  399 Jul  6 14:57 id_rsa.pub
-rw-r--r-- 1 root root  805 Jul  6 15:54 known_hosts
至此用户授权完成。

二、软件安装,server1和server2都需要安装
1、安装unison
首先安装ocaml,版本至少为3.07或更高
下载地址:http://caml.inria.fr/
[root@test1 src]# cd /usr/local/src/
[root@test1 src]# wget http://caml.inria.fr/pub/distrib/ocaml-3.10/ocaml-3.10.2.tar.gz
[root@test1 src]# tar zxvf ocaml-3.10.tar.gz
[root@test1 ocaml-3.10]# cd ocaml-3.10
[root@test1 ocaml-3.10]# ./configure
[root@test1 ocaml-3.10]# make world opt
[root@test1 ocaml-3.10]# make install
[root@test1 ocaml-3.10]# cd ..
2、安装unison
下载地址:http://www.seas.upenn.edu/~bcpierce/unison/
[root@test1 src]# wget http://www.seas.upenn.edu/~bcpierce/unison//download/releases/unison-2.31.4/unison-2.31.4.tar.gz
[root@test1 src]# tar zxvf unison-2.31.4.tar.gz
[root@test1 src]# cd unison-2.31.4
[root@test1 unison-2.31.4]# make UISTYLE=text THREADS=true STATIC=true
[root@test1 unison-2.31.4]# cp ./unison /usr/local/bin/
[root@test1 unison-2.31.4]# cd ..
3、安装inotify
下载地址:http://inotify-tools.sourceforge.net
[root@test1 src]# wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
[root@test1 src]# tar zxvf inotify-tools-3.14.tar.gz
[root@test1 src]# cd inotify-tools-3.14
[root@test1 inotify-tools-3.14]# ./configure
[root@test1 inotify-tools-3.14]# make
[root@test1 inotify-tools-3.14]# make install
[root@test1 inotify-tools-3.14]# cd ..
到此所需的软件都已安装完毕,可以在server1服务器上执行这个命令,来查看两台服务器之间是否可以同步文件,
unison -batch /home/server1/ ssh://192.168.10.2//home/server2
成功之后会有


如果这时候抱如下错误:/usr/local/bin/inotifywait: error while loading shared libraries: libinotify
可以执行下这个命令:
ln -sv /usr/local/lib/libinotify* /usr/lib/
执行成功后,看目录下的文件是否同步。

三、创建.sh脚本来执行同步
1、server1上创建脚本/root/inotify.sh(chmod a+x /root/inotify.sh):
#/bin/bash
#DESCRIPTION-同步10.2:/home/server2
#AUTHOR-wwj
#DATE-2016-7-19
ip2="192.168.10.2:22"
src2="/home/server1/"
dst2="/home/server2/"
/usr/local/bin/inotifywait -mrq -e create,delete,modify,move $src2 | while read line; do
/usr/local/bin/unison -batch $src2 ssh://$ip2/$dst2
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done
2、server2上创建脚本/root/inotify.sh(chmod a+x /root/inotify.sh):
#/bin/bash
#DESCRIPTION-同步10.1:/home/server2
#AUTHOR-wwj-2016-7-19
#DATE-2016-7-19
ip1="192.168.10.1:22"
src1="/home/server2/"
dst1="/home/server1/"
/usr/local/bin/inotifywait -mrq -e create,delete,modify,move $src1 | while read line; do
/usr/local/bin/unison -batch $src1 ssh://$ip1/$dst1
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done
最后分别在server1和server2上执行上面两个脚本,这样两台服务器的目录会保持相互实时同步了!!!
nohup /root/inotify.sh &
2016-07-19 11:40 举报
已邀请:

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: