rsync+inotify

前提條件:已配置好rsync客戶端和rsync --daemon服務端,數據能夠正常同步,linux內核必須是2.6.13以上,如圖:html

[root@A-linux ~]# rsync -avzP /tmp/ rsync_backup@10.0.0.4::data --password-file=/etc/rsync.password  #<===首先檢查同步是否正常
sending incremental file list
./
hosts
166 100% 0.00kB/s 0:00:00 (xfer#1, to-check=3/5)
ssh-hBbdsD1500/
ssh-hBbdsD1500/agent.1500

sent 250 bytes received 38 bytes 576.00 bytes/sec
total size is 166 speedup is 0.58

[root@C-linux data]# ll   #<===服務端查看同步結果
總用量 8
-rw-r--r-- 1 rsync rsync 166 1月 31 10:36 hosts
drwx------ 2 rsync rsync 4096 1月 31 13:27 ssh-hBbdsD1500

接着,在客戶端安裝inotify軟件(這裏是源碼編譯安裝inotify-tools-3.14.tar.gz)linux

[root@A-linux tools]# tar xf inotify-tools-3.14.tar.gz 
[root@A-linux tools]# ./configure --prefix=/usr/local/inotify-tools-3.14 
[root@A-linux tools]# make && make install 
[root@A-linux tools]# ln -s /usr/local/inotify-tools-3.14 /usr/local/inotify
[root@A-linux tools]# cd ../

inotify幾個主要的內核參數(可根據實際調整參數)bash

[root@A-linux inotify]# ll -l /proc/sys/fs/inotify/            #<===如下文件中的默認值須要調大
total 0
-rw-r--r-- 1 root root 0 Sep 27 17:57 max_queued_events        #<===監控時件最大數量,需調整此文件默認大小
-rw-r--r-- 1 root root 0 Sep 27 17:57 max_user_instances       #<===用戶的實例
-rw-r--r-- 1 root root 0 Sep 27 17:57 max_user_watches         #<===用戶實例可監控的最大目錄及文件數量
[root@A-linux inotify ~]# echo 327679 > /proc/sys/fs/inotify/max_queued_events  
[root@A-linux inotify ~]# echo 30000000 > /proc/sys/fs/inotify/max_user_watches

inotify軟件包主要的2個命令ssh

[root@A-linux tools]# cd /usr/local/inotify
[root@A-linux inotify]# tree ./bin
./bin
├── inotifywait          #<===等待文件發生變化,是inotify核心命令
└── inotifywatch         #<===用於收集文件系統的統計數據,例如發生了多少次inotify事件,某文件被訪問了多少次等等,通常用不上

inotifywait 命令的參數測試

-m  :表示始終監控,不然應該是監控到了一次就退出監控了
-r  :遞歸監控,監控目錄中的任何文件,包括子目錄。遞歸監控可能會超出max_user_watches的值,須要適當調整該值
@<file>  :若是是對目錄進行遞歸監控,則該選項用於排除遞歸目錄中不被監控的文件。file是相對路徑仍是絕對路徑由監控目錄是相對仍是絕對來決定
-q  :--quiet的意思,靜默監控,這樣就不會輸出一些無關的信息
-e  :指定監控的事件。通常監控的就 delete、create、attrib、modify、close_write
--exclude <pattern>  :經過模式匹配來指定不被監控的文件,區分大小寫
--excludei <pattern> :經過模式匹配來指定不被監控的文件,不區分大小寫
--timefmt  :監控到事件觸發後,輸出的時間格式,可指定可不指定該選項,通常設置爲[--timefmt '%Y/%m/%d %H:%M:%S']
--format   :用戶自定義的輸出格式,如[--format '%w%f %e%T']
  %w  :產生事件的監控路徑,不必定就是發生事件的具體文件,例如遞歸監控一個目錄,該目錄下的某文件產生事件,將輸出該目錄而非其內具體的文件
  %f  :若是監控的是一個目錄,則輸出產生事件的具體文件名。其餘全部狀況都輸出空字符串
  %e  :產生的事件名稱
  %T  :以"--timefmt"定義的時間格式輸出當前時間,要求同時定義"--timefmt"

inotifywait -e 指定可監控的事件ui

access  :文件被訪問
modify  :文件被寫入,內容被修改
attrib  :元數據被修改。包括權限、時間戳、擴展屬性等等
close_write  :打開的文件被關閉,是爲了寫文件而打開文件,以後被關閉的事件
close_nowrite :read only模式下文件被關閉,即只能是爲了讀取而打開文件,讀取結束後關閉文件的事件
close :是close_write和close_nowrite的結合,不管是何種方式打開文件,只要關閉都屬於該事件
open  :文件被打開
moved_to  :向監控目錄下移入了文件或目錄,也能夠是監控目錄內部的移動
moved_from :將監控目錄下文件或目錄移動到其餘地方,也能夠是在監控目錄內部的移動
move :是moved_to和moved_from的結合
moved_self :被監控的文件或目錄發生了移動,移動結束後將再也不監控此文件或目錄
create :在被監控的目錄中建立了文件或目錄
delete :刪除了被監控目錄中的某文件或目錄
delete_self :被監控的文件或目錄被刪除,刪除以後再也不監控此文件或目錄
umount :掛載在被監控目錄上的文件系統被umount,umount後再也不監控此目錄
isdir :監控目錄相關操做

測試inotify監控實例(監控A-linux主機中/data目錄下子目錄及文件的變化)spa

監控單個事件
[root@A-linux inotify]# /usr/local/inotify-tools-3.14/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e delete /data     #<==僅僅監控目錄中被刪除文件或目錄

同時監控多個事件
[root@A-linux inotify]# /usr/local/inotify-tools-3.14/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete,close_write /data 

使用inotify腳本實時監控目錄內子目錄和文件的變化orm

[root@A-linux ~]# cat inotify.sh 
#!/bin/bash

###########################################################
# description: inotify+rsync best practice #
# author : 駿馬金龍 #
# blog : http://www.cnblogs.com/f-ck-need-u/ #
###########################################################

watch_dir=/data
push_to=10.0.0.4

# First to do is initial sync
rsync -az --delete --exclude="*.swp" --exclude="*.swx" $watch_dir rsync_backup@$push_to::data --password-file=/etc/rsync.password

/usr/local/inotify/bin/inotifywait -mrq -e delete,close_write,moved_to,moved_from,isdir --timefmt '%Y-%m-%d %H:%M:%S' --format '%w%f:%e:%T' $watch_dir \
--exclude=".*.swp" >>/etc/inotifywait.log &

while true;do
if [ -s "/etc/inotifywait.log" ];then
grep -i -E "delete|moved_from" /etc/inotifywait.log >> /etc/inotify_away.log
rsync -az --delete --exclude="*.swp" --exclude="*.swx" $watch_dir rsync_backup@$push_to::data --password-file=/etc/rsync.password
if [ $? -ne 0 ];then
echo "$watch_dir sync to $push_to failed at `date +"%F %T"`,please check it by manual" |\
mail -s "inotify+Rsync error has occurred" root@localhost
fi
cat /dev/null > /etc/inotifywait.log
rsync -az --delete --exclude="*.swp" --exclude="*.swx" $watch_dir rsync_backup@$push_to::data --password-file=/etc/rsync.password
else
sleep 1
fi
done

腳本能夠放進 /etc/rc.local 中開機執行,或者放在後臺執行htm

[root@A-linux ~]# echo '/bin/sh /root/inotify.sh &' >>/etc/rc.local 
[root@A-linux ~]# tail -1 /etc/rc.local 
/bin/sh /root/inotify.sh &

小結:blog

(1)當同步的目錄數據量不大時,建議使用 rsync+inotify
(2)當同步的目錄數據量很大時(幾百G甚至1T以上)文件不少時,建議使用 rsync+sersync
(3)生產環境直接用 rsync+sersync,而不使用 rsync+inotify

博客參考 

http://www.cnblogs.com/f-ck-need-u/p/7220193.html

www.cnblogs.com/kevingrace/p/6001252.html

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息