天天看點

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工具了      

四、企業應用案例

rsync + inotify 用來實作資料實時同步

為了保證使用者通路到的資料的一緻性和實時性,必須保證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的伺服器端目錄下的檔案:      
rsync + inotify 用來實作資料實時同步
什麼都沒有!!      
2、我們來給rsync + inotify 用戶端的 /web/www2/檔案中放入一些檔案,再檢視rsync的服務端有沒有同步過去      
rsync + inotify 用來實作資料實時同步
我們把 /etc/fstab 放到 /web/www2/共享目錄中來      
剛才運作在背景的  inotifysync.sh 已經記錄下東西了,我們來看看      
rsync + inotify 用來實作資料實時同步
因為之前測試過一次了,是以這裡傳了兩次的記錄      
3、再看看我們的  rsync 服務端檔案有沒有傳過去      
rsync + inotify 用來實作資料實時同步
看到了吧,已經過來了,表示成功了      
總結教訓:      
1、在rsync + inotify 用戶端中不要忘記建立密碼檔案      
密碼檔案的名字和在rsync服務端建立的密碼檔案的名字相同