前言
與傳統的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 scholar@172.16.10.212::web /web rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] 如:rsync --password-file=/etc/rsync.passwd rsync://scholar@172.16.10.212/web /web Push: rsync [OPTION...] SRC... [USER@]HOST::DEST 如:rsync --password-file=/etc/rsync.passwd /web scholar@172.16.10.212::web rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST 如:rsync --password-file=/etc/rsync.passwd /web rsync://scholar@172.16.10.212/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:指定變化文件的詳細信息
設置開機自動運行
測試同步
我們在主服務器上增加一個站點,站點已做好我們直接復制進去
我們去輔服務器上看一下,數據有沒有同步過來
同步成功,至此基于rsync + inotify實現數據實時同步配置完成
The end
好了,rsync + inotify就講到這里了,如果要實現多臺從服務器同步,多設幾個rsync服務器端就好了,相應的主服務器inotify的腳本也需要略加修改,過程并不麻煩,實驗過程中遇到問題可留言。以上僅為個人學習整理,如有錯漏,大神勿噴~~~
原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/3694