RSYNC04-配置rsync+inotify實現實時同步
1,背景介紹
Linux內核從2.6.13版本開始提供了inotify通知接口,用來監控文件系統的各種變化情況,如文件存取、刪除、移動等。利用這一機制,可以非常方便地實現文件異動告警、增量備份,並針對目錄或文件的變化及時作出響應。
使用rsync工具與inotify機制相結合,可以實現觸發式備份(實時同步),只要原始位置的文檔發生變化,則立即啟動增量備份操作,否則處於靜態等侍狀態,這樣一來,就避免了按固定周期備份進存在的延遲性、周期過密等問題。
inotify:下載地址:http://sourceforge.net/projects/inotify-tools/
版本號:3.1.13
SourceForge.net,又稱SF.net,是開源軟件開發者進行開發管理的集中式場所。SourceForge 是全球最大開源軟件開發平臺和倉庫,網站建立的宗旨,就是為開源軟件提供一個存儲、協作和發布的平臺。SourceForge 上擁有大量非常優秀的開源軟件,事實上,這些軟件完全可以代替一些商業軟件。
2,實戰
2.1 查看系統是否支持inotify,優化內核參數
- 判斷系統是否支持inotify,---內核是否高於2.6.13
[root@cdncenter inotify-tools-3.13]# uname -r 2.6.18-194.el5
- 判斷系統是否支持inotify,---查看內核參數,在proc下面存在下面三個文件
[root@cdncenter inotify-tools-3.13]# ll /proc/sys/fs/inotify/ 總計 0 -rw-r--r-- 1 root root 0 12-28 00:10 max_queued_events -rw-r--r-- 1 root root 0 12-28 00:10 max_user_instances -rw-r--r-- 1 root root 0 12-28 00:10 max_user_watches
在linux內核中,默認的inotify機制提供了三個調控參數:
- max_queued_events #表示監控事件隊列
- max_user_instances #表示最多監控實例數
- max_user_watches #表示每個實例最多監控文件數
[root@cdncenter inotify]# cat max_queued_events 16384 [root@cdncenter inotify]# cat max_user_instances 128 [root@cdncenter inotify]# cat max_user_watches 8192
註:當要監控的目錄、文件數量較多或者變化較頻繁時,要加大這三個參數的值。
例如:可直接修改/etc/sysctl.conf配置文件,將管理隊列設為32768,實例數設為1024,監控數設為9000000(建議大於監控目標的總文件數)。
[root@cdncenter ~]# vim /etc/sysctl.conf #以文件最後,添加以下內容 fs.inotify.max_queued_events = 32768 fs.inotify.max_user_instances = 1024 fs.inotify.max_user_watches = 90000000 [root@cdncenter ~]# sysctl -p #使修改後的sysctl.conf文件生效
查看是否修改成功:
[root@cdncenter inotify]# cat max_user_watches 90000000 [root@cdncenter inotify]# cat max_user_instances 1024 [root@cdncenter inotify]# cat max_queued_events 32768
2.2 安裝inotify工具
1,使用sftp將inotify-tools-3.13.tar.gz上傳到/usr/local/src目錄下
2,解壓軟件 tar –zxvf inotify-tools-3.13.tar.gz
3,編譯安裝 ./configure && make –j4 && make install -j4 意思是:使用4個CPU來編譯,編譯速度大大提升
2.3 inotify測試
inotifywait命令基本用法
[root@xuegod63 ~]# inotifywait -h
常用參數:
-e 用來指定要監控哪些事件。
這些事件包括: create創建,move移動,delete刪除,modify修改文件內容,attrib屬性更改。
-m 表示持續監控
-r 表示遞歸整個目錄
-q 表示簡化輸出信息
使用inotifywait命令監控目錄/mpeg/mirrors/yumwarehouse/rhel6發生的變化。然後在另一個終端向/mpeg/mirrors/yumwarehouse/rhel6目錄下添加文件、移動文件,查看屏幕輸出結果。
終端1:
[root@cdncenter yumwarehouse]# inotifywait -mrq -e create,move,delete,modify /mpeg/mirrors/yumwarehouse/rhel6/ /mpeg/mirrors/yumwarehouse/rhel6/ CREATE test /mpeg/mirrors/yumwarehouse/rhel6/ MODIFY test /mpeg/mirrors/yumwarehouse/rhel6/ MODIFY test /mpeg/mirrors/yumwarehouse/rhel6/ DELETE test /mpeg/mirrors/yumwarehouse/rhel6/ CREATE test /mpeg/mirrors/yumwarehouse/rhel6/ MOVED_FROM test /mpeg/mirrors/yumwarehouse/rhel6/ MOVED_TO test1
終端2:
[root@cdncenter rhel6]# touch test [root@cdncenter rhel6]# echo "111" >test [root@cdncenter rhel6]# rm -rf test [root@cdncenter rhel6]# touch test [root@cdncenter rhel6]# mv test test1
使用inotifywait輸出的監控結果中,每行記錄中依次包括目錄、事件、文件。那木根據此可以識別變動情況,編寫觸發式同步腳本:
2.4 編寫觸發式同步腳本
SRC_address=10.80.0.1
SRC_dir=/mpeg/mirrors/yumwarehouse/rhel6/
DST_address=10.80.0.161
SRC_dir=/home/rpmpackage/saltmaster/
第一步,同步時不需要輸入密碼:10.80.0.1發生變化後,直接將發生變化的數據同步到10.80.0.161,同步時不需要輸入密碼
[root@cencenter~]# ssh-keygen [root@cencenter~]# ssh-copy-id [email protected] [root@cencenter~]# ssh 10.80.0.161 Last login: Wed Nov 12 17:51:35 2017
第二步編寫觸發式同步腳本
前提:參考以下shell腳本:將輸出結果賦給變量,並打印
[root@cdncenter scripts]# cat aaa.sh #!/bin/sh echo aaa bbb ccc |while read D E F do echo $D echo $E echo $F done
執行結果
[root@cdncenter scripts]# sh aaa.sh aaa bbb ccc
實戰腳本,監控10.80.0.1服務器的=/mpeg/mirrors/yumwarehouse/rhel6/,一旦發生變化,將增量數據同步給10.80.0.161的=/home/rpmpackage/saltmaster/目錄
[root@cdncenter scripts]# cat inotify.sh #!/bin/sh SRC_dir=/mpeg/mirrors/yumwarehouse/rhel6/ DST_address=10.80.0.161 DST_dir=/home/rpmpackage/saltmaster/ inotifywait -mrq -e create,move,delete,modify ${SRC_dir} |while read D E F do rsync -azvP --delete --progress ${SRC_dir} root@${DST_address}:${DST_dir} done優化:當更新較頻繁時,應避免並發執行rsync備份(當rsync進程已經存在,則忽略本次同步,或根據rsync進程數量來決定是否同步)
[root@cdncenter scripts]# cat inotify_rsync.sh #!/bin/sh SRC_dir=/mpeg/mirrors/yumwarehouse/rhel6/ DST_address=10.80.0.161 DST_dir=/home/rpmpackage/saltmaster/ inotifywait -mrq -e create,move,delete,modify ${SRC_dir} |while read D E F do a=`pgrep rsync|wc -l` if [ $a -le 3 ];then /usr/bin/rsync -azvP --delete --progress ${SRC_dir} root@${DST_address}:${DST_dir} fi done
註:進程數大於3個時,暫停同步
---rsync完結
RSYNC04-配置rsync+inotify實現實時同步