通過rsync+inotify實作資料的實時備份
2011-06-03 08:50:08
标簽:Linux 休閑 rsync+inotify 職場 資料實時備份
原創作品,允許轉載,轉載時請務必以超連結形式标明文章 原始出處 、作者資訊和本聲明。否則将追究法律責任。http://ixdba.blog.51cto.com/2895551/580280
在前面的博文中,我講到過利用rsync實作資料的鏡像和備份,但是要實作資料的實時備份,單獨靠rsync還不能實作,本文就講述下如何實作資料的實時備份。
一、rsync的優點與不足
與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支援增量備份等優點,通過rsync可以解決對實時性要求不高的資料備份需求,例如定期的備份檔案伺服器資料到遠端伺服器,對本地磁盤定期做資料鏡像等。
随着應用系統規模的不斷擴大,對資料的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了很多不足,首先,rsync同步資料時,需要掃描所有檔案後進行比對,進行差量傳輸。如果檔案數量達到了百萬甚至千萬量級,掃描所有檔案将是非常耗時的。而且正在發生變化的往往是其中很少的一部分,這是非常低效的方式。其次,rsync不能實時的去監測、同步資料,雖然它可以通過linux守護程序的方式進行觸發同步,但是兩次觸發動作一定會有時間差,這樣就導緻了服務端和用戶端資料可能出現不一緻,無法在應用故障時完全的恢複資料。基于以上原因,rsync+inotify組合出現了!
二、 初識inotify
Inotify 是一種強大的、細粒度的、異步的檔案系統事件監控機制,linux核心從2.6.13起,加入了Inotify支援,通過Inotify可以監控檔案系統中添加、删除,修改、移動等各種細微事件,利用這個核心接口,第三方軟體就可以監控檔案系統下檔案的各種變化情況,而inotify-tools就是這樣的一個第三方軟體。
在上面章節中,我們講到,rsync可以實作觸發式的檔案同步,但是通過crontab守護程序方式進行觸發,同步的資料和實際資料會有差異,而inotify可以監控檔案系統的各種變化,當檔案有任何變動時,就觸發rsync同步,這樣剛好解決了同步資料的實時性問題。
三、 安裝inotify工具inotify-tools
由于inotify特性需要Linux核心的支援,在安裝inotify-tools前要先确認Linux系統核心是否達到了2.6.13以上,如果Linux核心低于2.6.13版本,就需要重新編譯核心加入inotify的支援,也可以用如下方法判斷,核心是否支援inotify:
[root@localhost webdata]# uname -r
2.6.18-164.11.1.el5PAE
[root@localhost webdata]# ll /proc/sys/fs/inotify
總計 0
-rw-r--r-- 1 root root 0 04-13 19:56 max_queued_events
-rw-r--r-- 1 root root 0 04-13 19:56 max_user_instances
-rw-r--r-- 1 root root 0 04-13 19:56 max_user_watches
如果有上面三項輸出,表示系統已經預設支援inotify,接着就可以開始安裝inotify-tools了。
可以到http://inotify-tools.sourceforge.net/下載下傳相應的inotify-tools版本,然後開始編譯安裝:
[root@localhost ~]# tar zxvf inotify-tools-3.14.tar.gz
root@localhost ~]# cd inotify-tools-3.14
[root@localhost inotify-tools-3.14]# ./configure
[root@localhost inotify-tools-3.14]# make
[root@localhost inotify-tools-3.14]# make install
[root@localhost inotify-tools-3.14]# ll /usr/local/bin/inotifywa*
-rwxr-xr-x 1 root root 37264 04-14 13:42 /usr/local/bin/inotifywait
-rwxr-xr-x 1 root root 35438 04-14 13:42 /usr/local/bin/inotifywatch
inotify-tools安裝完成後,會生成inotifywait和inotifywatch兩個指令,其中,inotifywait用于等待檔案或檔案集上的一個特定事件,它可以監控任何檔案和目錄設定,并且可以遞歸地監控整個目錄樹。
inotifywatch用于收集被監控的檔案系統統計資料,包括每個inotify事件發生多少次等資訊。
四、 inotify相關參數
inotify定義了下列的接口參數,可以用來限制inotify消耗kernel memory的大小。由于這些參數都是記憶體參數,是以,可以根據應用需求,實時的調節其大小。下面分别做簡單介紹。
/proc/sys/fs/inotify/max_queued_evnets
表示調用inotify_init時配置設定給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丢棄,但會觸發IN_Q_OVERFLOW事件。
/proc/sys/fs/inotify/max_user_instances
表示每一個real user ID可建立的inotify instatnces的數量上限。
/proc/sys/fs/inotify/max_user_watches
表示每個inotify instatnces可監控的最大目錄數量。如果監控的檔案數目巨大,需要根據情況,适當增加此值的大小,例如:
echo 30000000 > /proc/sys/fs/inotify/max_user_watches
五、 inotifywait相關參數
Inotifywait是一個監控等待事件,可以配合shell腳本使用它,下面介紹一下常用的一些參數:
-m, 即--monitor,表示始終保持事件監聽狀态。
-r, 即--recursive,表示遞歸查詢目錄。
-q, 即--quiet,表示列印出監控事件。
-e, 即--event,通過此參數可以指定要監控的事件,常見的事件有modify、delete、create、attrib等。
更詳細的請參看man inotifywait。
六、 rsync+inotify企業應用案例
案例描述
這是一個CMS内容釋出系統,後端采用負載均衡叢集部署方案,有一個負載排程節點和三個服務節點以及一個内容釋出節點構成,内容釋出節點負責将使用者釋出的資料生成靜态頁面,同時将靜态網頁傳輸到三台服務節點,而負載排程節點負責将使用者請求根據負載算法排程到相應的服務節點,實作使用者通路。使用者要求在前端通路到的網頁資料始終是最新的、一緻的。
解決方案
為了保證使用者通路到的資料一緻性和實時性,必須保證三個服務節點與内容釋出節點的資料始終是一緻的,這就需要通過檔案同步工具來實作,這裡采用rsync,同時又要保證資料是實時的,這就需要inotify,即:使用inotify監視内容釋出節點檔案的變化,如果檔案有變動,那麼就啟動rsync,将檔案實時同步到三個服務節點。
系統環境
這裡所有伺服器均采用Linux作業系統,系統核心版本與節點資訊如表1 所示:
表1

1 安裝rsync與inotify-tools
inotify-tools是用來監控檔案系統變化的工具,是以必須安裝在内容釋出節點,服務節點無需安裝inotify-tools,另外需要在web1、web2、web3、webserver節點上安裝rsync,由于安裝非常簡單,這裡不在講述。
在這個案例中,内容釋出節點(即server)充當了rsync用戶端的角色,而三個服務節點充當了rsync伺服器端的角色,整個資料同步的過程,其實就是一個從用戶端向服務端推送資料的過程。這點與上面我們講述的案例剛好相反。
2 在三個服務節點配置rsync
這裡給出三個服務節點的rsync配置檔案,以供參考,讀者可根據實際情況自行修改。
Web1節點rsyncd.conf配置如下:
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[web1]
path = /web1/wwwroot/
comment = web1 file
ignore errors
read only = no
write only = no
hosts allow = 192.168.12.134
hosts deny = *
list = false
uid = root
gid = root
auth users = web1user
secrets file = /etc/web1.pass
Web2節點rsyncd.conf配置如下:
[web2]
path = /web2/wwwroot/
comment = web2 file
auth users = web2user
secrets file = /etc/web2.pass
Web3節點rsyncd.conf配置如下:
[web3]
path = /web3/wwwroot/
comment = web3 file
auth users = web3user
secrets file = /etc/web3.pass
在三台服務節點rsyncd.conf檔案配置完成後,依次啟動rsync守護程序,接着将rsync服務加入到自啟動檔案中:
echo “/usr/local/bin/rsync --daemon” >>/etc/rc.local
到此為止,三個web服務節點已經配置完成。
3 配置内容釋出節點
配置内容釋出節點的主要工作是将生成的靜态網頁實時的同步到叢集中三個服務節點,這個過程可以通過一個shell腳本來完成,腳本内容大緻如下:
#!/bin/bash
host1=192.168.12.131
host2=192.168.12.132
host3=192.168.12.133
src=/web/wwwroot/
dst1=web1
dst2=web2
dst3=web3
user1=web1user
user2=web3user
user3=web3user
/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
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@$host1::$dst1
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user2@$host2::$dst2
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user3@$host3::$dst3
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
腳本相關解釋如下:
--timefmt:指定時間的輸出格式。
--format:指定變化檔案的詳細資訊。
這兩個參數一般配合使用,通過指定輸出格式,輸出類似與:
15/04/10 00:29 /web/wwwroot/ixdba.shDELETE,ISDIR was rsynced
15/04/10 00:30 /web/wwwroot/index.htmlMODIFY was rsynced
15/04/10 00:31 /web/wwwroot/pcre-8.02.tar.gzCREATE was rsynced
這個腳本的作用就是通過inotify監控檔案目錄的變化,進而觸發rsync進行同步操作,由于這個過程是一種主動觸發操作,通過系統核心完成的,是以,比起那些周遊整個目錄的掃描方式,效率要高很多。
有時會遇到這樣的情況:向inotify監控的目錄(這裡是/web/wwwroot/)寫入一個很大檔案時,由于寫入這個大檔案需要一段時間,此時inotify就會持續不停的輸出該檔案被更新的資訊, 這樣就會持續不停的觸發rsync去執行同步操作,占用了大量系統資源,那麼針對這種情況,最理想的做法是等待檔案寫完後再去觸發rsync同步。 在這種情況下,可以修改inotify的監控事件,即:“-e close_write,delete,create,attrib”。
接着,将這個腳本命名為inotifyrsync.sh,放到/web/wwwroot目錄下,然後給定可執行權限,放到背景運作:
chmod 755 /web/wwwroot/inotifyrsync.sh
/web/wwwroot/inotifyrsync.sh &
最後,将此腳本加入系統自啟動檔案:
echo “/web/wwwroot/inotifyrsync.sh &”>>/etc/rc.local
這樣就完成了内容釋出節點的所有配置工作。
4 測試rsync+inotify實時同步功能
所有配置完成後,可以在網頁釋出節點的/web/wwwroot目錄下添加、删除或者修改某個檔案,然後到三個服務節點對應的目錄檢視檔案是否跟随網頁釋出節點的/web/wwwroot目錄下檔案發生變化,如果你看到三個服務節點對應的目錄檔案跟着内容釋出節點目錄檔案同步變化,那麼我們這個業務系統就配置成功了。
本文出自 “技術成就夢想” 部落格,請務必保留此出處http://ixdba.blog.51cto.com/2895551/580280