inotify+unison实现数据双向实时同步
在网上搜寻了很多方案,在liux下做文件同步,有如下几种方式:前几天做了一个新项目,网站架构是前端用的nginx反向代理了后端两台tomcat,这时候两台tomcat之间的数据实现实时同步,成了一个问题?
- []nfs实现web数据共享[/][]rsync +inotify实现web数据同步[/][]rsync+sersync更快更节约资源实现web数据同步[/][]unison+inotify实现web数据双向同步[/]
(inotify-tools-3.14.tar.gz、ocaml-3.10.2.tar.gz、unison-2.32.52.tar.gz)1、下载并且编译安装三个软件包
[root@vmware1 tools]# wget http://caml.inria.fr/pub/distrib/ocaml-3.10/ocaml-3.10.2.tar.gz [root@vmware1 ~]# mkdir -p /taokey/tools [root@vmware1 ~]# cd /taokey/tools/ [root@vmware1 tools]# wget http://caml.inria.fr/pub/distrib/ocaml-3.10/ocaml-3.10.2.tar.gz [root@vmware1 tools]# wget http://www.seas.upenn.edu/~bcpierce/unison//download/releases/unison-2.32.52/unison-2.32.52.tar.gz [root@vmware1 tools]# wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz [root@vmware1 tools]# tar xf inotify-tools-3.14.tar.gz [root@vmware1 tools]# tar xf ocaml-3.10.2.tar.gz [root@vmware1 tools]# ll 总用量 3772 drwxrwxrwx 5 1000 1000 4096 3月 14 2010 inotify-tools-3.14 -rw-r--r-- 1 root root 358772 3月 14 2010 inotify-tools-3.14.tar.gz drwxrwxr-x 26 root wheel 4096 2月 29 2008 ocaml-3.10.2 -rw-r--r-- 1 root root 2785669 2月 29 2008 ocaml-3.10.2.tar.gz drwxr-xr-x 7 501 wheel 4096 6月 30 2009 unison-2.32.52 -rw-r--r-- 1 root root 697866 6月 30 2009 unison-2.32.52.tar.gz
[size=16]编译安装inotify,需要安装gcc编译器,不然inotify编译报错。2、编译安装
[root@vmware1 tools]# cd inotify-tools-3.14[/size] [root@vmware1 inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify && make && make install[size=16]修改PATH环境变量
[root@vmware1 inotify-tools-3.14]# cd /usr/local/inotify/[/size] [root@vmware1 inotify]# echo "PATH=/usr/local/inotify/bin:$PATH" >/etc/profile.d/inotify.sh [root@vmware1 inotify]# source /etc/profile.d/inotify.sh[size=16]添加库文件到系统识别的路径
[root@vmware1 inotify]# echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf[/size] [root@vmware1 inotify]# ldconfig -v | grep inotify /usr/local/inotify/lib: libinotifytools.so.0 -> libinotifytools.so.0.4.1[size=16]链接库文件到系统识别的路径
[root@vmware1 inotify]# ln -sv /usr/local/inotify/include/ /usr/include/inotify[/size] "/usr/include/inotify" -> "/usr/local/inotify/include/"[size=16]编译安装ocaml,unison依赖于ocaml
[root@vmware1 ~]# cd /taokey/tools/ocaml-3.10.2[/size] [root@vmware1 ocaml-3.10.2]# ./configure [root@vmware1 ocaml-3.10.2]# make world opt [root@vmware1 ocaml-3.10.2]# make install[size=16]编译安装unison,安装依赖性包
[root@vmware1 ocaml-3.10.2]# cd ../unison-2.32.52[/size] [root@vmware1 unison-2.32.52]# yum -y install ctags-etags [root@vmware1 unison-2.32.52]# make UISTYLE=text THREADS=true STATIC=true #UISTYLE=text THREADS=true STATIC=true 表示:使用命令方式,加入线程支持,以静态模式编译[size=16]make install会提示错误,此错误就是要你cp unison /usr/local/bin,复制即可
[root@vmware1 unison-2.32.52]# make install[/size] mv /root/bin//unison /tmp/unison-10576 mv: 无法获取"/root/bin//unison" 的文件状态(stat): 没有那个文件或目录 make: [doinstall] 错误 1 (忽略) cp unison /root/bin/ cp: 无法创建普通文件"/root/bin/": 是一个目录 make: *** [doinstall] 错误 1 [root@vmware1 unison-2.32.52]# cp unison /usr/local/bin在vmware2服务器192.168.1.12上,安装上述三个软件包。重复以上安装即可,步骤此处省略.
分别在服务器vmware1(192.168.1.11)和服务器vmware2(192.168.1.12)上生成ssh秘钥对。3、免密码密钥登陆配置
[root@vmware1 ~]# ssh-keygen -t rsa [root@vmware2 ~]# ssh-keygen -t rsa两台服务器之间实现免秘钥登陆。 192.168.1.11:
[root@vmware1 ~]# cd .ssh/ [root@vmware1 .ssh]# touch authorized_keys [root@vmware1 .ssh]# cat id_rsa.pub >>authorized_keys [root@vmware1 .ssh]# scp authorized_keys 192.168.1.12:/root/.ssh192.168.12:
[root@vmware2 ~]# cd .ssh/ [root@vmware2 .ssh]# cat id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvVRA8c9QhTDBTOmbMWlRpQyPor2BOtTOCuPehvpEJdU4pSytLoSQBzQ1TOnbpeX7NSkhGDSTOFT96VdRMBPAF3mdDLg3j7mxPiMo3EDLSdo+kyPk1dVRnmfnplZms2mmFbZZnlRxd5FEgaY3vE/w1mJMMTrpgK+dZd7nOTmIx7QjIwGb5G31G+y7h7LGVpTR/amrJOw2POuzlOQnj2BNNkyGh2uIecBQ+zxNaTzZOoC2SLYPKnsIB5wSycbG5fN0sRMUzuV2R5fFYweb6IJ/2u0zJHhbLQDL9QtPGffb5wS9ZD23fb47HMwY1KPg9Dp7f6v/5vui5u8GPlO5k+aAKQ== root@vmware2需要把vmware2服务器上的id_rsa.pub复制到vmware1服务器上的authorized_keys文件中。
[root@vmware1 .ssh]# cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvVRA8c9QhTDBTOmbMWlRpQyPor2BOtTOCuPehvpEJdU4pSytLoSQBzQ1TOnbpeX7NSkhGDSTOFT96VdRMBPAF3mdDLg3j7mxPiMo3EDLSdo+kyPk1dVRnmfnplZms2mmFbZZnlRxd5FEgaY3vE/w1mJMMTrpgK+dZd7nOTmIx7QjIwGb5G31G+y7h7LGVpTR/amrJOw2POuzlOQnj2BNNkyGh2uIecBQ+zxNaTzZOoC2SLYPKnsIB5wSycbG5fN0sRMUzuV2R5fFYweb6IJ/2u0zJHhbLQDL9QtPGffb5wS9ZD23fb47HMwY1KPg9Dp7f6v/5vui5u8GPlO5k+aAKQ== root@vmware2
完成之后,测试一下,是否可以免秘钥登陆。[root@vmware1 ~]# ssh 192.168.1.12 reverse mapping checking getaddrinfo for bogon [192.168.1.12] failed - POSSIBLE BREAK-IN ATTEMPT! Last login: Tue Sep 9 22:03:33 2014 from 192.168.1.104 [root@vmware2 ~]#最后,创建文件目录,编写脚本,实现数据实时同步。
[root@vmware1 ~]# mkdir -p /var/vm1 [root@vmware2 ~]# mkdir -p /var/vm2编unison同步的脚本进行测试
[root@vmware1 ~]# cat unison-A.sh ###################################################################[size=16]#[/size] #/bin/bash ipB="192.168.1.11" srcA="/var/vm1" dstB="/var/vm2" /usr/local/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 [root@vmware1 ~]# chmod o+x unison-A.sh [root@vmware1 ~]# sh unison-A.sh &vmware2服务器上:
[root@vmware2 ~]# cat unison-B.sh #/bin/bash ipA="192.168.1.11" srcB="/var/vm2" dstA="/var/vm1" /usr/local/inotify/bin/inotifywait -mrq -e create,delete,modify,move $srcB | while read line; do /usr/local/bin/unison -batch $srcB ssh://$ipA/$dstA echo -n "$line " >> /var/log/inotify.log echo `date | cut -d " " -f1-4` >> /var/log/inotify.log done [root@vmware2 ~]# sh unison-B.sh & [1] 10555 [root@vmware1 ~]# cd /var/vm1/ [root@vmware1 vm1]# ls a b c test [root@vmware2 ~]# cd /var/vm2/ [root@vmware2 vm2]# ls a b c test [root@vmware2 vm2]# rm -rf test [root@vmware1 vm1]# ls a b c试验到此结束。