經過rsync+inotify實現數據的實時備份

 經過rsync+inotify實現數據的實時備份

在上一篇中介紹了rsync的應用和一些rsync的優勢、缺點等,並在最後提到了inotify這個工具,下面就來講一下inotify這個工具。
先來講一下rsync的不足之處吧。web

一、rsync同步數據時,須要掃描全部文件後進行比對,而後進行差量傳輸。若是文件數量達到百萬甚至千萬量級,掃描全部文件將是很是耗費時間的,並且發生變化的每每是其中的不多一部分,所以在這種狀況下rsync的工做效率是很是低的,shell

二、rsync不能實時監測、同步數據,雖然它能夠經過Linux守護進程的方式觸發同步,可是在兩次觸發動做必定會有時間差,可能就致使服務器端與客戶端數據出現不一致,沒法在出現應用故障時徹底恢復數據。vim

基於以上緣由,rsync+inotify組合出現了。bash

關於inotify服務器

    inotify是一種強大的、細粒度的、異步的文件系統事件監控機制,Linux內核從2.6.13版本就開始加入對inotify的支持。異步

    經過inotify能夠監控文件系統中添加、刪除、修改、移動等各類細微事件,利用這個內核接口,第三方軟件能夠監控文件系統下文件的各類變化狀況,inotify-tools就是這樣的一個第三方軟件。ide

    正因爲inotify這些特性可以彌補rsync的不足。二者的工做方式是:用inotify能夠監控文件系統和各類變化,當文件有任何變更時,會觸發rsync同步。工具

安裝inotify工具inotify-tools性能

    因爲inotify的特性須要Linux內核的支持,在安裝以前要確認Linux系統內核是否在2.6.13版本之上,若是低於這個版本,就要從新編譯內核加入對inotify的支持。能夠用如下方式來判斷是否支持inotify測試

  
  
  
  
  1. [root@localhost ~]# uname -r 
  2. 2.6.18-164.el5 
  3. [root@localhost ~]# ll /proc/sys/fs/inotify/ 
  4. total 0 
  5. -rw-r--r-- 1 root root 0 Jun 21 18:11 max_queued_events 
  6. -rw-r--r-- 1 root root 0 Jun 21 18:11 max_user_instances 
  7. -rw-r--r-- 1 root root 0 Jun 21 18:11 max_user_watches 

    若是有上面3行的輸出說明系統默認支持inotify,能夠安裝inotify-tools了。能夠到http://inotify-tools.sourceforge.net/下載相應版本的inotify-tools

  
  
  
  
  1. [root@localhost ~]# tar zxvf inotify-tools-3.14.tar.gz  
  2. [root@localhost inotify-tools-3.14]# cd inotify-tools-3.14 
  3. [root@localhost inotify-tools-3.14]# ./configure  
  4. [root@localhost inotify-tools-3.14]# make 
  5. [root@localhost inotify-tools-3.14]# make install 
  6. [root@localhost inotify-tools-3.14]# ll /usr/local/bin/inotifywa* 
  7. -rwxr-xr-x 1 root root 37260 Jun 21 18:20 /usr/local/bin/inotifywait 
  8. -rwxr-xr-x 1 root root 35434 Jun 21 18:20 /usr/local/bin/inotifywatch 
  9. 安裝完成後,會生成inotifywait和inotifywatch兩個指令。 

  inotifywait用於等待文件或文件集上的一個待定事件,能夠監控任何文件和目錄設置,而且能夠遞歸地監控整個目錄樹;

inotifywatch 用於收集被監控的文件系統計數據,包括每一個inotify事件發生多少次等信息

    從上面可知inotifywait是一個監控事件,能夠配合shell腳本使用它。與它相關的參數:

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

-r 即「--recursive」,表示遞歸查詢目錄

-q 即「--quiet」,表示打印出監控事件

-e 即 「--event」,經過此參數能夠指定要監控的事件,常見的事件有modify、delete、create、和attrib等

要想更多的瞭解能夠用man inotifywait

下面針對rsync和inotify來作個小設計:

有兩個臺服務器也就是兩個節點 A 、B

還有一個服務器C是來將靜態的頁面同步到A、B兩個服務器上的。

這三臺服務器的相關信息:

       內核版本     用途 ip地址             網頁數據路徑

A 2.6.18-164.el5  服務節點1 192.168.35.4       /web1/wwwroot

B 2.6.18-164.el5  服務節點2     192.168.35.5       /web2/wwwroot

C 2.6.18-164.el5  內容發佈節點  192.168.35.6       /web/wwwroot

 

一、安裝rsync與inotify-tools

     inotify-tools是用來監控文件系統變化的工具,所以必須安裝在內容發佈節點上,服務節點不用安裝。

    還有就是這三臺服務器都要安裝上rsync這個工具。安裝方式在上篇博客中提到在這裏就再也不說了。

安裝完成後,下面來講一下各服務器節點的配置

對於兩臺服務器節點上的配置以下:

A 節點的rsyncd.conf配置以下:

  
  
  
  
  1. uid = nobody 
  2. gid = nobody 
  3. use chroot = no 
  4. max connections = 10 
  5. strict modes = yes 
  6. pid file = /var/run/rsyncd.pid 
  7. lock file = /var/run/rsync.lock 
  8. log file = /var/log/rsyncd.log 
  9.  
  10. [web1] 
  11. path = /web1/wwwroot/ 
  12. comment = web1 file 
  13. ignore errors 
  14. read only = no 
  15. write only = no 
  16. hosts allow = 192.168.35.6 
  17. hosts deny = * 
  18. list = false 
  19. uid = root 
  20. gid = root 
  21. auth users = web1user 
  22. secrets file = /etc/web1.pass 

 

B 節點的rsyncd.conf配置以下:

  
  
  
  
  1. uid = nobody 
  2. gid = nobody 
  3. use chroot = no 
  4. max connections = 10 
  5. strict modes = yes 
  6. pid file = /var/run/rsyncd.pid 
  7. lock file = /var/run/rsync.lock 
  8. log file = /var/log/rsyncd.log 
  9.  
  10. [web2] 
  11. path = /web2/wwwroot/ 
  12. comment = web2 file 
  13. ignore errors 
  14. read only = no 
  15. write only = no 
  16. hosts allow = 192.168.35.6 
  17. hosts deny = * 
  18. list = false 
  19. uid = root 
  20. gid = root 
  21. auth users = web2user 
  22. secrets file = /etc/web2.pass 

 

這兩個配置文件完成了,下面還要在這兩臺服務器上分別建立web1.pass和web2.pass這兩個文件

所要添加的內容是:

# vim /etc/web1.pass

web1user:zhou

# vim /etc/web2.pass

web2user:zhou

在配置完成後,就能夠啓動rsync守護進程了。

/usr/local/bin/rsync --daemon

 

 

下面在內容發佈節點上來作一下配置,主要工做是將變化的內容實時同步到2個服務節點上,來建立一個腳原本實現這個功能。

腳本內容以下:

  
  
  
  
  1. #!/bin/bash 
  2. host1=192.168.35.4 
  3. host2=192.168.35.5 
  4.  
  5. src=/web/wwwroot/ 
  6. dst1=web1 
  7. dst2=web2 
  8. user1=web1user 
  9. user2=web2user 
  10.  
  11. /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modfiy,delete,create,attrib $src | while read files 
  12.   do 
  13.     /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@$host1::$dst1 
  14.     /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user2@$host2::$dst2 
  15.     echo "${files} was rsynced" >> /tmp/rsync.log 2>&1 
  16.   done 

 

在這個腳本完成後還建立一個文件在

# vim /etc/server.pass

內容就是上面兩個服務器中的用戶的密碼。zhou

# more /etc/server.pass

zhou

 

腳本的一些參數以下:

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

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

這個參數要配合使用,經過指定輸出格式輸出相似如下的內容

15/06/10 12:00 /web/wwwroot/ixdba.shDELETE,ISDIR was rsynced

 

這個腳本的做用就是經過inotify監控文件目錄的變化,進而觸發rsync進行同步操做。因爲這個過程是一個主動觸發操做的過程,是經過系統內核完成的,因此比那些遍歷整個目錄的掃描方式效率要高不少。

有時會出現這樣的狀況,當在監控的目錄中寫入一個很大的文件,也就寫入的文件須要一段時間,inotify會持續不停地輸出該文件被更新的信息,這樣就會持續不斷地觸發rsync執行同步操做,佔用大量系統資源。出現這種狀況,最理想的作法就是等待文件寫完後再觸發rsync同步。在這種狀況下,能夠修改inotify的監控事件,即,「-e close_write,delete,create,attrib」。

給上面的腳本添加執行權限,放到後臺運行就能夠了。

下面就可在發佈節點上的/web/wwwroot/目錄下添加,刪除或者修改某個文件來測試一下,是否能正常工做。若是看到有變化說明這個實時同步的功能就配置成功了。

若是有什麼不對的地方,還請指出來,謝謝你們!

相關文章
相關標籤/搜索