rsync + inotify 用來實現數據實時同步

一、簡介

1、rsync

  • 比其cp、tar備份的方法,rsync的優點是,安全性高、備份迅速、支持增量備份。只能做對實時性要求不高的數據備份,例如:備份文件服務到遠端從服務器、在本地磁盤上做數據鏡像等  

  • 增量備份:就是rsync同步數據時,需要掃描所有文件後進行比對,進行差量傳輸。但是對於大量文件達到千萬量級別時,掃描所有文件是非常耗時的。 如果發生改變的只是其中的一小部分的話,這是非常低效的方式。  

  • rsync 不能實時的去監測,同步數據,雖然它可以通過 linux 守護進程的方式進行觸發同步,兩次觸發動作一定會有時間差,這樣就導致了服務端和客戶端數據可能出現不一致,無法在應用故障時完全的恢復數據。  

  • rsync 是通過 crontab 守護進程進行觸發,同步數據會有差異

2、inotify

  • 異步的文件系統事件監控機制  

  • Inotify 可以監控文件系統中添加、刪除,修改、移動等各種細微事件,利用這個內核接口,第三方軟件就可以監控文件系統下文件的各種變化情況,而 inotify-tools 就是這樣的一個第三方軟件  

  • inotify 可以監控文件系統的各種變化,當文件有任何變動時,就觸發rsync 同步,這樣剛好解決了同步數據的實時性問題。


同步次序:

  • rsync 不是實時同步數據的話,  rsync服務器 同步數據到 客戶端

  • rsync + inotify 實現實時同步數據的話, rsync客戶端主動同步給rsync服務端數據,就是客戶端向服務器端發送數據的過程

二、rsync是使用

rsync命令的工作模式有四種:
  1、shell模式,也稱爲本地模式,速度要比cp快
  2、遠程shell模式,其可以藉助於ssh協議承載其數據傳輸過程
  3、列表模式,其工作方式與ls相似,僅列出源的內容:-nv
  4、服務器模式,此時,rsync可以工作爲守護進程,能夠接收客戶端的數據傳輸請求,在使用時可以在客戶端使用rsync命令發送給守護進程,也可以向服務器主獲取文件。  

rsync命令的選項:
  -n:如果擔心命令執行不正確,一同步複製,可能這個複製的後果是致命的,那後果可就嚴重了,這裏我們可以加-n先測試一下
  -v: --verbose,詳細輸出模式、顯示詳細過程的
  -q: --quiet,靜默模式,儘可能輸出少的信息
  -c: --checksum,可以對傳輸的文件進行較驗的,強制對文件傳輸進行校驗
  -r: --recursive,遞歸複製
  -a: --archives,歸檔,複製時可以保存原有的屬主屬主等屬性信息,甚至包括一點額外的屬性、如訪問控制列表
  -p: --perms,保存文件的權限
  -t: --times,保留文件的時間戳
  -l: --links,保留文件的符號鏈接
  -g: --group,保留文件的屬組
  -o: --owner,保留文件的屬主
  -D: --devices,保留設備文件  

  -e SSH:遠程複製時,表示使用ssh協議作承載
  -z:基於網絡時使用,對文件壓縮後傳輸
  --progress:顯示壓縮進度條的
  --stats:顯示如何執行壓縮和傳輸的,也就是顯示傳輸狀態的  

注意:rsync命令使用中,如果源參數的末尾有斜線,就會複製指定目錄內容,而不復制目錄本身;沒有斜線,則會複製目錄本身,因此有如下命令:
  # rsync -r /mydata/data /backups/:會把目錄data直接同步至/backups目錄中去
  # rsync -r /mydata/data/ /backups/:會把目錄中的data/中的內容同步至/backups目錄中  

rsync本地用法:
  # cd /etc /tmp/
  # rsync /tmp/etc/passwd /tmp/test/passwd -nv
推送到遠程主機上去,把本地的etc文件推送到172.16.39.1主機上去:
  # rsync -r -e ssh /tmp/etc [email protected]:/tmp/

拉取遠程服務器上的文件:
  # rsync -e ssh -r -a [email protected]:/etc/pam.d ./ --stats  

把文件推送到服務器端上去:
# rsync -auzv messages [email protected]::my_data_rsync

如果我們從服務器上拉取文件時必須要指定文件路徑
# rsync [email protected]::my_data_rsync/messages /tmp/








三、 檢測內核是否支持inotify8

因爲內核版本在2.6.13版本以上才支持,所以要確保內核版本可以使用,使用命令 uname –r

[root@node1 ~]# uname -r
2.6.32-431.el6.x86_64
我的版本爲 2.6.32  高於 2.6.13所以可以使用
  • 也可以通過如下方法判斷內核是否支持inotify
[root@node1 ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Apr 28 12:18 max_queued_events
-rw-r--r-- 1 root root 0 Apr 28 12:18 max_user_instances
-rw-r--r-- 1 root root 0 Apr 28 12:18 max_user_watches

max_queued_evnets:表示調用inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丟棄,但會觸發IN_Q_OVERFLOW事件。
  max_user_instances:表示每一個real user ID可創建的inotify instatnces的數量上限。
  max_user_watches:表示每個inotify instatnces可監控的最大目錄數量。如果監控的文件數目巨大,需要根據情況,適當增加此值的大小,例如:echo "9000000" > /proc/sys/fs/inotify/max_user_watches

如果有上面3項輸出,就表示系統默認支持inotify,可以開始安裝inotify-tools工具了


四、企業應用案例

p_w_picpath

爲了保證用戶訪問到的數據的一致性和實時性,必須保證3個節點上的數據和內容同發佈節點上的數據始終是一致的。需要保證文件同步,那就需要rsync 、保證數據是實時的,那就需要inotify來監視內容發佈節點文化的變化,如果內容有改動過,那麼就啓動rsync,將文件實時同步到3個節點上去。

剖析實現過程: sync+inotify 是客戶端主動讓服務端同步數據
  • 內容發佈節點(sync+inotify)充當rsync客戶端的角色
  • 服務節點(sync)充當 rsync服務端的角色
  • 數據同步過程: 客戶端(sync+inotify)向服務端(rsync)同步數據的過程
  • 說白了,就是 內容發佈節點主動將自己的內容同步到各服務節點上去的過程。
  • inotify監控着 內容發佈節點的一舉一動,只要有改變,就主動同步到3個服務節點上去,所以inotify要安裝在內容發佈節點上。
五、配置過程
  1. 給服務節點上配置rsync
各服務節點以服務端方式運行
以deamon守護方式運行
  1. 又因爲是基於xinetd超級守護進程工作的,所以我們先要安裝 xinetd    [root@node2 ~]# yum -y install xinetd
  2. 爲rsync提供配置文件 /etc/rsyncd.conf,這個配置文件分爲兩段,一段是全局設定,一段是可以定義多個rsync共享目錄
    uid = nobody :以哪個用戶的身份運行或獲取數據的
    gid = nobody :用戶都以來賓帳號的方式運行
    use chroot = no :在服務運行時要不要把他鎖定在家目錄
    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/www2/ : 定義目錄的路徑
     ignore errors = yes : 表示如果中間複製過程有一個文件出錯了是要繼續複製還是中止複製,yes表示繼續複製,no表示中止複製
     read only = no :如果打算讓別人僅僅是來拉取數據的,yes就可以了,如果打算讓別人推送過來做備份的那就爲no,表示客戶端是否可以推送的
     write noly = no :只允別人在裏面寫數據,但不可以拉取數據
     hosts allow = 192.168.1.112:做白名單的,是否允許哪些主機可以訪問的
     hosts deny = * :黑名單的
        說明:
        1、二者都不出現時,默認爲允許訪問
        2、只出現hosts allow,定義白名單,但沒有被匹配到的主機由默認規則處理,即爲允許
        3、只出現hosts deny,定義黑名單,出現在名單中的都被拒絕
        4、二者同時出現,先檢查hosts allow,如果匹配就allow,否則檢查hosts deny,如果匹配則拒絕,如是二者都不匹配,則由默認規則處理,即爲允許
    list = false :是否允許用戶列出文件列表的
    uid = root :以哪個用戶身份去獲取文件的
    gid = root
    auth users = admin:做用戶驗證的,只允許哪個用戶來複制
    secrets file = /etc/.rsync.passwd :存放驗證用戶的密碼的

3、配置密碼文件 /etc/.rsyncd.passwd 存放驗證用戶的密碼的,權限給600

1、[root@node2 ~]# vim /etc/rsync.passwd

    admin:admin

2、[root@node2 ~]# chmod 600 /etc/rsync.passwd

        4、配置服務能夠啓動,監聽在tcp / 873端口上

1、[root@node2 ~]# chkconfig rsync on
2、[root@node2 ~]# service xinetd start
   Starting xinetd:                                           [  OK  ]
3、[root@node2 ~]# ss -tnl
   State       Recv-Q Send-Q      Local Address:Port        Peer Address:Port 
   
   LISTEN      0      128                     *:50655                  *:*     
   LISTEN      0      64                     :::873                   :::*     
-----------------------服務端配置完畢-------------------------
2、配置客戶端(rsync + inotify)
安裝 inotify-tools 程序包
1、[root@node1 ~]# rpm -ivh inotify-tools-3.14-1.el6.x86_64.rpm 
    warning: inotify-tools-3.14-1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
     Preparing...                ########################################### [100%]
     1:inotify-tools          ########################################### [100%

2、可以看到生成了兩個二進制文件

    [root@node1 ~]# rpm -ql inotify-tools
    /usr/bin/inotifywait
    /usr/bin/inotifywatch


3、創建一個目錄存放要同步的數據:


    [root@node1 ~]# mkdir -pv /web/www2
    mkdir: created directory `/web'    mkdir: created directory `/web/www2'

4、進入到改同步數據的目錄中,創建一個腳本 inotifyrsync.sh

  查看我們在客戶端上安裝的rsync生成的二進制文件,一會在腳本要執行,我們需要知道路徑

    [root@node2 ~]# rpm -ql rsync
     /etc/xinetd.d/rsync
     /usr/bin/rsync   這個爲我們要在腳本中使用的二進制文件
   1、[root@node1 ~]# cd /web/www2
   2、[root@node1 www2]# vim inotifysync.sh
 
     #!/bin/bash
     host=192.168.1.111         #從服務器的主機地址
     data_dir=/web/www2/       #內容發佈服務器上創建的同步數的路徑 dst=web                     #要同步數據到服務端的(服務端配置文件中定義的共享模塊的名稱)                     
     username=admin               #從服務器上/etc/rsyncd.passwd這個文件中定義的用戶名            
     /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $data_dir | while read filesdo/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.passwd $data_dir $username@$host::$dstecho "${files} was rsynced" >> /tmp/rsync.log 2>&
            done
             inotifywait 程序的使用:

                   #決對路徑執行inotifywait這個程序,

                   #-m, 即--monitor,表示始終保持事件監聽狀態。

                   #-r, 即--recursive,表示遞歸查詢目錄。

                   #-q, 即--quiet,表示打印出監控事件。

                   #-e, 即--event,通過此參數可以指定要監控的事件,常見的事件有modify、delete、create、attrib等。

                   #--timefmt:指定時間的輸出格式。

                   #--format:指定變化文件的詳細信息。

3、創建一個密碼文件,和rsync服務端的在相同的路徑
    裏面你寫如密碼,不寫賬戶名稱
    1、[root@node1 www2]# vim /etc/rsyncd.passwd

        admin
        改權限爲 600
    2、[root@node1 www2]# chmod 600 /etc/rsyncd.passwd
4、賦值執行權限和以後臺模式運行
    1、[root@node1 www2]# chmod 755 /web/www2/inotifysync.sh 
    2、[root@node1 ~]# bash /web/www2/inotifysync.sh &
       








測試:

1、來看看rsync的服務器端目錄下的文件:
p_w_picpath
什麼都沒有!!
2、我們來給rsync + inotify 客戶端的 /web/www2/文件中放入一些文件,再查看rsync的服務端有沒有同步過去
p_w_picpath
我們把 /etc/fstab 放到 /web/www2/共享目錄中來
剛纔運行在後臺的  inotifysync.sh 已經記錄下東西了,我們來看看
p_w_picpath
因爲之前測試過一次了,所以這裏傳了兩次的記錄
3、再看看我們的  rsync 服務端文件有沒有傳過去
p_w_picpath
看到了吧,已經過來了,表示成功了
總結教訓:
1、在rsync + inotify 客戶端中不要忘記創建密碼文件
   密碼文件的名字和在rsync服務端創建的密碼文件的名字相同


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章