天天看點

rsync+inotify實作資料實時同步

一、rsync

1、rsync介紹

Rsync是一個遠端資料同步工具,可通過LAN/WAN快速同步多台主機間的檔案。Rsync本來是用以取代rcp的一個工具,它目前由 rsync.samba.org維護。Rsync使用所謂的“Rsync演算法”來使本地和遠端兩個主機之間的檔案達到同步,這個算法隻傳送兩個檔案的不同部分,而不是每次都整份傳送,是以速度相當快。運作Rsync server的機器也叫backup server,一個Rsync server可同時備份多個client的資料;也可以多個Rsync server備份一個client的資料。

Rsync可以搭配rsh或ssh甚至使用daemon模式。Rsync server會打開一個873的服務通道(port),等待對方Rsync連接配接。連接配接時,Rsync server會檢查密碼是否相符,若通過密碼查核,則可以開始進行檔案傳輸。第一次連通完成時,會把整份檔案傳輸一次,下一次就隻傳送二個檔案之間不同的部份。

2、rsync特點

    (1)可以鏡像儲存整個目錄樹或檔案系統;

    (2)較高的資料傳輸效率;

    (3)可以借助于ssh實作安全資料傳輸;

    (3)支援匿名傳輸;

3、rsync指令的工作模式:

    第一種模式:shell模式,也稱作本地模式;

    第二種模式:遠端shell模式,可以利用ssh協定承載其遠端傳輸過程;

    第三種模式:清單模式,僅列出源中的内容,-nv

    第四種模式:服務模式,此時rsync工作為守護程序,能接收用戶端的資料同步請求;

4、rsync指令的文法

rsync指令的選項:
    -n: 同步測試,不執行真正的同步過程;
    -v: 詳細輸出模式
    -q: 靜默模式
    -c: checksum,開啟校驗功能
    -r: 遞歸複制
    -a: 歸檔,保留檔案的原有屬性;
    -p: 保留檔案的權限;
    -t: 保留檔案的時間戳;
    -l: 保留符号連結
    -g: 保留屬組
    -o: 保留屬主
    -D:保留裝置檔案
    -e ssh: 使用ssh作為傳輸承載;
    -z: 壓縮後傳輸;
    --progress: 顯示進度條
    --stats: 顯示如何執行壓縮和傳輸      

注意:rsync指令中,使用-r選項時,如果源路徑是目錄,且給複制路徑時末尾有/,則會複制目錄中的内容,而非目錄本身;如果末尾沒有/,則會同步目錄本身及目錄中的所有檔案;目标路徑末尾是否有/無關緊要;

二、rsync+inotify實作資料實時同步更新

1、rsync+inotify組合的必要性和好處(以下原理内容來源于網絡)

(1)rsync

與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支援增量備份等優點,通過rsync可以解決對實時性要求不高的資料備份需求,例如定期的備份檔案伺服器資料到遠端伺服器,對本地磁盤定期做資料鏡像等。

随着應用系統規模的不斷擴大,對資料的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了很多不足,首先,rsync同步資料時,需要掃描所有檔案後進行比對,進行差量傳輸。如果檔案數量達到了百萬甚至千萬量級,掃描所有檔案将是非常耗時的。而且正在發生變化的往往是其中很少的一部分,這是非常低效的方式。其次,rsync不能實時的去監測、同步資料,雖然它可以通過linux守護程序的方式進行觸發同步,但是兩次觸發動作一定會有時間差,這樣就導緻了服務端和用戶端資料可能出現不一緻,無法在應用故障時完全的恢複資料。基于以上原因,rsync+inotify組合出現了!

(2)inotify

 Inotify 是一種強大的、細粒度的、異步的檔案系統事件監控機制,linux核心從2.6.13起,加入了Inotify支援,通過Inotify可以監控檔案系統中添加、删除,修改、移動等各種細微事件,利用這個核心接口,第三方軟體就可以監控檔案系統下檔案的各種變化情況,而inotify-tools就是這樣的一個第三方軟體。rsync可以實作觸發式的檔案同步,但是通過crontab守護程序方式進行觸發,同步的資料和實際資料會有差異,而inotify可以監控檔案系統的各種變化,當檔案有任何變動時,就觸發rsync同步,這樣剛好解決了同步資料的實時性問題。

2、實驗拓撲圖:

rsync+inotify實作資料實時同步

注意:做資料的實時同步時,一般是從用戶端同步到服務端。

3、rsync服務端(172.16.140.1)配置

rsync沒有自己的配置檔案,要手動建立rsync的配置檔案/etc/rsyncd.conf,該配置檔案分為兩部分全局配置段和共享配置段,共享配置段可以有多個。

[root@localhost ~]# vim /etc/rsyncd.conf
# Global Settings   #全局配置段
uid = nobody  #以哪個使用者的身份擷取資料,nobody是最小權限的使用者
gid = nobody
use chroot = no  #服務運作時,要不要鎖定在家目錄下
max connections = 10  #伺服器端可允許的最大并發連接配接數
strict modes = yes  #是否工作在嚴格模式下
pid file = /var/run/rsyncd.pid  #rsync的pid檔案路徑
log file = /var/log/rsyncd.log  #rsync的日志檔案路徑
# Directory to be synced   #共享配置段
[rsync_data]   #同步的共享目錄名稱,多個共享目錄名稱不能重名
path = /rsync_mydata  #共享目錄的實際路徑,要同步的資料存放的位置
ignore errors = yes   #表示在複制檔案的過程中,若發生錯誤,是繼續複制(yes)還是終止複制(no)
read only = no  #是否限定用戶端以隻讀的方式從服務端拉取資料。若服務端共享的資料隻用于下載下傳,則設為yes。若允許用戶端向服務端推送資料,則設為no。
write only = no  #設為no表示隻允許用戶端往裡寫資料,不能拉取資料。
hosts allow = 172.16.0.0/16  #允許哪些主機來通路,做白名單的。
hosts deny = *  # 做黑名單的。
list = false  #是否允許使用者列出檔案清單
uid = root  #以哪個使用者的身份來擷取資料
gid = root
auth users = hjq  #允許哪些使用者來拉取資料,做身份驗證
secrets file = /etc/rsyncd.passwd  #存放使用者驗證的資訊      

編輯使用者驗證檔案,其中使用者名和密碼都是明文的,是以該檔案的權限要設為600。

[root@localhost ~]# vim /etc/rsyncd.passwd 
hjq:hjq
[root@localhost ~]# chmod 600 /etc/rsyncd.passwd      

rsync是依賴于超級守護程序xinetd工作的,要把xinetd也啟動起來。

[root@localhost ~]# yum -y install xinetd
[root@localhost ~]# chkconfig rsync on
[root@localhost ~]# service xinetd start
[root@localhost ~]# ss -tnl  #rsyncd服務監聽于873/tcp端口上      

4、rsync用戶端(172.16.40.1)配置

(1)安裝inotify-tools

由于inotify特性需要Linux核心的支援,在安裝inotify-tools前要先确認Linux系統核心是否達到了2.6.13以上,如果Linux核心低于2.6.13版本,就需要重新編譯核心加入inotify的支援。

rsync+inotify實作資料實時同步

也可以用如下方法判斷,核心是否支援inotify。如果有以下三項,表示系統已經預設支援inotify。

rsync+inotify實作資料實時同步

三個參數的簡單解析:

   max_queued_evnets:表示調用inotify_init時配置設定給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丢棄,但會觸發IN_Q_OVERFLOW事件。

   max_user_instances:表示每一個real user ID可建立的inotify instatnces的數量上限。

   max_user_watches:表示每個inotify instatnces可監控的最大目錄數量。如果監控的檔案數目巨大,需要根據情況,适當增加此值的大小,例如:echo "9000000" > /proc/sys/fs/inotify/max_user_watches

若查明核心支援inotify,就可以使用yum安裝inotify-tools,這裡使用的版本是inotify-tools-3.14-1.el6.x86_64

# yum install -y inotify*      
rsync+inotify實作資料實時同步

inotify-tools安裝完成後,會生成inotifywait和inotifywatch兩個指令。

inotifywait用于等待檔案或檔案集上的一個特定事件,它可以監控任何檔案和目錄設定,并且可以遞歸地監控整個目錄樹。

inotifywatch用于收集被監控的檔案系統統計資料,包括每個inotify事件發生多少次等資訊。

(2)inotifywait指令參數解析

參數說明

inotifywait

    文法:

        inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]

    參數:

    -h,--help

        輸出幫助資訊

    @

        排除不需要監視的檔案,可以是相對路徑,也可以是絕對路徑。

    --fromfile 

        從檔案讀取需要監視的檔案或排除的檔案,一個檔案一行,排除的檔案以@開頭。

    -m, --monitor

        接收到一個事情而不退出,無限期地執行。預設的行為是接收到一個事情後立即退出。

    -d, --daemon

        跟--monitor一樣,除了是在背景運作,需要指定--outfile把事情輸出到一個檔案。也意味着使用了--syslog。

    -o, --outfile 

        輸出事情到一個檔案而不是标準輸出。

    -s, --syslog

        輸出錯誤資訊到系統日志

    -r, --recursive

        監視一個目錄下的所有子目錄。

    -q, --quiet

        指定一次,不會輸出詳細資訊,指定二次,除了緻命錯誤,不會輸出任何資訊。

    --exclude 

        正則比對需要排除的檔案,大小寫敏感。

    --excludei 

        正則比對需要排除的檔案,忽略大小寫。

    -t , --timeout 

        設定逾時時間,如果為0,則無限期地執行下去。

    -e , --event 

        指定監視的事件。

rsync+inotify實作資料實時同步

-c, --csv

輸出csv格式。

--timefmt 

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

--format 

指定輸出格式。

%w 表示發生事件的目錄

%f 表示發生事件的檔案

%e 表示發生的事件

%Xe 事件以“X"分隔

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

(3)配置inotify

建立一個共享目錄,用于存放要同步的資料

# mkdir /inotify_data      

提供一個腳本

# vim  /tmp/inotify_rsync.sh
#!/bin/bash
host=172.16.140.1  #rysnc服務端的位址
src=/inotify_data/  #rsync用戶端的用于同步資料的目錄
dst=rsync_data  #rysnc服務端導出的共享目錄名
username=hjq  #rysnc服務端上/etc/rsyncd.passwd這個檔案中定義的使用者名
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files
        do
                /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.passwd $src $username@$host::$dst
                echo "${files} was rsynced" >> /var/log/rsync.log 2>&1  #将資訊寫入日志
        done      

在rsync用戶端提供/etc/rsyncd.passwd密碼檔案,在rsync用戶端中隻要提供rsync同步的密碼就行了,不用提供使用者名。

#vim /etc/rsyncd.passwd
hjq
# chmod 600 /etc/rsyncd.passwd   #密碼檔案的權限應為600      

賦予該腳本執行的權限

# chmod +x /tmp/inotify_rsync.sh      

把腳本添加到開機啟動的檔案中

# echo "/tmp/inotify_rsync.sh"  >>  /etc/rc.d/rc.local      

5、實驗操作

rsync服務端(172.16.140.1):

rsync+inotify實作資料實時同步

剛開始rsync服務端的/mydata共享目錄,沒有檔案

rsync用戶端(172.16.40.1):

運作腳本

rsync+inotify實作資料實時同步

複制檔案到rsync用戶端的共享目錄上

rsync+inotify實作資料實時同步
rsync+inotify實作資料實時同步
rsync+inotify實作資料實時同步

繼續閱讀