天天看點

Rsync+Inotify實作資料實時同步

1、環境及相關軟體介紹

作業系統:Ubuntu12.04_x64

源伺服器(推送):192.168.18.10

目标伺服器(備份):192.168.18.20

rsync:

  rsync是unix系統下的資料鏡像備份工具,是一款快速增量備份工具(遠端同步),支援本地複制,或者與其他SSH(安全傳輸)、rsync主機同步。

rsync有以下常用的參數:

    -v,--verbose 顯示同步過程的詳細資訊

    -a,--archive 歸檔模式,表示以遞歸方傳輸檔案,并保持所有檔案屬性,等同于-rlptgoD

    -r,--recursive 對子目錄以遞歸模式處理

    -z,--compress 對備份的檔案在傳輸時進行壓縮處理

    -l,--links 保留軟連接配接

    -H,--hard-links 保留硬連結

    --delete 删除那些DST中SRC沒有的檔案(源伺服器删除檔案,目标伺服器也同時删除)

    --progress 顯示備份過程,等同于-P

    --port=PORT 指定rsync服務端口

    --exclude=FILE 排除一個目錄或檔案(排除多個目錄時,可以寫多個--exclude)

    --exclude-from=FILE  排除多個目錄或檔案,FILE裡面寫多個要排除的目錄

inotify:

 inotify是一個Linux特性,它監控檔案系統操作,比如讀取、寫入和建立,當檔案系統有變化時,則會觸發inotify。inotify提供inotify-tools工具,這個工具包含兩個功能,一個是inotifywait,用來監控檔案系統變化的事件,另一個是inotifywatch,用來統計檔案系統通路的次數。我們這次使用inotifywait結合rsync實作實時同步功能。

inotifywait有以下常用參數:

-m,--monitor 一直保持監聽事件

-r,--recursive 遞歸監控目錄

-q,--quiet 隻列印觸發的事件

-e,--event 指定監視時間

--timefmt 指定時間格式,用于-format選型中的%T格式

--format 指定輸出格式。

%w 表示發生事件的目錄

%f 表示發生事件的檔案

%e 表示發生的事件

%T 使用由—timefmt定義的時間格式

inotifywait常用監視事件:

access 檔案或目錄讀取

modify 檔案或目錄更改

attrib 檔案或目錄屬性更改

move  檔案或目錄移動

create 檔案或目錄建立

delete 檔案或目錄删除

2、目标伺服器安裝與配置

# sudo apt-get install rsync    #ubuntu系統預設已安裝
# sudo cp/usr/share/doc/rsync/examples/rsyncd.conf /etc/
# sudo vi /etc/rsyncd.conf

# 以下是全局配置

log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/lock/rsyncd

#以下是子產品選項配置

[home]     #子產品名,在源伺服器指定這個名字
   comment = sync rsync/home      #描述資訊
   path = /home/rsync      #備份目錄
   use chroot=no           #不使用chroot,不用root權限
   read only = no          #設定本地備份目錄為讀寫權限
   uid=root          
   gid=root
   max connections=10       #用戶端最大連接配接數
   auth users = rsync      #指定資料同步使用者
   secrets file = /etc/rsyncd.pass          #指定資料同步使用者資訊檔案
   hosts allow=192.168.18.0/24     #允許連接配接的用戶端
   ignore errors = yes     #忽略出現I/O錯誤
   timeout = 600      

 #建立認證檔案

# sudo vi /etc/rsyncd.pass
rsync:123456      #格式是使用者名:密碼
# sudo chmod 600 /etc/rsyncd.pass      #屬主要有權限讀這個檔案,否則會報沒權限
# sudo /etc/init.d/rsync start     #如果啟動報如下錯誤,則根據提示打開/etc/default/rsync檔案,将RSYNC_ENABLE=false該為RSYNC_ENABLE=true,再重新開機即可。
* rsync daemon not enabled in/etc/default/rsync, not starting...

#,檢視是否啟動,有rsync監聽端口說明正常:
# sudo netstat -antp |grep rsync
tcp        0     0 0.0.0.0:873            0.0.0.0:*               LISTEN      29605/rsync      

部落格位址:http://lizhenliang.blog.51cto.com

3、源伺服器安裝與配置

# sudo apt-get install rsync inodify-tools
#rsync不用配置,因為我們隻使用rsync指令,緊接着建立認證檔案
# sudo vi /etc/rsyncd.pass
123456     #隻寫密碼
# sudo chmod 600/etc/rsyncd.pass      

 #此時基本配置完成,測試下是否能推送吧!

# rsync -avzP --password-file=/etc/rsyncd.pass --delete /home/rsync [email protected]::home   #home即是目标伺服器上rsync裡面的子產品名
sending incremental file list
rsync/a
           0 100%    0.00kB/s   0:00:00 (xfer#1, to-check=5/7)
sent 354 bytes  received 126 bytes  960.00 bytes/sec
total size is 0  speedup is 0.00      

 #出現以上資訊說明同步正常,接下來,就該編寫Shell腳本,使用inotifywait做實時監控源目錄,加個while循環判斷源目錄是否有觸發,如果有變化則執行rsync同步,并記錄日志:

# vi inotify_rsync.sh
#!/bin/bash
SRC='/home/rsync'
DST='[email protected]::home'
/usr/bin/inotifywait -mrq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e' -e create,delete,move,modify $SRC|while read files
do
    rsync -avzP --password-file=/etc/rsyncd.pass --delete $SRC $DST
    echo "$files was rsynced.">> /tmp/rsync.log
done      

4、測試實時同步

 #先列印形式檢視腳本執行情況

# bash -x inotify_rsync.sh 
+ SRC=/home/rsync/        #目錄結尾一定要加個/,否則會再目标伺服器再建立個目錄
[email protected]::home
+ read files
+ /usr/bin/inotifywait -mrq --timefmt '%y-%m-%d %H:%M' --format '%T %w%f %e' -e create,delete,move,modify,attrib /home/loongtao
+ rsync -avzP --password-file=/etc/rsyncd.pass --delete /home/rsync rsync@@192.168.18.213::home
sending incremental file list
rsync/
rsync/test.txt
           0 100%    0.00kB/s   0:00:00 (xfer#1, to-check=2/11)
 
sent 349 bytes  received 32 bytes  762.00 bytes/sec
total size is 9380  speedup is 24.62
+ echo '15-04-24 13:33/home/rsync/test.txt CREATE was rsynced.'
+ read files
+ rsync -avzP--password-file=/etc/rsyncd.pass --delete /home/rsync [email protected]::home
sending incremental file list
 
sent 310 bytes  received 10 bytes  640.00 bytes/sec
total size is 9380  speedup is 29.31
+ echo '15-04-24 13:33/home/rsync/test.txt ATTRIB was rsynced.'
+ read files      

#可以看到以上資訊,無任何報錯,說明已經推送成功。

# chmod +x inotify_rsync.sh
# ./inotify_rsync.sh &      

繼續閱讀