rsync、inotify實現文件實時同步

1、Rsync概述web

2、Rsync命令選項及配置文件介紹算法

3、Rsync的應用模式shell

4、Inotify簡介vim

5、Inotify-tools工具使用介紹windows

6、rsync+inotify實現實時同步安全


1、rsync概述bash

   rsync是類Unix系統下的數據鏡像備份工具,它能很輕鬆的實現本地鏡像與遠程同步文件;從軟件的命名上就能看得出來——remote sync。服務器

什麼是rsync併發

   Rsync是一個遠程數據同步工具,可經過LAN/WAN 快速同步多臺主機間的文件。Rsync使用所謂的「rsync 算法」來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不一樣部分,而不是每次都整份傳送,所以速度至關快。ssh

   rsync原本是用於替代rcp 的一個工具,目前由rsync.samba.org 維護,因此rsync.conf 文件的格式相似於samba 的主配置文件。Rsync能夠經過rshssh 使用,也能以daemon 模式去運行在以daemon方式運行時Rsyncserver會打開一個873 端口,等待客戶端去鏈接。鏈接時,Rsyncserver會檢查口令是否相符,若經過口令查覈,則能夠開始進行文件傳輸。第一次連通完成時,會把整份文件傳輸一次,之後則就只需進行增量備份。

   Rsync 支持大多數的類Unix 系統,不管是LinuxSolaris 仍是BSD 上都通過了良好的測試。此外,它在windows平臺下也有相應的版本,如cwRsync和Sync2NAS等工具。

rsync的功能特性:

   能夠鏡像保存整個目錄樹和文件系統

   能夠增量同步數據,文件傳輸效率高

   加密傳輸數據,保證了數據的安全性

   可使用rcp ssh 等方式來傳輸文件,固然也能夠直接經過Socket鏈接傳輸文件

   無須特殊權限便可安裝

   支持匿名傳輸


2、Rsync命令選項及配置文件介紹

一、rsync命令使用格式:

   rsync [選項] 備份源 備份目標

選項:

   -a    #使用歸檔(archive)模式,保留文件原有屬性等同於「-rlptgoD」等多個選項組合

   -v    #顯示同步過程的詳細信息

   -c    #打開校驗開關,強制對文件傳輸進行校驗

   -l    #保留軟件連接

   -L    #像對待普通文件同樣處理軟連接

   -D    #保持設備文件信息

   -W    #拷貝文件不進行增量檢測

   -x    #不要跨越文件系統邊界

   -e    #指定使用rshssh方式進行同步數據

   -r    #遞歸模式,包含目錄及子目錄中全部文件

   -H    #保留硬鏈接

   -u    #僅進行更新,跳過全部已經存在於DST,而且文件時間晚於要備份的文件(不覆蓋更新的文件)

   -t    #保留文件的時間標記

   -z    #在傳輸過程當中進行壓縮

   -o    #保留文件的屬主(僅超級用戶使用)

   -g    #保留文件的屬組(僅超級用戶使用)

   -p    #保留文件原的權限

   --port=PORT    #指定其餘Rsync服務端口

   --delete       #刪除目標目錄有而源目錄中沒有的文件

   --progress     #顯示傳輸過程

   --exclude=PATTERN    #指定排除不須要同步的文件模式

   --include=PATTERN    #指定不排除而須要同步的文件模式

   --password-file=FILE #指定密碼文件位置

二、rsync主配置文件

註釋:

######全局參數
pid file= /var/run/rsync.pid
port = 873
lock file= /var/run/lock.log
log file= /var/log/rsync.log
motd file= /etc/rsync/rsync.motd
######模塊參數
[ALLEN]
comment = "Web File"
path = /web
use chroot = no
max connections = 10
readonly = no
write only = yes
list = no
uid = root
gid = root
auth users= rsync
secrets file= /etc/rsync/rsync.pass
strict modes = yes
hosts allow = 172.16.14.1
hosts deny = *
ignore errors = yes
timeout = 120
log format= %t %a %m %f%b

 全局參數:第2~6

PID文件
服務端口
鎖文件
日誌文件
當客戶端鏈接服務器時的通知消息文件

 模塊參數:第8~26

定義服務器要被同步的目錄或文件,客戶端能夠直接指定該名稱
描述信息
須要同步的目錄
若是此項設置爲yes相對安全一些,但在每次傳輸文件以前要先chroot到path參數指定的目錄,要以root權限
最大併發鏈接
是否只讀
是否可寫
當客戶端請求時是否容許列表形式查看
運行守護進程的uid
運行守護進程的gid
指定用戶名列表,用逗號或空格分隔
指定一個包含「用戶名:密碼」的文件
此項檢測密碼文件的權限
容許鏈接的主機,但是爲網段如:172.16.0.0/16
不容許鏈接rsync服務器的主機
數據傳輸時忽略IO錯誤
指定超時時間
指定日誌格式:%h 遠程主機名、%a 遠程IP地址、%l 文件長度字符數、%p 該次rsync會話的進程id、%f 文件名、%P 模塊路徑、%t 當前時間、%u 認證的用戶名(匿名用戶時是null)、%b 實際傳輸的字節數;默認格式爲:" %o %h [%a] %m (%u) %f %l"



3、rsync 的應用模式

   rsync4 種應用模式,第一種是shell應用模式,也稱爲本地模式;第二種是遠程shell模式,它利用SSH 執行底層鏈接和加密傳輸;第三種是查詢〈也叫列表〉模式,與ls 命令實現的功能相似;第四種是服務器模式,平時所說的架設rsync 服務器就是指這種模式。下面分別對這4 種模式進行介紹:

第一種模式:本地Shell模式

   本地Shell模式主要是複製一個目錄中的文件到另外一目錄,如:

第二種模式:遠程Shell模式

   rsync遠程Shell模式能夠把本地目錄同步到另外一臺主機系統中,如:

第三種模式:列表模式

   rsyncls命令有類似的功能,如:

第四種模式:服務器模式

   這種模式是基於C/S模式的,在這種模式下,rsync在後臺啓動了一個守護進程,這個守護進程在rsync服務器端永久運行,用於接收文件傳輸請求,所以客戶能夠把文件發送給守護進程,也能夠向守護進程請求文件。rsync服務器模式很是適合異地數據備份;咱們在後面介紹


4、Inotify簡介

rsync的優勢與不足

   與傳統的cp 、tar 備份方式相比, rsync 具備安全性高、備份迅速、支持增量備份等優勢,經過rsync 能夠解決對實時性要求不高的數據備份需求,例如,按期地備份文件服務器數據到遠端服務器,對本地磁盤按期進行數據鏡像等。隨着應用系統規模的不斷擴大,對數據的安全性和可靠性提出了更高的要求, rsync 在高端業務系統中也逐漸暴露出了不少不足。首先, rsync 同步數據肘,須要掃描全部文件後進行比對,而後進行差量傳輸。若是文件數量達到了百萬甚至千萬量級,掃描全部文件將是很是輯時的,並且發生變化的每每是其中不多的一部分,所以rsync 是很是低效的方式。其次, rsync 不能實時監測、同步數據,雖然它能夠經過Linux 守護進程的方式觸發同步,可是兩次觸發動做必定會有時間差,可能致使服務器端和客戶端數據出現不一致,沒法在出現應用故障時徹底恢復數據。基於以上緣由, rsync+inotify 組合出現了!

inotify簡介

   inotify 是一種強大的、細粒度的、異步的文件系統事件監控機制, Linux 內核從2.6.13版本起,加入了對inotify的支持。經過inotify能夠監控文件系統中添加、刪除、修改、移動等各類細微事件,利用這個內核接口,第三方軟件能夠監控文件系統下文件的各類變化狀況,inotify-tools就是這樣的一個第三方軟件。這樣rsync 就能夠實現觸發式的文件同步,可是經過crontab 守護進程方式進行觸發,同步的數據和實際數據會有差別,而inotify 能夠監控文件系統的各類變化,當文件有任何變更時,會觸發rsync同步,這樣恰好解決了同步數據的實時性問題。


5、Inotify-tools工具使用介紹

安裝完成後,會生成inotifywait和inotifywatch兩個命令:

   inotifywait用於等待文件或文件集上的一個待定事件,能夠監控任何文件和目錄設置,而且能夠遞歸地監控整個目錄樹;

   inotifywatch用於收集被監控的文件系統計數據,包括每一個inotify事件發生多少次等信息

從上面可知inotifywait是一個監控事件,能夠配合shell腳本使用它。與它相關的參數:

語法格式:inotifywait [-hcmrq][-e][-t][--format][-timefmt][...]

   -m: 即「--monitor」   表示始終保持事件監聽狀態。

   -r: 即「--recursive」 表示遞歸查詢目錄

   -q: 即「--quiet」     表示打印出監控事件

   -o: 即「--outfile」   輸出事情到一個文件而不是標準輸出

   -s:  即「--syslog」    輸入錯誤信息到系統日誌

   -e: 即「--event」,   經過此參數能夠指定要監控的事件,常見的事件有modifydeletecreateclose_write、move、close、unmount和attrib等

   -format: 指定輸出格式;經常使用的格式符如:%w:表示發生事件的目錄  %f:表示發生事件的文件  %e:表示發生的事件  %T:使用由-timefmt定義的時間格式

   -timefmt:指定時間格式,用於-format選項中的%T格式

inotifywatch是收集數據的指令,它的相關參數:

語法格式:inotifywatch[-hvzrqf][-e][-t][-a][-d][...]

   -fromfile:從文件中讀取須要監控的文件或排除的文件,一個文件一行,排除的文件以"@"開頭

   -z:  即「-zero」          輸出表格的行和列,即便元素爲空

   -r:  即「-recursive」     監視一個目錄下的全部子目錄

   -t:  即「-timeout」       設置超時時間

   -e:   即「-event」         只監聽指定的事件


6、Rsync+Inotify實現實時同步

下面以一個案例的形式來安裝配置Rsync+Inotify實時同步數據

源主機:系統 Centos6.4_x86_64    同步文件目錄"/data"

目標主機:系統 Centos6.4_x86_64    備份目錄"/data"

一、在目標主機上面以rpm方式安裝rsync軟件並配置,並讓rsync以超級守護進程運行

######安裝rsync軟件並安裝超級守護進程軟件xinetd
[root@localhost ~]# yum -y install rsync xinetd
######爲rsync提供主配置文件,安裝好默認沒有配置文件
[root@localhost ~]# vim /etc/rsyncd.conf
uid=nobody
gid=nobody
use chroot = no
max connections = 3
strict modes = yes
pid file= /var/run/rsync.pid
log file= /var/log/rsync.log
[data]
path = /data
ignort errors = yes
timeout = 120
readonly= no
write only = yes
hosts allow = 172.16.0.0/16
hosts deny = *
list = no
uid = root
gid = root
auth users= allen
secrets file= /etc/rsync.pass
######爲rsync提供密碼認證文件
[root@localhost ~]# echo "allen:Data14.3" > /etc/rsync.pass
######修改密碼文件權限
[root@localhost ~]# chmod 600 /etc/rsync.pass
######讓rsync開機自啓動
[root@localhost ~]# chkconfig rsync on
######啓動超級守護進程
[root@localhost ~]# service xinetd start
######查看是否爲開機啓動
[root@localhost ~]# chkconfig --list | grep rsync
    rsync:          on

二、查看進程有沒有監控"873/tcp"端口,rsync默認端口爲873;如:

三、在源主機上面安裝rsync與inotify-tools,不用作任何配置:

[root@localhost ~]# yum -y install rsync inotify-tools

四、編譯同步腳本,設置權限並加入到開機啓動:

[root@localhost ~]# vim rsync.sh
#!/bin/bash
Host=172.16.14.3
SDIR=/data
DDIR=data
/usr/bin/inotifywait -mrq --timefmt '%d/%m%y %H%M'--format '%T %w %f'-e modify,delete,create,attrib $SDIR  | whileread files
do/usr/bin/rsync -avz --delete--password-file=/root/rsync.pass $SDIR allen@${Host}::$DDIR &> /dev/null
echo "${files} was rsyncd">> /tmp/rsyncd.log 2>&1
echo "+++++++++++++++++++++++++++++++++++++++"
done
#####建立密碼文件
[root@localhost ~]# echo "Data14.3"> .rsync.pass
######修改密碼文件權限並添加腳本執行權限
[root@localhost ~]# chmod 600.rsync.pass
[root@localhost ~]# chmod +x rsync.sh
######加入開機啓動
[root@localhost ~]# echo "/root/rsync.sh">> /etc/rc.d/rc.local

五、執行同步腳本測試是否能成功同步:

這裏爲了測試看到效果使用"bash -xrsync.sh"執行,若是正常執行腳本同步的話之後臺形式運行:「/root/rsync.sh &」

六、在目標主機查看驗證:

   至此已經所有完成,若是須要同步到多臺主機,相似目標主機的作法便可。若是作的過程當中遇到問題能夠留言...

相關文章
相關標籤/搜索