一、前言
什么是rsync,remote synchronize遠程同步簡寫。Linux系統上由rsync這個軟件包提供。rsync有幾個特點,鏡像保存整個文件目錄樹或文件系統;有較高的數據傳輸效率;可以借助ssh實現安全數據傳輸;支持匿名傳輸等。rsync同步只是針對變化的文件進行傳輸,意味著其會在源和目標之間比較文件的異同。相對與scp來說,第一次傳輸兩邊都效率都差不多。但以后傳輸相同目錄下的文件時,rsync只傳輸變化的文件,而非像scp直接覆蓋。inotify是linux的一種文件變化通知機制,用來監控文件系統的操作,linux內核2.6.13以上支持inotify。rsync和inotify經常搭配使用實現跨主機實時同步。由于rsync要對比源和目標的文件差異。在海量小文件的時候,使用起來效率低。
二、rsync基本用法
man下文檔可以發現,rysnc語法有如下
Local: rsync [OPTION...] SRC... [DEST] Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST:DEST Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
2.1、工作模式
從中也可以看出rsync工作有3中模式
1.本地模式
2.遠程shell模式,可以利用ssh協議承載遠程傳輸過程
3.服務模式,此時rsync工作為一個守護進程,能接收客戶端的數據同步請求。rsync守護進程依賴于xinetd進程。
2.2、參數說明
sync命令的選項:
-n :同步測試,不執行真正的執行過程 -v :詳細輸出模式 -q :靜默模式 -c :checksum,開啟校驗功能 -r :遞歸復制 -a :歸檔,保留文件的原屬性 -p :保留文件的權限 -t :保留文件的時間戳 -l :保留符號連接 -g :保留屬組 -o :保留屬主 -D :保留設備文件 -e ssh :使用ssh作為傳輸承載 -z :壓縮后傳輸 --progress :顯示進度條 --stats :顯示如何執行壓縮和傳輸 --password-file :指定密碼文件 --delete :刪除目標目錄多余的文件 注意:rsync命令中,如果源路徑是目錄,且其復制路徑時末尾有/,則會復制目錄中的內容,而非目錄本身,如果末尾 沒有/,則會同步目錄本身中的所有文件,目標路徑末尾是否有/無關緊要 更多的選項解釋請自行查看manual。
三、inotify基本用法
inotify在2.6.13內核上是默認支持的,其只是一個用C語言寫的api。如果要調用這個api需要編寫代碼調用。但是有個工具:inotify-tools工具幫我們省去了這一步驟。我們直接調用inotify-tools提供的命令便可監控文件系統的變化。inotify-tools工具epel源中有提供,否則請執行編譯安裝。Inotify-tools工具安裝后提供了兩個命令
/usr/bin/inotifywait :監控文件系統變化
/usr/bin/inotifywatch :用來統計文件系統訪問的次數
3.1、inotifywait用法
inotifywait [-hcmrq] [-e <event> ] [-t <seconds> ] [--format <fmt> ] [--timefmt<fmt> ] <file> [ ... ] -h :幫助 -c :輸出CSV(comma-separated values)格式 -m :監控 -r :遞歸 -q :安靜模式 -e :事件 -t :超時 --timefmt :設置事件格式 --format :輸出指定格式 更多的選項解釋請自行查看manual。
四、rsync服務器搭建
rsync服務器上
[root@vm ~]# cat /etc/rsyncd.conf # Global Setting uid = nobody #運行rsync服務器的用戶角色 gid = nobody #運行rsync服務器的組角色 use chroot = no #是否允許切換根目錄 max connections = 10 #最大連接數 strict modes = yes #使用嚴格策略模式 pid file = /var/run/rsyncd.pid #pid文件 log file = /var/log/rsyncd.log #日志文件 #Directory to be synced [data] #module name path = /data #存放路徑 ignore errors = yes #傳輸出錯時是否中斷傳輸 read only = no #只讀 write only = no #只寫 hosts allow = 192.168.0.0/16 #允許主機范圍 hosts deny = * #拒絕主機范圍 uid = root #以什么身份角色工作于/data目錄下,可覆蓋全局配置 gid = root auth users = leon #認證用戶,必須是密碼文件中的一個 secrets file = /etc/rsync.passwd #密碼問 建立密碼文件 [root@vm tmp]# cat /etc/rsync.passwd #密碼文件 leon:leon #用戶:密碼 形式存儲 重啟服務 [root@vm ~]# service xinetd start #啟動xinetd進程 設置iptables [root@vm ~]# iptables -t filter -A INPUT -d 192.168.226.128 -p tcp --dport=873 -j ACCEPT #放行策略 [root@vm ~]# iptables -t filter -A OUTPUT -s 192.168.226.128 -p tcp --sport=873 -j ACCEPT #放行策略 mkdir /data #建立存儲目錄
rsync客戶端上
建立密碼文件 [root@vm ~]# cat /etc/rsync.passwd #建立密碼文件 leon [root@vm tmp]# iptables -t filter -A INPUT -s 192.168.226.128 -p tcp --sport=873 -j ACCEPT #放行策略 [root@vm tmp]# iptables -t filter -A OUTPUT -d 192.168.226.128 -p tcp --dport=873 -j ACCEPT #放行策略
兩臺主機都設置selinux為permissive
setenforce 0
測試:在客戶端上測試
[root@vm ~]# rsync -avz --progress --delete --password-file=/etc/rsync.passwd leon@192.168.226.128::data /data receiving incremental file list created directory /data #在客戶端上把文件pull到服務器 ./ aa 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=2/4) bb 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=1/4) tom/ sent 99 bytes received 218 bytes 634.00 bytes/sec total size is 0 speedup is 0.00 [root@vm ~]# ls /data aa bb tom [root@vm ~]#
在客戶端上配倉庫,監控同步腳本
[root@vm tmp]# cat /etc/yum.repos.d/epel.repo [epel] name=epel mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-$releasever&arch=$basearch enabled=1 gpgcheck=0 [root@vm tmp]# yum install -y inotify-tools
[root@vm data]# cat /tmp/rsyncInotify.sh #此腳本利用inotify機制監控到文件變化時,通過管道的方式實現觸發功能,把文件push到服務器上 #!/bin/bash # host='192.168.226.128' user='leon' monitorFile='/data/' dest='data' passwdFile='/etc/rsync.passwd' inotifywait -mrq -e modify,attrib,moved_to,moved_from,move,move_self,create,delete,delete_self --timefmt='%d/%m/%y %H:%M' --format='%T %w%f %e' $monitorFile | while read chgeFile ;do rsync -avqz --delete --progress --password-file=$passwdFile $monitorFile $user@$host::$dest &>>/var/log/messages done
客服端測試
[root@vm data]# sh -n /tmp/rsyncInotify.sh #檢測語法 [root@vm tmp]# nohup /tmp/rsyncInotify.sh & #后臺運行腳本 [root@vm tmp]# jobs [1]+ Terminated nohup /tmp/rsyncInotify.sh [root@vm tmp]# nohup: ignoring input and appending output to `nohup.out' [root@vm tmp]# jobs [1]+ Running nohup /tmp/rsyncInotify.sh & [root@vm tmp]# touch /data/leon.rsyncInotify
在服務器上
[root@vm data]# ls first.txt first.txtf hello leon.rsyncInotify 查看日志 [root@vm data]# tail /var/log/messages Oct 27 14:44:54 vm xinetd[31417]: START: rsync pid=32950 from=::ffff:192.168.226.129 Oct 27 14:44:54 vm xinetd[31417]: EXIT: rsync status=0 pid=32950 duration=0(sec) Oct 27 14:45:49 vm xinetd[31417]: START: rsync pid=32956 from=::ffff:192.168.226.129 Oct 27 14:45:50 vm xinetd[31417]: START: rsync pid=32958 from=::ffff:192.168.226.129 Oct 27 14:45:50 vm xinetd[31417]: EXIT: rsync status=0 pid=32956 duration=1(sec) Oct 27 14:45:50 vm xinetd[31417]: EXIT: rsync status=0 pid=32958 duration=0(sec) [root@vm data]# tail /var/log/rsyncd.log 2015/10/27 14:45:49 [32956] connect from UNKNOWN (192.168.226.129) 2015/10/27 14:45:49 [32956] rsync to data/ from leon@unknown (192.168.226.129) 2015/10/27 14:45:50 [32956] receiving file list 2015/10/27 14:45:50 [32956] ./ 2015/10/27 14:45:50 [32958] name lookup failed for 192.168.226.129: Name or service not known 2015/10/27 14:45:50 [32958] connect from UNKNOWN (192.168.226.129) 2015/10/27 14:45:50 [32956] sent 98 bytes received 193 bytes total size 0 2015/10/27 14:45:50 [32958] rsync to data/ from leon@unknown (192.168.226.129) 2015/10/27 14:45:50 [32958] receiving file list 2015/10/27 14:45:50 [32958] sent 76 bytes received 154 bytes total size 0
五、總結
對于rsync+inotify這個方式不適宜海量文件需要同步的情況,對于小規模應用還是可以的。rsync還有許多的參數實現不同的功能可選擇,請自行查看manual。epel源中有許多可用軟件包,對比國內阿里,搜狐等鏡像還多。所以,你懂得,趕緊配一個去。
原創文章,作者:成吉思汗,如若轉載,請注明出處:http://www.www58058.com/9084
非常贊! 已置頂! 同時如果有delete操作最好增加備份機制