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

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

相關文章
相關標籤/搜索