一.介紹web
1.1 rsync命令是一個遠程數據同步工具,可經過LAN/WAN快速同步多臺主機間的文件。rsync使用所謂的「rsync算法」來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不一樣部分,而不是每次都整份傳送,所以速度至關快。
算法
1.2 Inotify一種強大的、細粒度的、異步文件系統監控機制,它知足各類各樣的文件監控須要,能夠監控文件系統的訪問屬性、讀寫屬性、權限屬性、刪除建立、移動等操做,也就是能夠監控文件發生的一切變化vim
1.3 inotify+rsync結合,能夠作到遠程數據的實時同步,如下實驗使用rsync客戶端+inotify實時將數據同步到rsync服務端bash
二.環境準備服務器
2.1 系統:CentOS6.5異步
rsync客戶端:192.168.55.229ide
rsync服務端:192.168.55.219工具
2.2 rsync和inotify安裝:測試
# yum install rsync # yum install inotify-tools
三.rsync服務器配置ui
3.1 編輯rsync服務端配置文件
# vim /etc/rsyncd.conf log file = /var/log/rsyncd.log pid file = /usr/local/rsync/var/rsyncd.pid lock file = /usr/local/rsync/var/rsyncd.lock secrets file = /usr/local/rsync/etc/rsyncd.pas read only = no hosts allow = 192.168.55.0/24 list = yes uid = nobody gid = nobody use chroot = no max connections = 4 [bak] //模塊 path = /bak //模塊目錄 comment = nfs bak //描述信息 auth users = bak //rsync同步須要的認證用戶
3.2 rsync服務器建立密碼文件
# vim rsyncd.pas bak:338912 //格式爲用戶名:密碼,文件權限爲600
3.3 rsync服務啓動
# /usr/bin/rsync --daemon --config=/etc/rsyncd.conf
四.rsync客戶端配置
4.1 編輯rsync客戶端同步須要的密碼文件
# vim /etc/rsync.pas 338912 //rsync客戶端只須要認證用戶的密碼,文件權限爲600
4.2 命令行驗證rysnc客戶端到rsync服務端同步功能
# rsync -avzc --progress --delete --password-file=/etc/rsync.pas /tmp/test/ bak@192.168.55.219::bak sending incremental file list ./ test/ sent 223 bytes received 15 bytes 476.00 bytes/sec total size is 394699 speedup is 1658.40
注:若是有「failed: Permission denied (13)」這種錯誤,須要給與服務端配置文件中用戶nobody對模塊所在目錄有寫權限
4.3 使用inotify+rsync腳本實現文件的實時檢測並同步
腳本內容以下:
#!/bin/bash src=/tmp/test/ des=bak rsync_passwd_file=/etc/rsync.pas ip1=192.168.55.219 user=bak cd ${src} /usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file do INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify輸出切割 把事件類型部分賦值給INO_EVENT INO_FILE=$(echo $file | awk '{print $2}') # 把inotify輸出切割 把文件路徑部分賦值給INO_FILE echo "-------------------------------$(date)------------------------------------" echo $file #增長、修改、寫入完成、移動進事件 #增、改放在同一個判斷,由於他們都確定是針對文件的操做,即便是新建目錄,要同步的也只是一個空目錄,不會影響速度。 if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]];then echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO' rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} fi #刪除、移動出事件 if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]];then echo 'DELETE or MOVED_FROM' rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} fi #修改屬性事件 指 touch chgrp chmod chown等操做 if [[ $INO_EVENT =~ 'ATTRIB' ]] then echo 'ATTRIB' if [ ! -d "$INO_FILE" ] # 若是修改屬性的是目錄 則不一樣步,由於同步目錄會發生遞歸掃描,等此目錄下的文件發生同步時,rsync會順帶> 更新此目錄。 then rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} fi fi done
注:爲作到實時同步,就必需要減小rsync對目錄的遞歸掃描判斷,儘量的作到只同步inotify監控到已發生更改的文件。結合rsync的特性,因此該腳本是分開判斷來實現一個目錄的增刪改查對應的操做,已經在測試機測試成功。由於inotify只在啓動時會監控目錄,他沒有啓動期間的文件發生更改,它是不知道的,因此能夠在啓動該腳本前作一次rsync全量同步,啓動腳本後使用計劃任務定時作rsync全量同步,防止各類意外遺漏,保證數據一致。
此腳本參考連接:http://www.ttlsa.com/web/let-infotify-rsync-fast/
五.rsync和inotify經常使用參數解釋
5.1 rsync經常使用參數說明
-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持全部文件屬性
-c, --checksum 打開校驗開關,強制對文件傳輸進行校驗
--delete 刪除那些DST中SRC沒有的文件
-H, --hard-links 保留硬連接
-b, --backup 建立備份,也就是對於目的已經存在有一樣的文件名時,將老的文件從新命名爲~filename。可使用--suffix選項來指定不一樣的備份文件前綴
--backup-dir 將備份文件(如~filename)存放在在目錄下
-z, --compress 對備份的文件在傳輸時進行壓縮處理
5.2 inotify經常使用參數說明
-m 要持續監視變化
-r 使用遞歸形式監視目錄
-q 減小冗餘信息,只打印出須要的信
--format 指定文件變化的詳細信息