inotify+unison實現數據雙向實時同步

  前幾天作了一個新項目,網站架構是前端用的nginx反向代理了後端兩臺tomcat,這時候兩臺tomcat之間的數據實現實時同步,成了一個問題?前端

在網上搜尋了不少方案,在liux下作文件同步,有以下幾種方式:linux

一、nfs實現web數據共享nginx

二、rsync +inotify實現web數據同步git

三、rsync+sersync更快更節約資源實現web數據同步github

四、unison+inotify實現web數據雙向同步web

在這裏詳細介紹第四種方案,前幾種都有些各自的不足。只有第四種方案支持雙向實時同步,,且當其中一臺服務器宕機,也不會影響web的訪問。(ps:以前一直喜歡nfs,配置很是簡單,可是其有個致命的缺點就是其中一臺web服務掛掉以後,會直接致使web頁面沒法訪問)。windows

  Unison是一款跨windows/linux/MAC OS平臺的文件同步工具,不只支持本地對本地同步,也支持經過SSH、RSH和Socket等網絡協議進行同步。更棒的是,Unison支持雙向同步操做,你既能夠從A同步到B,也能夠從B同步到A,這些都不須要額外的設定。後端

  1. 下載而且編譯安裝三個軟件包。(inotify-tools-3.14.tar.gz、ocaml-3.10.2.tar.gz、unison-2.32.52.tar.gz)tomcat

[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

編譯安裝inotify,須要安裝gcc編譯器,否則inotify編譯報錯。bash

[root@vmware1 tools]# cd inotify-tools-3.14
[root@vmware1 inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify && make && make install

修改PATH環境變量

[root@vmware1 inotify-tools-3.14]# cd /usr/local/inotify/
[root@vmware1 inotify]# echo "PATH=/usr/local/inotify/bin:$PATH" >/etc/profile.d/inotify.sh
[root@vmware1 inotify]# source /etc/profile.d/inotify.sh

添加庫文件到系統識別的路徑

[root@vmware1 inotify]# echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf
[root@vmware1 inotify]# ldconfig -v | grep inotify
/usr/local/inotify/lib:
        libinotifytools.so.0 -> libinotifytools.so.0.4.1

連接庫文件到系統識別的路徑

[root@vmware1 inotify]# ln -sv /usr/local/inotify/include/ /usr/include/inotify
"/usr/include/inotify" -> "/usr/local/inotify/include/"

編譯安裝ocaml,unison依賴於ocaml

[root@vmware1 ~]# cd /taokey/tools/ocaml-3.10.2
[root@vmware1 ocaml-3.10.2]# ./configure
[root@vmware1 ocaml-3.10.2]# make world opt		
[root@vmware1 ocaml-3.10.2]# make install

編譯安裝unison,安裝依賴性包

[root@vmware1 ocaml-3.10.2]# cd ../unison-2.32.52
[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 表示:使用命令方式,加入線程支持,以靜態模式編譯
##make install會提示錯誤,此錯誤就是要你cp unison /usr/local/bin,複製便可
[root@vmware1 unison-2.32.52]# make install
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

2.在vmware2服務器192.168.1.12上,安裝上述三個軟件包。重複以上安裝便可,步驟此處省略。

3.分別在服務器vmware1(192.168.1.11)和服務器vmware2(192.168.1.12)上生成ssh祕鑰對,實現免祕鑰登錄。

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/.ssh

192.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 ~]#

4.建立文件目錄,編寫腳本,實現數據實時同步。

[root@vmware1 ~]# mkdir -p /var/vm1
[root@vmware2 ~]# mkdir -p /var/vm2

編unison同步的腳本進行測試。

[root@vmware1 ~]# cat unison-A.sh
#/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
相關文章
相關標籤/搜索