1. 程式人生 > >RSYNC04-配置rsync+inotify實現實時同步

RSYNC04-配置rsync+inotify實現實時同步

cccccc ror 編譯速度 響應 大於 grep 軟件開發 介紹 cdn

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機制提供了三個調控參數:

  1. max_queued_events #表示監控事件隊列
  2. max_user_instances #表示最多監控實例數
  3. 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實現實時同步