基于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 #設置權限

啟動服務,設置開機自啟,查看監聽端口

1.jpg

rsync客戶端配置

創建認證文件,只需密碼即可

2.jpg

測試數據同步的方法

Access via rsync daemon:
   Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
   如:rsync --password-file=/etc/rsync.passwd scholar@172.16.10.212::web /web
       rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
   如:rsync --password-file=/etc/rsync.passwd rsync://scholar@172.16.10.212/web /web
   Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
   如:rsync --password-file=/etc/rsync.passwd /web scholar@172.16.10.212::web
         rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
   如:rsync --password-file=/etc/rsync.passwd /web rsync://scholar@172.16.10.212/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:指定變化文件的詳細信息

設置開機自動運行

3.jpg

測試同步

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

4.jpg

我們去輔服務器上看一下,數據有沒有同步過來

5.jpg

同步成功,至此基于rsync + inotify實現數據實時同步配置完成

The end 

好了,rsync + inotify就講到這里了,如果要實現多臺從服務器同步,多設幾個rsync服務器端就好了,相應的主服務器inotify的腳本也需要略加修改,過程并不麻煩,實驗過程中遇到問題可留言。以上僅為個人學習整理,如有錯漏,大神勿噴~~~

原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/3694

(0)
書生書生
上一篇 2015-04-27
下一篇 2015-04-27

相關推薦

  • N21天天第十二周課程練習

    1、請描述一次完整的http請求處理過程; 1、建立TCP連接 2、Web瀏覽器向Web服務器發送請求 3、Web瀏覽器發送請求頭信息   建立連接后,客戶機發送一個請求給服務器,請求方式的格式為:統一資源標識符(URL)、協議版本號,后邊是MIME   信息包括請求修飾符、客戶機信息和可能的內容 4、Web服務器應答…

    Linux干貨 2016-10-31
  • N22-第一周博客:計算機及Linux系統的入門學習了解

                                  …

    Linux干貨 2016-08-15
  • LVS負載均衡wrrdpress

    項目要求:(1) lvs 調度兩臺 nginx+php-fpm real-server,采用 dr 模型,調度算法為 rr(2) mariadb 為 real-server 提供數據庫,nfs 掛載至 2 臺 real-server 提供文件服務項目環境:LVS-SERVER( CentOS 7 )DIP:172.18.99.6VIP:172.18.99.6…

    Linux干貨 2017-05-16
  • 推薦-HA專題: 編譯安裝并配置DRBD

    HA專題: 編譯安裝并配置DRBD 前言 實驗環境 DRBD介紹 安裝前準備工作 獲取并編譯安裝DRBD 配置DRBD 分區 配置文件 啟動并設置DRBD 格式化并掛載 驗證冗余性 總結 前言 上篇我們講到使用corosync+pacemaker實現MySQL高可用, 但是NFS容易成為單點故障從而導致數據丟失等嚴重問題, 我們可以使用drbd來實現MySQ…

    Linux干貨 2016-04-12
  • RAID與邏輯卷

        RAID與邏輯卷作為磁盤管理的方式,各有各的優勢。RAID是多個磁盤合成一個陣列,以便提供更好的性能;邏輯卷相對于分區來說,可以在線擴展空間,也可以縮減空間??梢岳密浖姆绞絹韺崿FRAID與邏輯卷。 一、利用軟件方式實現RAID     利用sdb sdc sdd sd…

    2017-08-12
欧美性久久久久