前言
與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支援增量備份等優點,通過rsync可以解決對實時性要求不高的資料備份需求,但随着檔案數量的增大和實時同步的要求,rsync已不能滿足需求,随之rsync+inotify便應運而生。本文将講解rsync的基礎知識和如何基于rsync+inotify實作資料實時同步傳輸。
rsync相關介紹
rsync(remote sync)是一款快速增量備份工具(遠端同步),支援本地複制,或者與其他SSH(安全傳輸)、rsync主機同步。
特點
①可以鏡像儲存整個目錄樹或檔案系統
②較高的資料傳輸效率
③可以借助于ssh實作安全資料傳輸
④支援匿名傳輸
工作模式
①shell模式,也稱作本地模式
②遠端shell模式,可以利用ssh協定承載其遠端傳輸過程
③清單模式,僅列出源中的内容,-nv
④服務模式,此時rsync工作為守護程序,能接收用戶端的資料同步請求
指令選項
-n: 同步測試,不執行真正的同步過程;
-v: 詳細輸出模式
-q: 靜默模式
-c: checksum,開啟校驗功能
-r: 遞歸複制
-a: 歸檔,保留檔案的原有屬性;
-p: 保留檔案的權限;
-t: 保留檔案的時間戳;
-l: 保留符号連結
-g: 保留屬組
-o: 保留屬主
-D:保留裝置檔案
-e ssh: 使用ssh作為傳輸承載;
-z: 壓縮後傳輸;
--progress: 顯示進度條
--stats: 顯示如何執行壓縮和傳輸
注意:rsync指令中,如果源路徑是目錄,且給複制路徑時末尾有/,則會複制目錄中的内容,而非目錄本身;如果末尾沒有/,則會同步目錄本身及目錄中的所有檔案;目标路徑末尾是否有/無關緊要;
如:rsync -r /var/log/ /tmp #複制/var/log目錄下的所有檔案,不包括log本身
rsync -r /var/log /tmp #複制/var/log整個目錄
rsync同步資料的時候,需要完整掃描檔案,比對變化的檔案,如果檔案數量過于龐大,這樣掃描是非常耗時的,而且rsync雖然可以通過crontab實作定期同步,但是也達不到實時同步的要求,要想解決這一弊端,就需要inotify了
資料實時同步實作
inotify相關介紹
可用于定義監控指定的目錄下的所有檔案,一旦有檔案的中繼資料發生改變,就通知rsync進行資料同步,以此實作實時同步
部署過程
我們通過一個執行個體來看一下rsync+inotify是如何實作資料同步的
案例要求
web伺服器1:172.16.10.100(主伺服器)
web伺服器2:172.16.10.212(輔伺服器)
兩台web伺服器,要求在主伺服器上更新資料,輔伺服器要自動更新資料
rsync角色說明:因為inotify是監控在rsync的用戶端,而且是主動同步,是以在此應用場景中主伺服器為rsync用戶端,輔伺服器為rsync伺服器端
rsync伺服器端配置
[root@scholar ~]# yum install xinetd -y #安裝守護程序,rsync系統自帶,如果沒有安裝即可
[root@scholar ~]# vim /etc/xinetd.d/rsync
#修改此項
disable = no #啟用rsync
[root@scholar ~]# vim /etc/rsyncd.conf #為rsync建立配置檔案,預設沒有此檔案
# Global Settings
uid = nobody #運作rsync使用者
gid = nobody #運作rsync組
use chroot = no #關閉chroot
max connections = 10 #最大并發連接配接數
strict modes = yes #開啟嚴格模式
pid file = /var/run/rsyncd.pid #pid檔案位置
log file = /var/log/rsyncd.log #日志檔案位置
# Directory to be synced
[web] #檔案共享名
path = /web #共享檔案路徑
ignore errors = yes #忽略錯誤
read only = no #不允許讀
write only = no #不允許寫
hosts allow = 172.16.0.0/16 #白名單
hosts deny = * #黑名單
list = false #不允許列出檔案
uid = root #共享已root使用者運作,可覆寫全局配置
gid = root #共享已root組運作,可覆寫全局配置
auth users = scholar #使用者認證
secrets file = /etc/rsync.passwd #認證檔案
[root@scholar ~]# vim /etc/rsync.passwd #建立認證檔案
#格式:username:password,此檔案不能允許其它使用者有通路權限,且密碼不能超過8個字元
scholar:scholar
[root@scholar ~]# chmod 600 /etc/rsync.passwd #設定權限
啟動服務,設定開機自啟,檢視監聽端口

rsync用戶端配置
建立認證檔案,隻需密碼即可
測試資料同步的方法
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
如:rsync --password-file=/etc/rsync.passwd [email protected]::web /web
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
如:rsync --password-file=/etc/rsync.passwd rsync://[email protected]/web /web
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
如:rsync --password-file=/etc/rsync.passwd /web [email protected]::web
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
如:rsync --password-file=/etc/rsync.passwd /web rsync://[email protected]/web
安裝inotify-tools
[root@scholar ~]# tar xf inotify-tools-3.14.tar.gz
[root@scholar ~]# cd inotify-tools-3.14
[root@scholar inotify-tools-3.14]# ./configure
[root@scholar inotify-tools-3.14]# make && make install
建立rsync腳本
[root@scholar ~]# vim /usr/local/bin/rsyncd
#!/bin/bash
SRC=/web/
DEST=web
HOST=172.16.10.212
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e
modify,delete,create,attrib $SRC | while read files;
do
rsync -vzrtopg --delete --progress --password-file=/etc/rsync.passwd $SRC
scholar@$HOST::$DEST
done
#inotifywait參數詳解:
#-m,表示始終保持事件監聽狀态
#-r,表示遞歸查詢目錄
#-q,表示列印出監控事件
#-e,指定要監控的事件,包括modify、delete、create、attrib等
#--timefmt:指定時間的輸出格式
#--format:指定變化檔案的詳細資訊
設定開機自動運作
測試同步
我們在主伺服器上增加一個站點,站點已做好我們直接複制進去
我們去輔伺服器上看一下,資料有沒有同步過來