(一)軟件包的準備: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
-----------------------------------------------------------------------------------