天天看點

基于rsync+inotify實作資料實時同步傳輸

前言

與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支援增量備份等優點,通過rsync可以解決對實時性要求不高的資料備份需求,但随着檔案數量的增大和實時同步的要求,rsync已不能滿足需求,随之rsync+inotify便應運而生。本文将講解rsync的基礎知識和如何基于rsync+inotify實作資料實時同步傳輸。

rsync相關介紹

rsync(remote sync)是一款快速增量備份工具(遠端同步),支援本地複制,或者與其他SSH(安全傳輸)、rsync主機同步。

特點

①可以鏡像儲存整個目錄樹或檔案系統

②較高的資料傳輸效率

③可以借助于ssh實作安全資料傳輸

④支援匿名傳輸

工作模式

①shell模式,也稱作本地模式

②遠端shell模式,可以利用ssh協定承載其遠端傳輸過程

③清單模式,僅列出源中的内容,-nv

④服務模式,此時rsync工作為守護程序,能接收用戶端的資料同步請求

指令選項

-n: 同步測試,不執行真正的同步過程;
-v: 詳細輸出模式
-q: 靜默模式
-c: checksum,開啟校驗功能
-r: 遞歸複制
-a: 歸檔,保留檔案的原有屬性;
-p: 保留檔案的權限;
-t: 保留檔案的時間戳;
-l: 保留符号連結
-g: 保留屬組
-o: 保留屬主
-D:保留裝置檔案
-e ssh: 使用ssh作為傳輸承載;
-z: 壓縮後傳輸;
--progress: 顯示進度條
--stats: 顯示如何執行壓縮和傳輸      
注意:rsync指令中,如果源路徑是目錄,且給複制路徑時末尾有/,則會複制目錄中的内容,而非目錄本身;如果末尾沒有/,則會同步目錄本身及目錄中的所有檔案;目标路徑末尾是否有/無關緊要;
如:rsync -r /var/log/ /tmp #複制/var/log目錄下的所有檔案,不包括log本身
    rsync -r /var/log  /tmp #複制/var/log整個目錄      

rsync同步資料的時候,需要完整掃描檔案,比對變化的檔案,如果檔案數量過于龐大,這樣掃描是非常耗時的,而且rsync雖然可以通過crontab實作定期同步,但是也達不到實時同步的要求,要想解決這一弊端,就需要inotify了

資料實時同步實作

inotify相關介紹

可用于定義監控指定的目錄下的所有檔案,一旦有檔案的中繼資料發生改變,就通知rsync進行資料同步,以此實作實時同步

部署過程

我們通過一個執行個體來看一下rsync+inotify是如何實作資料同步的

案例要求

web伺服器1:172.16.10.100(主伺服器)

web伺服器2:172.16.10.212(輔伺服器)

兩台web伺服器,要求在主伺服器上更新資料,輔伺服器要自動更新資料

rsync角色說明:因為inotify是監控在rsync的用戶端,而且是主動同步,是以在此應用場景中主伺服器為rsync用戶端,輔伺服器為rsync伺服器端

rsync伺服器端配置

[root@scholar ~]# yum install xinetd -y  #安裝守護程序,rsync系統自帶,如果沒有安裝即可
[root@scholar ~]# vim /etc/xinetd.d/rsync
         #修改此項
        disable = no #啟用rsync

[root@scholar ~]# vim /etc/rsyncd.conf #為rsync建立配置檔案,預設沒有此檔案

# Global Settings
uid = nobody                      #運作rsync使用者
gid = nobody                      #運作rsync組
use chroot = no                   #關閉chroot
max connections = 10              #最大并發連接配接數
strict modes = yes                #開啟嚴格模式
pid file = /var/run/rsyncd.pid    #pid檔案位置
log file = /var/log/rsyncd.log    #日志檔案位置

# Directory to be synced
[web]                             #檔案共享名
path = /web                       #共享檔案路徑
ignore errors = yes               #忽略錯誤
read only = no                    #不允許讀
write only = no                   #不允許寫
hosts allow = 172.16.0.0/16       #白名單
hosts deny = *                    #黑名單
list = false                      #不允許列出檔案
uid = root                        #共享已root使用者運作,可覆寫全局配置
gid = root                        #共享已root組運作,可覆寫全局配置
auth users = scholar              #使用者認證
secrets file = /etc/rsync.passwd  #認證檔案

[root@scholar ~]# vim /etc/rsync.passwd #建立認證檔案
#格式:username:password,此檔案不能允許其它使用者有通路權限,且密碼不能超過8個字元
scholar:scholar

[root@scholar ~]# chmod 600 /etc/rsync.passwd #設定權限      

啟動服務,設定開機自啟,檢視監聽端口

基于rsync+inotify實作資料實時同步傳輸

rsync用戶端配置

建立認證檔案,隻需密碼即可

基于rsync+inotify實作資料實時同步傳輸

測試資料同步的方法

Access via rsync daemon:
   Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
   如:rsync --password-file=/etc/rsync.passwd [email protected]::web /web
       rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
   如:rsync --password-file=/etc/rsync.passwd rsync://[email protected]/web /web
   Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
   如:rsync --password-file=/etc/rsync.passwd /web [email protected]::web
         rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
   如:rsync --password-file=/etc/rsync.passwd /web rsync://[email protected]/web	      

安裝inotify-tools

[root@scholar ~]# tar xf inotify-tools-3.14.tar.gz 
[root@scholar ~]# cd inotify-tools-3.14
[root@scholar inotify-tools-3.14]# ./configure
[root@scholar inotify-tools-3.14]# make && make install      

建立rsync腳本

[root@scholar ~]# vim /usr/local/bin/rsyncd

#!/bin/bash
SRC=/web/
DEST=web
HOST=172.16.10.212
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e 
modify,delete,create,attrib $SRC | while read files;
do
        rsync -vzrtopg --delete --progress --password-file=/etc/rsync.passwd $SRC 
        scholar@$HOST::$DEST
done

#inotifywait參數詳解:
#-m,表示始終保持事件監聽狀态
#-r,表示遞歸查詢目錄
#-q,表示列印出監控事件
#-e,指定要監控的事件,包括modify、delete、create、attrib等
#--timefmt:指定時間的輸出格式
#--format:指定變化檔案的詳細資訊      

設定開機自動運作

基于rsync+inotify實作資料實時同步傳輸

測試同步

我們在主伺服器上增加一個站點,站點已做好我們直接複制進去

基于rsync+inotify實作資料實時同步傳輸

我們去輔伺服器上看一下,資料有沒有同步過來

基于rsync+inotify實作資料實時同步傳輸

繼續閱讀