rsync組合inotify-tools完成實時同步[轉]

一. 什麼是inotifycss

inotify是一種強大的、細粒度的、異步的文件系統事件監控機制,Linux內核從2.6.13開始引入,容許監控程序打開一個獨立文件描述符,並針對事件集監控一個或者多個文件,例如打開、關閉、移動/重命名、刪除、建立或者改變屬性。python

 

CentOS6天然已經支持:
使用ll /proc/sys/fs/inotify命令,是否有如下三條信息輸出,若是沒有表示不支持。linux

 

total 0
-rw-r--r-- 1 root root 0 Dec 11 15:23 max_queued_events
-rw-r--r-- 1 root root 0 Dec 11 15:23 max_user_instances
-rw-r--r-- 1 root root 0 Dec 11 15:23 max_user_watches

 

  • /proc/sys/fs/inotify/max_queued_evnets表示調用inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丟棄,但會觸發IN_Q_OVERFLOW事件。sql

  • /proc/sys/fs/inotify/max_user_instances表示每個real user ID可建立的inotify instatnces的數量上限。segmentfault

  • /proc/sys/fs/inotify/max_user_watches表示每一個inotify instatnces可監控的最大目錄數量。若是監控的文件數目巨大,須要根據狀況,適當增長此值的大小。服務器

 

inotify-tools:app

 

inotify-tools是爲linux下inotify文件監控工具提供的一套C的開發接口庫函數,同時還提供了一系列的命令行工具,這些工具 能夠用來監控文件系統的事件。 inotify-tools是用c編寫的,除了要求內核支持inotify外,不依賴於其餘。inotify-tools提供兩種工具,一是inotifywait,它是用來監控文件或目錄的變化,二是inotifywatch,它是用來統計文件系統訪問的次數。異步

 

下載inotify-tools-3.14-1.el6.x86_64.rpm,經過rpm包安裝:函數

 

# rpm -ivh /apps/crm/soft_src/inotify-tools-3.14-1.el6.x86_64.rpm 
warning: /apps/crm/soft_src/inotify-tools-3.14-1.el6.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 4026433f: NOKEY
Preparing...                ########################################### [100%]
   1:inotify-tools          ########################################### [100%]
# rpm -qa|grep inotify
inotify-tools-3.14-1.el5.x86_64

二.inotifywait使用示例工具

監控/root/tmp目錄文件的變化:

 

/usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f' \
 -e modify,delete,create,move,attrib /root/tmp/

 

上面的命令表示,持續監聽/root/tmp目錄及其子目錄的文件變化,監聽事件包括文件被修改、刪除、建立、移動、屬性更改,顯示到屏幕。執行完上面的命令後,在/root/tmp下建立或修改文件都會有信息輸出:

 

2014/12/11-15:40:04 /root/tmp/ new.txt
2014/12/11-15:40:22 /root/tmp/ .new.txt.swp
2014/12/11-15:40:22 /root/tmp/ .new.txt.swx
2014/12/11-15:40:22 /root/tmp/ .new.txt.swx
2014/12/11-15:40:22 /root/tmp/ .new.txt.swp
2014/12/11-15:40:22 /root/tmp/ .new.txt.swp
2014/12/11-15:40:23 /root/tmp/ .new.txt.swp
2014/12/11-15:40:31 /root/tmp/ .new.txt.swp
2014/12/11-15:40:32 /root/tmp/ 4913
2014/12/11-15:40:32 /root/tmp/ 4913
2014/12/11-15:40:32 /root/tmp/ 4913
2014/12/11-15:40:32 /root/tmp/ new.txt
2014/12/11-15:40:32 /root/tmp/ new.txt~
2014/12/11-15:40:32 /root/tmp/ new.txt
...

三.組合rsync實現實時同步

這一步的核心其實就是在客戶端建立一個腳本rsync.sh,適用inotifywait監控本地目錄的變化,觸發rsync將變化的文件傳輸到遠程備份服務器上。爲了更接近實戰,咱們要求一部分子目錄不一樣步,如/root/tmp/log和臨時文件。

1. 建立排除在外不一樣步的文件列表

排除不須要同步的文件或目錄有兩種作法,第一種是inotify監控整個目錄,在rsync中加入排除選項;第二種是inotify排除部分不監控的目錄,rsync天然也不會觸發。咱們選擇第二種。

 

這個操做在客戶端進行,/root/tmp/log以及/root/tmp/src目錄下的js、css和一些臨時文件不一樣步,因此不須要inotifywait,/root/tmp下的其餘文件和目錄都同步。(其實對於打開的臨時文件,能夠不監聽modify時間而改爲監聽close_write)

 

# vi /etc/inotify_rsync_exclude.lst:
@/root/tmp/cache??*
@/root/tmp/src/js
@/root/tmp/src/css
@/root/tmp/src
@/root/tmp/src/20*/20*/20*/.??*
@/root/tmp/log/

 

目前測試看到只能用絕對路徑。

 

2.客戶端同步到遠程的腳本rsync.sh

rsync.sh文件:

#variables
current_date=$(date +%Y%m%d_%H%M%S)
source_path=/home/guotmp/
log_file=/var/log/rsync_client.log

#rsync
rsync_server=192.168.1.84
rsync_user=ant5
rsync_pwd=/etc/rsync-84.pas
rsync_module=tmp

#rsync client pwd check
if [ ! -e ${rsync_pwd} ];then
    echo -e "rsync client passwod file ${rsync_pwd} does not exist!"
    exit 0
fi

#inotify_function
inotify_fun(){
    /usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f' \
          --fromfile /etc/inotify_rsync_exclude.lst -e modify,delete,create,move,attrib ${source_path} \
          | while read file
      do
          /usr/bin/rsync -auvrtzopgP --progress --bwlimit=200 --password-file=${rsync_pwd} ${source_path} ${rsync_user}@${rsync_server}::${rsync_module}
      done
}

--bwlimit=200用於限制傳輸速率最大200kb,由於在實際應用中發現若是不作速率限制,會致使巨大的CPU消耗。

 

在客戶端運行腳本# ./rsync.sh便可實時同步目錄。

 

本文摘自:http://segmentfault.com/a/1190000002427568

相關文章
相關標籤/搜索