系統:Ubuntu 16.04.1 工具:rsync 3.1.1 、inotify -tools 3.14 作者:jevtse 本文除了軟件安裝部分,其他內容同樣適用其他linux系統;
同步目標主機:172.16.250.141;rsync服務端,只需搭建rsync服務;
同步源主機:172.16.250.142;rsync客戶端,只需安裝inotify -tools工具包;
1、rsync傳輸方式 0%
2、rsync命令 10%
3、rsync服務端配置 40%
4、rsync服務端配置 50%
5、inotify-tools 50%
6、inotifywait+rsync實現數據實時同步 60%
7、inotify+rsync雙機同步腳本 80%
rsync是一個遠程文件同步(備份)工具,使用Rsync算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快,常用小規模網絡或局域網文件同步傳輸;
由于rsync每次同步需要將整個目錄掃描一次,當文件數量較大時,整個過程非常耗時耗性能,同時rsync不能實時監控文件的變化;而inotify是一種強大的、細粒度的、異步的文件系統事件監控機制,允許監控程序打開一個獨立文件描述符,并針對事件集監控一個或者多個文件,例如打開、關閉、移動/重命名、刪除、創建或者改變屬性。
所以我們可以通過inotify -tools工具包實現對 Linux 文件實時監控,當文件發生變化時,實時將變化的文件通過rsync同步到遠端備份服務器;
本文以把客戶端/data/rsyncy下的文件同步備份到服務端的/data/backup目錄下為例;
Ubuntu默認自帶rsync工具,不需要安裝;
1、rsync傳輸方式
基于SSH協議傳輸:類似于scp命令,可實現PUSH本地文件至遠程,或PULL遠程文件到本地,只需主機安裝rsync程序即可,無需開啟rsync服務;
基于rsync協議傳輸:基于C/S模型的rsyncd服務端與rsync客戶端命令完成單向數據傳輸,遠程端需開啟rsync服務,本文同步方案就是使用該協議傳輸數據;
2、rsync命令
Usage: rsync [OPTION]... SRC [SRC]... DEST #本地文件拷貝 or rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST #拷貝本地數據到遠端主機(ssh、rsh等工具) or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST #拷貝本地數據到遠程rsync服務器 or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST #拷貝本地數據到遠程rsync服務器,URL模式 or rsync [OPTION]... [USER@]HOST:SRC [DEST] #拷貝遠端主機數據到本地(ssh、rsh等工具) or rsync [OPTION]... [USER@]HOST::SRC [DEST] #拷貝遠程rsync服務器數據到本地 or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST] #拷貝遠程rsync服務器數據到本地,URL模式 #HOST后面為單冒號( : )時表示使用shell遠程工具連接(如ssh、rsh等);HOST后面為雙冒號時( :: )或rsync://時表示使用rsync協議傳輸,此時服務器端的[SRC]或[DEST]為rsyncd.conf中定義的模塊名稱; -v, --verbose:詳細輸出模式 -q, --quiet 精簡輸出模式 -c, --checksum:對傳輸完成的文件進行校驗 -b, --backup:不覆蓋原有文件,為其重命名~file -u, --update:僅更新舊文件,判斷mtime,不同步相同的文件 -z, --compress:壓縮傳輸 -r, --recursive:遞歸子目錄 -a, --archive:歸檔且遞歸,保留所有屬性,相當于 -rltogpD (不包括 -HAX) -l, --links:保留軟鏈接 -H, --hard -links:保留硬鏈結 -A, --acls:保留ACL權限 -X, --xattrs:保留擴展屬性 -t, --times:保留時間戳 -o, --owner:保留屬主信息 -g, --group:保留屬組信息 -p, --perms:保留文件權限 -D, --devices:保留設備文件屬性 --delete:刪除目標主機多余的文件 --delete -after:傳輸完成后再刪除多余的文件 --force:強制刪除目錄,即使不為空 --password -file=login.passwd:從文件讀取密碼 --progress:顯示備份過程,進度條 --ignore -errors:忽略IO錯誤進行刪除 --partial:保留未完全傳輸的文件,恢復后斷點續傳 --compare -dest=DIR 比較DIR中的文件來決定是否需要同步 --exclude=PATTERN:指定排除的文件或目錄,可模式匹配 --include=PATTERN:指定不排除的文件或目錄 --bwlimit=Kbps:限制傳輸帶寬,KBytes per second
3、rsync配置
可以從/usr/share/doc/rsync/examples/拷貝rsync自帶的模板文件rsyncd.conf到/etc目錄下修改,或直接在創建/etc/rsyncd.conf
root@jev -u1:~# cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/
服務端常用配置如下:
root@jev -u1:~# cat /etc/rsyncd.conf # GLOBAL OPTIONS #全局配置段 use chroot = no #是否chroot strict modes = yes #嚴格模式 lock file = /var/lock/rsyncd #程序鎖文件存放位置 pid file = /var/run/rsyncd.pid #pid文件位置 log file = /va/log/rsyncd.log #日志文件位置 # MODULE OPTIONS #局部配置段 [backup] #模塊名稱 path = /data/backup #同步文件存放目錄 max connections=10 #最多并發數 read only = no #開啟讀取 list = false #是否允許查看列表 # exclude = lost+found/ #不同步的文件 # exclude from = #指定一個包含exclude模式定義的文件名 # include = #類似exclude # include from = #指定一個包含include模式定義的文件名 uid = root #以誰的身份運行rsync gid = root #運行rsync的組 auth users = jevtse #虛擬用戶名(非linux用戶),同步登錄用 secrets file = /etc/rsyncd.secrets #虛擬用戶的密碼存放文件 hosts allow = 172.16.250.142 #白名單 hosts deny = * #黑名單 ignore errors = yes #忽略I/O錯誤 ignore nonreadable = yes #忽略沒有訪問文件權限的用戶 transfer logging = no #使用ftp格式獨立記錄日志 # log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes. #日志格式 timeout = 600 #超時時間 refuse options = checksum dry -run #客戶端不能使用的命令 dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz #不進行壓縮傳輸的文件
創建虛擬用戶的密碼文件,格式為”auth_name:passwd”
root@jev -u1:~# echo jevtse:jevtsepass >> /etc/rsyncd.secrets
給予密碼文件最小權限
root@jev -u1:~# chmod 600 /etc/rsyncd.secrets
創建數據備份目錄,需于配置文件一致,如果存在無需創建
root@jev -u1:~# mkdir /data/backup -pv
確保selinux與iptables不會成為阻礙;
4、rsync客戶端配置
創建虛擬用戶認證密碼文件,密碼需與服務端對應;
root@jev -u2:~# echo jevtsepass > /etc/rsyncd.login.secrets
給予密碼文件最小權限
root@jev -u2:~# chmod 660 /etc/rsyncd.login.secrets
創建數據源目錄
root@jev -u2:~# mkdir /data/rsync -pv
5、inotify-tools
在客戶端安裝inotify-tools工具包
root@jev-u2:~# apt install inotify-tools -y root@jev-u2:~# dpkg -L inotify-tools 。 。 。 /usr/bin/inotifywait /usr/bin/inotifywatch
可以看到工具包包含inotifywait與inotifywatch倆個工具,inotifywait命令用于監視文件系統的細微變化;inotifywatch用于收集關于被監視的文件系統的統計數據。
inotifywait命令
Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ] inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ] -m, --monitor:持續保持監聽, -d, --daemon:以守護進程方式在后臺監聽 -r, --recursive:遞歸監聽所有目錄 -o, --outfile <file> :將events信息保存向到指定文件 -s, --syslog:將錯誤信息寫進系統日志文件 -q, --quiet:靜默模式,只輸出events -qq :靜默模式,不輸出任何信息 -e, --event <event1> [ -e|--event <event2> ... ]:指定監控的events(access,modify,attrib,close,move,delete,……) --timefmt <fmt>:指定時間格式,相等于將時間格式賦值給%T --format:指定輸出文件events變化的信息格式, %T時間,%w觸發事件文件所在絕對路徑,%f觸發事件文件名稱,%e觸發的事件名稱…
6、inotifywait+rsync實現數據實時同步
通過inotifywait實時監控172.16.250.142:/date/rsync目錄下文件的修改、刪除、創建、移動、屬性變化情況,如有變動,將發生變化的文件通過管道傳送給rsync,觸發rsync實時同步到172.16.250.141上srync服務器的[backup]模塊對應的備份目錄下:
root@jev-u2:~# inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e' -e modify,delete,create,move,attrib /data/rsync/ | while read line ; do rsync -avz --delete --password-file=/etc/rsyncd.login.secrets /data/rsync/ jevtse@172.16.250.141::backup ; done
注意[SRC]即(/data/rsync/)后面必須帶分隔符(/),否則會在目標服務器重新創建目錄;
再開啟一個終端,在/date/rsync下面創建多級目錄測試是否能正常觸發數據同步:
root@jev-u2:~# mkdir /data/rsync/test0/test1/test2 -pv mkdir: created directory '/data/rsync/test0' mkdir: created directory '/data/rsync/test0/test1' mkdir: created directory '/data/rsync/test0/test1/test2'
查看剛剛運行同步命令的終端的輸出:
root@jev-u2:~# inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e' -e modify,delete ,create,move,attrib /data/rsync/ | while read line ; do rsync -avz --delete --password-file=/etc/rsyncd.login.secrets /data/rsync/ jevtse@172.16.250.141::backup ; done sending incremental file list ./ test0/ test0/test1/ test0/test1/test2/ sent 128 bytes received 39 bytes 334.00 bytes/sec total size is 0 speedup is 0.00 sending incremental file list sent 112 bytes received 23 bytes 270.00 bytes/sec total size is 0 speedup is 0.00 sending incremental file list sent 112 bytes received 23 bytes 270.00 bytes/sec total size is 0 speedup is 0.00
可以看到,已經正常觸發rsync傳輸部分文件到rsync服務端;
在rsync服務端172.16.250.141查看對應目錄是否創建成功
root@jev-u1:~# tree /data/backup/ /data/backup/ └── test0 └── test1 └── test2 3 directories, 0 files
初步測試成功
7、inotify+rsync雙機同步腳本
root@jev-u2:~# cat inotify-rsync.sh #!/bin/bash #Version 2.0 #Auther: jevtse SRC=/data/rsync/ #備份源目錄# DEST=jevtse@172.16.250.141::backup #目標目錄# PASS_FILE=/etc/rsyncd.login.secrets #密碼文件位置# LOG=/var/log/inotify-rsync.log #成功日志# ERR_LOG=/var/log/inotify-rsync-error.log #錯誤日志# TEMP=`mktemp /tmp/rsync.XXX` inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e' -e modify,delete,create,move,attrib $SRC | while read line ; do > $TEMP rsync -avz --delete --password-file=$PASS_FILE $SRC $DEST 2>> $TEMP [ -s $TEMP ] && ( echo $line >> $ERR_LOG ; cat $TEMP >> $ERR_LOG ) || echo $line >> $LOG ; done unset SRC DEST PASS_FILE LOG ERR_LOG TEMP
腳本使用:
root@jev-u2:~# chomd u+x inotify-rsync.sh root@jev-u2:~# ./inotify-rsync.sh &
客戶端事件同步成功日志示例:
root@jev-u2:~# cat /var/log/inotify-rsync.log 17-03-05 14:46 /data/rsync/test0/test1/test2/ txt1 MODIFY
客戶端事件同步失敗日志示例:
root@jev-u2:~# cat /var/log/inotify-rsync-error.log 17-03-05 14:54 /data/rsync/test0/test1/test2/ txt1 MODIFY rsync: failed to connect to 172.16.250.141 (172.16.250.141): Connection refused rsync error: error in socket IO (code 10) at clientserver.c(128) [sender=3.1.1]
【本文完】
原創文章,作者:Jev Tse,如若轉載,請注明出處:http://www.www58058.com/70527