Cetnos環境下inotify+rsync實時同步

一.介紹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 指定文件變化的詳細信息

相關文章
相關標籤/搜索