1. 程式人生 > >Linux伺服器間檔案實時同步的實現

Linux伺服器間檔案實時同步的實現

使用場景

現有伺服器A和伺服器B,如果伺服器A的指定目錄(例如 /home/paul/rsync/ )中的內容發生變更(增刪改和屬性變更),實時將這些變更同步到伺服器B的目標目錄中(例如 /home/paul/rsync/ )。

資料映象備份工具Rsync

Rsync是一個非常快速和靈活的檔案複製工具。它支援本機或者是和遠端伺服器間的檔案複製。Rsync使用了delta-transfer演算法,它只需要傳送源端和目標端的檔案差異部分,大大減少了網路頻寬的消耗和複製耗費的時間。Rsync多用於資料備份和映象。

Rsync使用了快速檢查演算法,通過比較檔案大小或最後修改時間的變化來判斷檔案是否需要同步。

Rsync連線遠端主機有兩種方式:使用ssh或rsync daemon。這裡使用Rsync方式來實現遠端檔案備份。

Rsync的安裝與操作

安裝Rsync

分別在伺服器A和伺服器B的terminal執行:

sudo yum install rsync

安裝完畢後,會發現rsync的配置檔案位於 etc/rsyncd.conf 。該檔案使用daemon方式同步時需要使用,此處暫不介紹。

配置伺服器A和B之間的免密登入

伺服器A執行:

ssh-keygen
ssh-copy-id 伺服器B的IP地址

建立源端目錄和目標端目錄

在伺服器A中:

mkdir /home/paul/rsync

在伺服器B中:

mkdir /home/paul/rsync

在伺服器A建立測試檔案

echo "Hello from Server A" >> /home/paul/rsync/demo.txt

執行檔案傳送命令

在伺服器A執行:

# (1)
rsync -avPz --progress /home/paul/rsync 192.168.100.130:/home.paul/rsync
# (2)
rsync -avPz --delete --progress /home/paul/rsync 192.168.100.130:/home.paul/rsync

會發現在demo.txt也出現在了伺服器B中/home/paul/rsync目錄。

命令解析:

(1) 將伺服器A中的/home/paul/rsync目錄內的檔案複製到伺服器B(192.168.100.130)的/home.paul/rsync中。

(2) 比較目標端和源端的檔案,如果目標端的檔案在源端不存在,在目標端刪除該檔案。

Rsync存在的問題

Rsync僅是一個檔案複製工具,它無法對源端檔案的增刪改操作進行監聽。在源端做出更改後,需要執行rsync命令才能將變更同步到目標端。

Rsync在每次同步前需要掃描整個目錄。如果源目錄內的檔案數量比較多,掃描可能需要耗費較多的時間。
為了滿足實時監聽的要求,我們需要引入另一個工具:inotify。

檔案系統事件監聽工具inotify

inotify-tools為inotify提供一個簡單介面。它是一個c語言編寫的庫,同時也包含命令列工具。

inotify-tools的詳細介紹請點選: https://github.com/rvoicilas/inotify-tools/wiki

inotify-tools的安裝

對於centos7系統,依次執行:

yum install -y epel-release
yum --enablerepo=epel install inotify-tools

使用inotifywait命令進行事件監聽

監聽指令碼如下(inotifywait-rsync.sh):

inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib /home/paul/rsync/ | while read file
do
rsync -avPz --progress /home/paul/rsync/ 192.168.100.130:/home/paul/rsync/
rsync -avPz --delete /home/paul/rsync/ 192.168.100.130:/home/paul/rsync/
echo "${file} was synchronized"
done

引數解析

  • -m 保持持續監聽狀態,如果不寫該引數,inotifywait會在監聽到一次事件之後退出。
  • -r 遞迴方式監聽目錄。
  • -q 安靜模式,列印輸出較少的內容。
  • --timefmt 指定時間的輸出格式。
  • --format 指定事件輸出的格式。
  • -e 設定監聽的事件型別。這裡監聽增刪改和metadata的變更。

對於每次觸發的監聽時間,inotifywait會執行do和done之間的程式碼。在這裡,我們呼叫之前所說的rsync命令進行檔案同步。

監聽指令碼加入crontab

crontab -e
* * * * * sh /home/paul/inotifywait-rsync.sh

參考資料
https://rsync.samba.org
https://github.com/rvoicilas/inotify-tools/wiki

您可能感興趣的文章:

文章同步釋出: https://www.geek-share.com/detail/2755097834.html

參考文章:

rsync+inotify 實現伺服器之間目錄檔案實時同步(轉)