rsync+inotify實現數據實時同步

一、rsync

1rsync介紹

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

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

2rsync特點

    (1可以鏡像保存整個目錄樹或文件系統;

    (2較高的數據傳輸效率;

    (3可以藉助於ssh實現安全數據傳輸;

    (3支持匿名傳輸;

3rsync命令的工作模式:

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

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

    第三種模式:列表模式,僅列出源中的內容,-nv

    第四種模式:服務模式,此時rsync工作爲守護進程,能接收客戶端的數據同步請求;

4rsync命令的語法

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


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


二、rsync+inotify實現數據實時同步更新

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

1rsync

與傳統的cptar備份方式相比,rsync具有安全性高、備份迅速、支持增量備份等優點,通過rsync可以解決對實時性要求不高的數據備份需求,例如定期的備份文件服務器數據到遠端服務器,對本地磁盤定期做數據鏡像等。
隨着應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了很多不足,首先,rsync同步數據時,需要掃描所有文件後進行比對,進行差量傳輸。如果文件數量達到了百萬甚至千萬量級,掃描所有文件將是非常耗時的。而且正在發生變化的往往是其中很少的一部分,這是非常低效的方式。其次,rsync不能實時的去監測、同步數據,雖然它可以通過linux守護進程的方式進行觸發同步,但是兩次觸發動作一定會有時間差,這樣就導致了服務端和客戶端數據可能出現不一致,無法在應用故障時完全的恢復數據。基於以上原因,rsync+inotify組合出現了!

2inotify

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

 

2、實驗拓撲圖:

wKioL1P8F3vx4s1iAACus2SeEbw213.jpg

注意:做數據的實時同步時,一般是從客戶端同步到服務端。

 

3rsync服務端(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端口上

 

4rsync客戶端(172.16.40.1)配置

1安裝inotify-tools

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

wKioL1P8F7HzZD0tAABQYs_Lujw416.jpg

也可以用如下方法判斷,內核是否支持inotify。如果有以下三項,表示系統已經默認支持inotify

wKiom1P8FsrjN5RzAAEsXQ23nEY896.jpg

三個參數的簡單解析:

   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*


wKiom1P8F2KhJrPOAACYO3VytX4596.jpg

inotify-tools安裝完成後,會生成inotifywaitinotifywatch兩個指令

inotifywait用於等待文件或文件集上的一個特定事件,它可以監控任何文件和目錄設置,並且可以遞歸地監控整個目錄樹。
inotifywatch用於收集被監控的文件系統統計數據,包括每個inotify事件發生多少次等信息。

 

2inotifywait命令參數解析

參數說明

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 
        指定監視的事件。

wKiom1P8ZMCixawfAAM-0k1iwP8812.jpg-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):

wKiom1P8ZVrB_03eAABn_NoII9Y785.jpg

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


rsync客戶端(172.16.40.1):

運行腳本

wKiom1P8ZXGS7j6JAABrf769XFY083.jpg

複製文件到rsync客戶端的共享目錄上

wKiom1P8ZYXRVeSTAABnGk35th4410.jpg

wKiom1P8Za_iC3URAAJZPRmthdc625.jpg

rsync服務端(172.16.140.1):

wKioL1P8Zt3z-CBBAACcdmkeqyo426.jpg 

數據成功同步過來了!




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章