rsync + inotify 實時同步 條件:
需要實時同步的兩臺主機(jī): 192.168.166.10 192.168.166.11 服務(wù)端 192.168.166.10 部署服務(wù):rsync + inotify + 同步腳本 客戶端 192.168.166.11 部署服務(wù):rsync + rsync.conf <只需將 rsync 服務(wù)啟動即可> -- 可擁有多臺客戶端
同步的網(wǎng)站目錄: /usr/local/apache2/htdocs/ghf rsync-3.0.7.tar.gz
2.rsync服務(wù)端和客戶端安裝
# rpm -qa | grep rsync # rpm -e rsync # cd /usr/local/src # tar zxvf rsync-3.0.7.tar.gz # cd rsync-3.0.7 # ./configure --prefix=/usr/local/rsync && make && make install #ln -s /usr/local/rsync/bin/rsync /usr/bin/ # rsync --version rsync version 3.0.7 protocol version 30 <<如果執(zhí)行rsync時報這個錯 rsync: error while loading shared libraries: libiconv.so.2
解決辦法:在/etc/ld.so.conf中加一行/usr/local/lib,運行l(wèi)dconfig,。就可以了,。報錯的 原因可能之前更新過iconv庫>>
3.服務(wù)端操作部分 (1).inotify安裝在服務(wù)端器 # cd /usr/local/src # tar zxvf inotify-tools-3.14.tar.gz # cd inotify-tools-3.14 # ./configure && make && make install 做個軟鏈接
32位系統(tǒng): ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib/libinotifytools.so.0 64位系統(tǒng): ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0 (2).在服務(wù)器端創(chuàng)建腳本 rsync.sh vim rsync.sh #!/bin/bash
########################### # 在這里配置本地文件夾,目標(biāo)host,目標(biāo)的rsync_module,。rsync_module在同步機(jī)器 的/etc/rsyncd.conf文件中配置
# 此腳本可以實現(xiàn)多服務(wù)器多目錄的監(jiān)控 #sync[0]='/tongbu,192.168.166.12,test' # localdir,host,rsync_module #sync[0]='/tongbu,192.168.166.13,test' # localdir,host,rsync_module sync[0]='/usr/local/apache2/htdocs/ghf,192.168.166.11,tongbu' sync[1]='/usr/local/apache2/htdocs/wt1,192.168.166.11,tongbu1' ########################### for item in ${sync[@]}; do dir=`echo $item | awk -F"," '{print $1}'` host=`echo $item | awk -F"," '{print $2}'` module=`echo $item | awk -F"," '{print $3}'` inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' \ --event CLOSE_WRITE,create,move,delete,modify,attrib $dir | while read date time file event
do echo $event'-'$file case $event in MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR) if [ "${file: -4}" != '4913' ] && [ "${file: -1}" != '~' ]; then cmd="rsync -avz --progress --delete --password-file=/etc/rsyncd-client.pass $dir root@$host::$module"
echo $cmd $cmd fi ;; MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR) if [ "${file: -4}" != '4913' ] && [ "${file: -1}" != '~' ]; then cmd="rsync -avz --progress --delete --password-file=/etc/rsyncd-client.pass done
# ./rsync.sh 執(zhí)行同步腳本,,在相應(yīng)的目錄下測試相關(guān)文件. 將此腳本寫入到/etc/rc.local 讓系統(tǒng)自動加載即可. ########################################
腳本相關(guān)注解: -m 是保持一直監(jiān)聽 -r 是遞歸查看目錄 -q 是打印出事件~ -e create,move,delete,modify 監(jiān)聽 創(chuàng)建 移動 刪除 寫入 事件 rsync -aHqzt $SRC $DST
-a 存檔模式
-H 保存硬連接 -q 制止非錯誤信息 -z 壓縮文件數(shù)據(jù)在傳輸 -t 維護(hù)修改時間 -delete 刪除于多余文件 當(dāng)要排出同步某個目錄時,,為rsync添加--exculde=PATTERN參數(shù),,注意,,路徑是相對路徑,。詳
細(xì)查看man rsync
當(dāng)要排除都某個目錄的事件監(jiān)控的處理時,為inotifywait添加--exclude或--excludei參數(shù),。 詳細(xì)查看man inotifywait
另:
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' \ -e modify,delete,create,attrib \ ${src} \ 上面的命令返回的值類似于: 10/03/09 15:31 /wwwpic/1 這3個返回值做為參數(shù)傳給read,,關(guān)于此處,有人是這樣寫的: inotifywait -mrq -e create,move,delete,modify $SRC | while read D E F;do 細(xì)化了返回值,。 說明: 當(dāng)文件系統(tǒng)發(fā)現(xiàn)指定目錄下有如上的條件的時候就觸發(fā)相應(yīng)的指令,,是一種主動告之
的而非我用循環(huán)比較目錄下的文件的異動,,該程序
在運行時,更改目錄內(nèi)的文件時系統(tǒng)內(nèi)核會發(fā)送一個信號,,這個信號會觸發(fā)運行rsync命令,,
這時會同步源目錄和目標(biāo)目錄。
--timefmt:指定輸出時的輸出格式 --format: '%T %w%f'指定輸出的格式 二.關(guān)于inotify介紹
Inotify 是文件系統(tǒng)事件監(jiān)控機(jī)制,,作為 dnotify 的有效替代,。dnotify 是較早內(nèi)核支持的 文件監(jiān)控機(jī)制。Inotify 是一種強(qiáng)大的,、細(xì)粒度的
,、異步的機(jī)制,它滿足各種各樣的文件監(jiān)控需要,,不僅限于安全和性能,。
inotify 可以監(jiān)視的文件系統(tǒng)事件包括:
IN_ACCESS,即文件被訪問 IN_MODIFY,,文件被 write IN_ATTRIB,,文件屬性被修改,如 chmod,、chown,、touch 等 IN_CLOSE_WRITE,可寫文件被 close IN_CLOSE_NOWRITE,,不可寫文件被 close IN_OPEN,文件被 open IN_MOVED_FROM,,文件被移走,如 mv IN_MOVED_TO,,文件被移來,如 mv,、cp IN_CREATE,,創(chuàng)建新文件 IN_DELETE,文件被刪除,,如 rm IN_DELETE_SELF,,自刪除,即一個可執(zhí)行文件在執(zhí)行時刪除自己 IN_MOVE_SELF,,自移動,,即一個可執(zhí)行文件在執(zhí)行時移動自己 IN_UNMOUNT,宿主文件系統(tǒng)被 umount IN_CLOSE,,文件被關(guān)閉,,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) IN_MOVE,文件被移動,,等同于(IN_MOVED_FROM | IN_MOVED_TO) 注:上面所說的文件也包括目錄,。 4.在客戶端創(chuàng)建/etc/rsyncd.conf uid=root gid=root hosts allow=192.168.166.10 服務(wù)器IP #hosts deny=0.0.0.0/32 use chroot=no max connections=10 secrets file=/etc/rsyncd.pas motd file=/etc/rsyncd.motd pid file =/var/run/rsyncd.pid lock file=/var/run/rsyncd.lock log file=/var/log/rsyncd.log [tongbu] 模塊名
path=/usr/local/apache2/htdocs/ comment=rsync files 同步目錄 ignore errors read only=no list=yes auth users=root secrets file=/etc/rsyncd.pas pid file=/var/run/rsyncd.pid log file=/var/log/rsyncd.log lock file=/var/run/rsyncd.lock [test1] path=/usr/local/apache2/htdocs/ comment=rsync files ignore errors read only=no list=no auth users=root secrets file=/etc/rsyncd.pas pid file=/var/run/rsyncd.pid log file=/var/log/rsyncd.log lock file=/var/run/rsyncd.lock 5.配置/etc/rsyncd.pas root:000000 格式為:用戶名:密碼,,可以設(shè)置多個用戶密碼 6.修改rsyncd.pas的文件屬性
chmod 0600 /etc/rsyncd.pas 7.啟動rsync,默認(rèn)端口為873
/usr/local/rsync/bin/rsync --daemon --port=873 --config=/etc/rsyncd.conf & 二:服務(wù)端腳本安裝
1.配置/etc/rsyncd-client.pass
000000 格式為:只有密碼無用戶名 2.修改rsyncd-client.pass的文件屬性
chmod 0600 /etc/rsyncd-client.pass
三:OK,現(xiàn)在可以測試?yán)玻?/div>
|
|