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能夠經過rsh 或ssh 使用,也能以daemon 模式去運行在以daemon方式運行時Rsyncserver會打開一個873 端口,等待客戶端去鏈接。鏈接時,Rsyncserver會檢查口令是否相符,若經過口令查覈,則能夠開始進行文件傳輸。第一次連通完成時,會把整份文件傳輸一次,之後則就只需進行增量備份。
Rsync 支持大多數的類Unix 系統,不管是Linux、Solaris 仍是BSD 上都通過了良好的測試。此外,它在windows平臺下也有相應的版本,如cwRsync和Sync2NAS等工具。
rsync的功能特性:
能夠鏡像保存整個目錄樹和文件系統
能夠增量同步數據,文件傳輸效率高
加密傳輸數據,保證了數據的安全性
可使用rcp 、ssh 等方式來傳輸文件,固然也能夠直接經過Socket鏈接傳輸文件
無須特殊權限便可安裝
支持匿名傳輸
2、Rsync命令選項及配置文件介紹
一、rsync命令使用格式:
rsync [選項] 備份源 備份目標
選項:
-a #使用歸檔(archive)模式,保留文件原有屬性等同於「-rlptgoD」等多個選項組合
-v #顯示同步過程的詳細信息
-c #打開校驗開關,強制對文件傳輸進行校驗
-l #保留軟件連接
-L #像對待普通文件同樣處理軟連接
-D #保持設備文件信息
-W #拷貝文件不進行增量檢測
-x #不要跨越文件系統邊界
-e #指定使用rsh、ssh方式進行同步數據
-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 的應用模式
rsync有4 種應用模式,第一種是shell應用模式,也稱爲本地模式;第二種是遠程shell模式,它利用SSH 執行底層鏈接和加密傳輸;第三種是查詢〈也叫列表〉模式,與ls 命令實現的功能相似;第四種是服務器模式,平時所說的架設rsync 服務器就是指這種模式。下面分別對這4 種模式進行介紹:
第一種模式:本地Shell模式
本地Shell模式主要是複製一個目錄中的文件到另外一目錄,如:
第二種模式:遠程Shell模式
rsync遠程Shell模式能夠把本地目錄同步到另外一臺主機系統中,如:
第三種模式:列表模式
rsync與ls命令有類似的功能,如:
第四種模式:服務器模式
這種模式是基於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」, 經過此參數能夠指定要監控的事件,常見的事件有modify、delete、create、close_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 &」
六、在目標主機查看驗證:
至此已經所有完成,若是須要同步到多臺主機,相似目標主機的作法便可。若是作的過程當中遇到問題能夠留言...