一、rsync的優勢與不足
rsync與傳統的cp、tar備份方式相比,rsync具備安全性高、備份迅速、支持增量備份等優勢,經過rsync能夠解決對實時性要求不高的數據備份需求,例如按期的備份文件服務器數據到遠端服務器,對本地磁盤按期作數據鏡像等。
隨着應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了不少不足,首先,rsync同步數據時,須要掃描全部文件後進行比對,進行差量傳輸。若是文件數量達到了百萬甚至千萬量級,掃描全部文件將是很是耗時的。並且正在發生變化的每每是其中不多的一部分,這是很是低效的方式。其次,rsync不能實時的去監測、同步數據,雖然它能夠經過linux守護進程的方式進行觸發同步,可是兩次觸發動做必定會有時間差,這樣就致使了服務端和客戶端數據可能出現不一致,沒法在應用故障時徹底的恢復數據。基於以上緣由,rsync+inotify組合出現了!
linux
2.一、初識inotify
Inotify是一種強大的、細粒度的、異步的文件系統事件監控機制,linux內核從2.6.13起,加入了Inotify支持,經過Inotify能夠監控文件系統中添加、刪除,修改、移動等各類細微事件,利用這個內核接口,第三方軟件就能夠監控文件系統下文件的各類變化狀況,而inotify-tools就是這樣的一個第三方軟件。
rsync能夠實現觸發式的文件同步,可是經過crontab守護進程方式進行觸發,同步的數據和實際數據會有差別,而inotify能夠監控文件系統的各類變化,當文件有任何變更時,就觸發rsync同步,這樣恰好解決了同步數據的實時性問題。
2.二、inotify安裝,在WEB發佈管理服務器安裝便可,WEB節點無需安裝
# tar–xvf inotify-tools-3.14.tar.gz
# ./configure
# make&& make install
# ll /usr/local/bin/inotifywa*(用ps -ef|grep inotify 能夠看到下面的兩個進程,以及相關的路徑)
-rwxr-xr-x 1 root root 44319 4月 6 18:51 /usr/local/bin/inotifywait
-rwxr-xr-x 1 root root 41409 4月 6 18:51 /usr/local/bin/inotifywatch
inotifywait用於等待文件或文件集上的一個特定事件,它能夠監控任何文件和目錄設置,而且能夠遞歸地監控整個目錄樹
inotifywatch用於收集被監控的文件系通通計數據,包括每一個inotify事件發生多少次等信息
web
3.一、環境描述
隨着企業的業務增多,爲了維持全部WEB層的WEB程序保持一致。發版本的經過一臺內容服務器向外進行分佈和輻射全部的更新的WEB程序,模擬環境以下:
WEB1 節點 IP:192.168.1.139(客戶端)
WEB2節點 IP:192.168.1.138(內容分發服務器)
3.二、安裝WEB1節點(客戶端)
# yum–y install rsync #安裝rsync
vim
編寫rsync配置文件安全
# vim /etc/rsyncd.conf
uid = nobody #虛擬用戶
gid = nobody #虛擬用戶
usechroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid #定義pid文件位置
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log #定義日誌文件
[web1] #節點名稱
path = /web/doc #接收內容發佈服務器文件夾
comment = web1 file
ignore errors
read only = no
write only = no
hosts allow = 192.168.1.138 #內容發佈服務器ip地址
hosts deny = *
list = false
uid = root
gid = root
auth users = test #虛擬用戶
secrets file = /etc/web1.pass #虛擬用戶密碼文件
bash
3.三、建立接收web管理服務器的文件夾服務器
# mkdir /web/doc –p #web1客戶端節點,用來接收內容分發服務器發佈的文件,路徑爲上一步配置文件夾路徑網絡
3.四、建立用戶和密碼文件異步
# vim/etc /web1.pass #編輯虛擬用戶和用戶密碼
test:aixocm
#chmod 600 /etc/web1.pass #權限設置很關鍵socket
3.五、啓動rsync服務
# rsync --daemon
tcp
4.一、# yum–y install rsync
4.二、同步的密碼,注意此處只須要寫密碼,和web1.pass裏面的密碼要一致
# vim /etc/server.pass
aixocm
#chmod 600 /etc/server.pass
4.三、編寫一個啓動腳本
# vim /opt/inotify-rsync.sh
#!/bin/bash
host1=192.168.1.139
#==================
src=/web/doc/
dst1=web1
user1=test
/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
#-m:monitor 持續監控,若是沒有該選項,監控一次以後會退出監控
#-r:recursive 遞歸的監控
#-e:event 監聽的動做,例如modify,delete,create,atrib(屬性)
#--timefmt:時間相關的格式,例如%F,完整的年月日,%T,完整的時分秒格式。
do
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@$host1::$dst1
echo "${files} was rsyncd" >>/tmp/rsync.log 2>&1
done
4.四、啓動腳本
#cd /opt
#chmod +x inotify-rsync.sh
# nohup bash –x inotify-rsync.sh & ;將啓動的過程寫入當前路徑下的nohup.out文件裏,方便查看。
#重啓服務須要殺死進程
#ps -ef|grep inotify|awk '{print $2}'|xargs kill -9
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
指定監視的事件。
-c, –csv
輸出csv格式。
–timefmt
指定時間格式,用於–format選項中的%T格式。
–format
指定輸出格式。
%w 表示發生事件的目錄
%f 表示發生事件的文件
%e 表示發生的事件
%Xe 事件以「X」分隔
%T 使用由–timefmt定義的時間格式
語法:
inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
參數:
-h, –help
輸出幫助信息
-v, –verbose
輸出詳細信息
@
排除不須要監視的文件,能夠是相對路徑,也能夠是絕對路徑。
–fromfile
從文件讀取須要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。
-z, –zero
輸出表格的行和列,即便元素爲空
–exclude
正則匹配須要排除的文件,大小寫敏感。
–excludei
正則匹配須要排除的文件,忽略大小寫。
-r, –recursive
監視一個目錄下的全部子目錄。
-t , –timeout
設置超時時間
-e , –event
只監聽指定的事件。
-a , –ascending
以指定事件升序排列。
-d , –descending
以指定事件降序排列。
一、在內容管理節點建立測試文件
二、在客戶端查看文件是否及時同步
問題一:
@ERROR: chroot failed
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
緣由:服務器端的目錄不存在或無權限。建立目錄並修正權限可解決問題。
問題二:
@ERROR: auth failed on module tee
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
緣由:服務器端該模塊(tee)須要驗證用戶名密碼,但客戶端沒有提供正確的用戶名密碼,認證失敗。提供正確的用戶名密碼解決此問題。
問題三:
@ERROR: Unknown module ‘tee_nonexists’
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
緣由:服務器不存在指定模塊。提供正確的模塊名或在服務器端修改爲你要的模塊以解決問題。
問題四:
password file must not be other-accessible
continuing without password file
Password:
緣由:這是由於rsyncd.pwd rsyncd.secrets的權限不對,應該設置爲600。如:chmod 600 rsyncd.pwd
問題五:
rsync: failed to connect to 218.107.243.2: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=2.6.9]
緣由:對方沒開機、防火牆阻擋、經過的網絡上有防火牆阻擋,都有可能。關閉防火牆,其實就是把tcpudp的873端口打開。
問題六:
rsync error: error starting client-server protocol (code 5) at main.c(1524) [Receiver=3.0.7]
緣由:/etc/rsyncd.conf配置文件內容有錯誤。請正確覈對配置文件。
問題七:
rsync: chown "" failed: Invalid argument (22)
緣由:權限沒法複製。去掉同步權限的參數便可。(這種狀況多見於Linux向Windows的時候)
問題八:@ERROR: daemon security issue -- contact adminrsync error: error starting client-server protocol (code 5) at main.c(1530) [sender=3.0.6]緣由:同步的目錄裏面有軟鏈接文件,須要服務器端的/etc/rsyncd.conf打開use chroot = yes。掠過軟鏈接文件。