rsync + inotify簡介
inotify是一種強大的、細粒度的、異步的機制,它滿足各種各樣的文件監控需要。在單獨使用rsync同步時,每次同步它會把全部的文件讀取一遍,而inotify+rsync同步是觸發式同步。
Rsync是一個遠程同步工具,融合了cp,和scp,Rsync 使用所謂的“ Rsync 演算法 ”來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快。運行 Rsyncserver 的機器也叫backupserver ,一個 Rsyncserver 可同時備份多個 client 的數據;也可以多個 Rsync server 備份一個client 的數據。特點:1、可以鏡像保存整個目錄樹或文件系統;2、較高的數據傳輸效率;3、可以藉助於ssh實現安全數據傳輸;4、支持匿名傳輸;
rsync命令的工作模式:
第一種模式:shell模式,也稱作本地模式;
第二種模式:遠程shell模式,可以利用ssh協議承載其遠程傳輸過程;
第三種模式:列表模式,僅列出源中的內容,-nv
第四種模式:服務模式,此時rsync工作爲守護進程,能接收客戶端的數據同步請求
rsync命令的選項:
-n: 同步測試,不執行真正的同步過程;
-v: 詳細輸出模式
-q: 靜默模式
-c: checksum,開啓校驗功能
-r: 遞歸複製
注意:rsync命令中,如果源路徑是目錄,且給複製路徑時末尾有/,則會複製目錄中的內容,而非目錄本向;如果末尾沒有/,則會同步目錄本身及目錄中的所有文件;目標路徑末尾是否有/無關緊要;
-a: 歸檔,保留文件的原有屬性;
-p: 保留文件的權限;
-t: 保留文件的時間戳;
-l: 保留符號鏈接
-g: 保留屬組
-o: 保留屬主
-D:保留設備文件
-e ssh: 使用ssh作爲傳輸承載;
-z: 壓縮後傳輸;
--progress: 顯示進度條
--stats: 顯示如何執行壓縮和傳輸
Accessvia 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
rsync服務模式例:在172.16.31.31 當服務器,172.16.31.30,當客戶端,在服務器上創建/data 目錄,rsync自己監聽,因爲是瞬時守護進程,要藉助於超級守護進程。
1,在服務器端安裝超級守護進程
#yum installxinetd
#chkconfig rsync on
安裝完後,會在/etc/xinetd.d/目錄下生成一個rsync文件
2,編輯rsync文件
把disable= yes 改爲 no 啓用rsync服務
3、爲rsync提供配置文件
/etc/rsyncd.conf
配置文件分兩段:
全局配置段:1個
共享配置段:多個
[SHARE_NAME]
配置示例:
#Global Settings //全局定義段,只能有一個。
uid= nobody
gid= nobody
usechroot = no // rsync時是否支持chroot
maxconnections = 10 //最大連接次數
strictmodes = yes //啓用嚴格模式
pidfile = /var/run/rsyncd.pid
logfile = /var/log/rsyncd.log
#Directory to be synced //定義同步的目錄,可以有多個
[tools]
path= /data
ignoreerrors = yes //傳輸數據時是否忽略錯誤
readonly = no
writeonly = no
hostsallow = 172.16.0.0/16 //允許哪些主機通過,也就是白名單
hostsdeny = *
list= false //允許不允許列出文件
uid = root //指定此共享使用那個用戶身份運行
gid = root // 指定此共享使用那個用戶組身份運行
3、啓動服務
#service xinetd start
監聽於873/tcp
測試
rsync /etc/fstab 172.16.31.31::tools
rsync -a /etc/pam.d 172.16.31.31::tools //推送目錄
rsync -a/etc/pam.d / 172.16.31.31::tools //推送文件
rsync -a172.16.31.31::tools ./ //拉取目錄
rsync -a172.16.31.31::tools/centos.repo ./ //拉取文件
也可以基於用戶認證配置,在[tools]最後添加
auth users = USER1, USER2 指定可以通過rsync同步的用戶
secrets file =/etc/rsyncd.passwd 指定驗證用戶的文件
然後創建密碼文件/etc/rsyncd.passwd
username:password
此文件不能允許其它用戶有訪問權限,且密碼不能超過8個字符;
chmod 666 etc/rsyncd.passwd
用法 rsync [email protected]::tools/./
INOTUFY:
不過這樣做有缺陷,在傳數據的過程中,會出現斷電,數據中斷什麼的,所以這時候類外一個技術inotify,彌補了這個缺陷
inotify: 在服務器端,可用於定義監控指定的目錄下的所有文件,一旦有文件的元數據發生改變,即會通知客戶端來拉取
編譯安裝
#tar xf inotify-tools-3.14.tar.gz
#cdinotify-tools-3.14
#./conifgure
#make&& make install
#cd /usr/local/bin
#ls
inotifywait inotifywatch 生成這兩個文件
#yum install inotify-tools
inotifywait用於等待文件或文件集上的一個特定事件,它可以監控任何文件和目錄設置,並且可以遞歸地監控整個目錄樹。
inotifywatch用於收集被監控的文件系統統計數據,包括每個inotify事件發生多少次等信息
inotifywait相關參數
-m 即--monitor,表示始終保持事件監聽狀態。
-r 即--recursive,表示遞歸查詢目錄。
-q 即--quiet,表示打印出監控事件。
-e 即--event,通過此參數可以指定要監控的事件
實驗內容:2個客戶端,一個rsync + inotify服務器
serveice1 ip 172.16.31.31
serveice1 ip 172.16.31.32
服務器端 ip 172.16.31.30
1 安裝Rsync服務端S1
#yum -y install xinetdrsync
2 爲rsync服務提供配置文件
uid = nobody
gid = nobody
use chroot = no
max connections = 5
timeout = 600
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
[s1]
path = /s1/data
ignore errors = yes
read only = no
write only = no
hosts allow = 172.16.31.30
hosts deny = *
list = yes
uid = root
gid = root
auth users = s1user
secrets file = /etc/s1.passwd
3 創建目錄
# mkdir /s1/data
#vim /etc/s1.passwd
s1user:user
#chmod 600 /etc/ftp.passwd
4 配置Rsync服務端(172.16.31.30)
#Global Settings
uid = nobody
gid = nobody
use chroot = no
max connections = 5
timeout = 600
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
[s2]
path = /s2/data
ignore errors = yes
read only = no
write only = no
hosts allow = 172.16.31.32
hosts deny = *
list = yes
uid = root
gid = root
auth users = s2user
secrets file = /etc/s2.passwd
5 創建目錄
# mkdir /s2/data
#vim /etc/s2.passwd
s2user:user
#chmod 600 /etc/s2.passwd
6 設置 (172.16.31.32)rsync 客戶端的密碼文件,客戶端只需要設置 rsync 同步的密碼即可,不用設置用戶名
#echo "s1user" > /etc/web.passwd
#echo "s2user" > /etc/ftp.passwd
#chomd 600 /etc/s1.passwd
#chmod 600 /etc/s2.passwd
7 在rsync客戶端(172.16.31.30)編寫rsync腳本
#!/bin/bash
src=/var/web/
des1=s2
des2=s1
host1=172.16.31.32
host2=172.16.31.31
user1=s2
user2=s1
/usr/bin/inotifywait -mrq--timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -emodify,delete,create,attrib $src | while read file DATETIME DIR;
do
/usr/bin/rsync -vzrtopg --delete --progress $src$user1@$host1::$des1 --password-file=/etc/s2.passwd
/usr/bin/rsync -vzrtopg --delete --progress $src$user2@$host2::$des2 --password-file=/etc/s1.passwd
echo "${files} was rsynced" >> /var/log/rsync.log2>&1
done
接着,將這個腳本命名爲rsync.sh,放到/var/web目錄下,然後給定可執行權限,放到後臺運行:
#chmod 755/var/web/rsync.sh