1. 程式人生 > >Shell-case:叢集中伺服器間實時同步

Shell-case:叢集中伺服器間實時同步

      今天和大家分享一個比較常見的技術,實時同步技術,在叢集中,很多裝置的內容都是一樣的,裝的時候可以用克隆的方法,但後來有的時候需要進行修改,我們就要一模一樣的操作每個機子,這就很麻煩,我們就希望可以修改其中一個機子後,自動同步到其他伺服器上,這時候就要用到 rsync 同步技術,我們知道rsync可以同步,但是怎麼做實時同步呢?話不多說程式碼奉上:

Watch_Root=需要同步的目錄
ip=需要同步到的主機ip
[email protected]$ip:$Watch_Root
rsync --delete -az $Watch_Root $Same_Root
while inotifywait -rqq $Watch_Root                                              
do
  rsync --delete -az $Watch_Root $Same_Root
done &
echo -e \n 'Start rsync is uccssful'

      不過這程式碼在使用前,必須,必須,必須將伺服器間做好祕鑰連線!!如果不知道祕鑰如何連線,可以前往外地 github https://github.com/SmartLyu/shell 裡面的 alltime_rsync 其中包含了也包含了所有的操作,可以拿指令碼直接使用,只需要修改其中的ip和Watch_Root,就可以使用了,它會自動建立祕鑰,不過需要輸入密碼。

      下面我們來分析一下演算法,其實演算法很簡單,因為我們的要求也很簡單,當一個伺服器檔案被修改後,就把其被修改的檔案同步到其他伺服器上,那我們要做的就是監控,然後發現被修改後進行同步,那我們一個一個來實現,顯示如何做到實時監控,想要做到實時,就是要裝置每時每刻觀察,那就是無限迴圈的做,無限迴圈好做哇,while即可,那怎麼監控呢,一個命令 inotifywait 就可做到,不過這個不能yum安裝,所以要解壓編譯安裝,具體包在資源中的inotify包中,可以自行下載安裝,那麼程式碼雛形就出來了

Watch_Root=需要同步的目錄
while :
do
     inotifywait -rqq $Watch_Root
done

      檢測後,當檢測到有變化執行同步命令,那我們只要進行一個判斷即可,然後執行同步就完成了需求:

Watch_Root=需要同步的目錄
ip=需要同步到的主機ip
[email protected]$ip:$Watch_Root
while :
do
     inotifywait -rqq $Watch_Root
     [ $? -eq 0 ] && rsync --delete -az $Watch_Root $Same_Root
done

      然後我們為了簡化程式,我們可以吧while迴圈的條件變成命令,當命令成功的時候執行,然後執行完繼續進行判斷,實質上也是一個死迴圈,這樣就可以簡寫。
      我們在使用中會發現,程式開始後,我們就希望能進行一次同步,所以我們在迴圈前可以先執行一次同步,然後再迴圈執行,實現實時同步,這就成了最後縮寫的程式了。

附:有不足的地方,望各位大佬指出,可以留言也可以email給作者,如果喜歡可以收藏轉發,但請註明出處,謝謝。