rsync+inotify實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)同步更新
原創(chuàng)【51CTO獨(dú)家特稿】rsync可以實(shí)現(xiàn)觸發(fā)式的文件同步,但是通過crontab守護(hù)進(jìn)程方式進(jìn)行觸發(fā),同步的數(shù)據(jù)和實(shí)際數(shù)據(jù)會(huì)有差異,而inotify可以監(jiān)控文件系統(tǒng)的各種變化,當(dāng)文件有任何變動(dòng)時(shí),就觸發(fā)rsync同步,這樣就可以解決同步數(shù)據(jù)的實(shí)時(shí)性問題。
一、rsync的優(yōu)點(diǎn)與不足
rsync具有安全性高、備份迅速、支持增量備份等優(yōu)點(diǎn),通過rsync可以解決對(duì)實(shí)時(shí)性要求不高的數(shù)據(jù)備份需求,例如定期的備份文件服務(wù)器數(shù)據(jù)到遠(yuǎn)端服務(wù)器,對(duì)本地磁盤定期做數(shù)據(jù)鏡像等。
隨著應(yīng)用系統(tǒng)規(guī)模的不斷擴(kuò)大,對(duì)數(shù)據(jù)的安全性和可靠性也提出的更好的要求,rsync在高端業(yè)務(wù)系統(tǒng)中也逐漸暴露出了很多不足,首先,rsync同步數(shù)據(jù)時(shí),需要掃描所有文件后進(jìn)行比對(duì),進(jìn)行差量傳輸。如果文件數(shù)量達(dá)到了百萬甚至千萬量級(jí),掃描所有文件將是非常耗時(shí)的。而且正在發(fā)生變化的往往是其中很少的一部分,這是非常低效的方式。其次,rsync不能實(shí)時(shí)的去監(jiān)測(cè)、同步數(shù)據(jù),雖然它可以通過Linux守護(hù)進(jìn)程的方式進(jìn)行觸發(fā)同步,但是兩次觸發(fā)動(dòng)作一定會(huì)有時(shí)間差,這樣就導(dǎo)致了服務(wù)端和客戶端數(shù)據(jù)可能出現(xiàn)不一致,無法在應(yīng)用故障時(shí)完全的恢復(fù)數(shù)據(jù)?;谝陨显颍瑀sync+inotify可以解決這個(gè)問題。
二、 初識(shí)inotify
Inotify 是一種強(qiáng)大的、細(xì)粒度的、異步的文件系統(tǒng)事件監(jiān)控機(jī)制,linux內(nèi)核從2.6.13起,加入了Inotify支持,通過Inotify可以監(jiān)控文件系統(tǒng)中添加、刪除,修改、移動(dòng)等各種細(xì)微事件,利用這個(gè)內(nèi)核接口,第三方軟件就可以監(jiān)控文件系統(tǒng)下文件的各種變化情況,而inotify-tools就是這樣的一個(gè)第三方軟件。
我們?cè)v到,rsync可以實(shí)現(xiàn)觸發(fā)式的文件同步,但是通過crontab守護(hù)進(jìn)程方式進(jìn)行觸發(fā),同步的數(shù)據(jù)和實(shí)際數(shù)據(jù)會(huì)有差異,而inotify可以監(jiān)控文件系統(tǒng)的各種變化,當(dāng)文件有任何變動(dòng)時(shí),就觸發(fā)rsync同步,這樣剛好解決了同步數(shù)據(jù)的實(shí)時(shí)性問題。
三、 安裝inotify工具inotify-tools
由于inotify特性需要Linux內(nèi)核的支持,在安裝inotify-tools前要先確認(rèn)Linux系統(tǒng)內(nèi)核是否達(dá)到了 2.6.13以上,如果Linux內(nèi)核低于2.6.13版本,就需要重新編譯內(nèi)核加入inotify的支持,也可以用如下方法判斷,內(nèi)核是否支持 inotify(服務(wù)器系統(tǒng)為Centos5.5 x86_64):
uname -r
2.6.18-194.el5
ls -lsart /proc/sys/fs/inotify/
總計(jì) 0
0 dr-xr-xr-x 7 root root 0 06-16 00:02 .. 0 -rw-r--r-- 1 root root 0 06-21 11:15 max_user_watches 0 -rw-r--r-- 1 root root 0 06-21 11:15 max_user_instances 0 -rw-r--r-- 1 root root 0 06-21 11:15 max_queued_events 0 dr-xr-xr-x 2 root root 0 06-21 11:15 .
通過以上顯示我們明白,Centos5.5 x86_64是支持inotify的。
四、inotify的簡(jiǎn)單介紹
Inotify 是文件系統(tǒng)事件監(jiān)控機(jī)制,作為 dnotify 的有效替代。dnotify 是較早內(nèi)核支持的文件監(jiān)控機(jī)制。Inotify 是一種強(qiáng)大的、細(xì)粒度的、異步的機(jī)制,它滿足各種各樣的文件監(jiān)控需要,不僅限于安全和性能。
inotify 可以監(jiān)視的文件系統(tǒng)事件包括:
- IN_ACCESS,即文件被訪問
- IN_MODIFY,文件被 write
- IN_ATTRIB,文件屬性被修改,如 chmod、chown、touch 等
- IN_CLOSE_WRITE,可寫文件被 close
- IN_CLOSE_NOWRITE,不可寫文件被 close
- IN_OPEN,文件被 open
- IN_MOVED_FROM,文件被移走,如 mv
- IN_MOVED_TO,文件被移來,如 mv、cp
- IN_CREATE,創(chuàng)建新文件
- IN_DELETE,文件被刪除,如 rm
- IN_DELETE_SELF,自刪除,即一個(gè)可執(zhí)行文件在執(zhí)行時(shí)刪除自己
- IN_MOVE_SELF,自移動(dòng),即一個(gè)可執(zhí)行文件在執(zhí)行時(shí)移動(dòng)自己
- IN_UNMOUNT,宿主文件系統(tǒng)被 umount
- IN_CLOSE,文件被關(guān)閉,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
- IN_MOVE,文件被移動(dòng),等同于(IN_MOVED_FROM | IN_MOVED_TO)
注:上面所說的文件也包括目錄。#p#
五、rsync+inotify企業(yè)應(yīng)用案例
我們的后端WEB是二臺(tái)部署了Nginx的WEB服務(wù)器,由于沒有共享存儲(chǔ),我們現(xiàn)在要實(shí)現(xiàn)的是對(duì)它們的根目錄/data/htdocs/www實(shí)現(xiàn)即時(shí)同步更新。
WebServer1:192.168.1.5,Centos5.5 x86_64 WebServer2:192.168.1.6,Centos5.5 x86_64
根目錄均為/data/htdocs/www,自動(dòng)同步順序?yàn)閃ebServer2à WebServer1,我們將WebServer1配置成rsync的服務(wù)器端即可
1.我們首先開始安裝inotify-tools
可以到http://inotify-tools.sourceforge.net/下載相應(yīng)的inotify-tools版本,然后開始編譯安裝:
cd /usr/local/src tar zxvf inotify-tools-3.14.tar.gz cd inotify-tools-3.14 ./configure &&make && make install
2.WebServer1端
即192.168.1.5的rsync,我們配置好/etc/rsyncd.conf文件,如下:
[root@server ~0m]# vim /etc/rsyncd.conf uid = nobody gid = nobody user chroot = no max connections = 200 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log file = /var/log/rsyncd.log [www] path=/data/htdocs/ ignore errors read only = no list = no hosts allow = 192.168.1.0/255.255.255.0 auth users = www secrets file = /etc/rsyncd.password
然后重啟xinetd即可,如下所示:
/etc/init.d/xinetd restart
記得二臺(tái)WEB機(jī)器都要配置/etc/rsyncd.passwd文件,rsync的配置過程和原理請(qǐng)大家參考我在51cto.com的rsync配置相關(guān)文章,這里就不詳細(xì)說明了。
3.我們配置好WebServer2的inotify
讓其開機(jī)即啟動(dòng),腳本內(nèi)容如下:
vim /root/rsync.sh #!/bin/bash src=/data/htdocs/www/ des=www ip=192.168.1.5 /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib $src | while read file do rsync -vzrtopg --delete --progress $src www@$ip::$des --password-file=/etc/rsyncd.password && echo "$src was rsynced" done
腳本相關(guān)解釋如下:
- timefmt:指定時(shí)間的輸出格式。
- format:指定變化文件的詳細(xì)信息。
這個(gè)腳本的作用就是通過inotify監(jiān)控文件目錄的變化,進(jìn)而觸發(fā)rsync進(jìn)行同步操作,由于這個(gè)過程是一種主動(dòng)觸發(fā)操作,通過系統(tǒng)內(nèi)核完成的,所以,比起那些遍歷整個(gè)目錄的掃描方式,效率要高很多。
然后我們將此腳本放在/etc/rc.local,即在***一行添加,/etc/rc.local文件改動(dòng)后內(nèi)容如下:
[root@slave www0m]# cat /etc/rc.local #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local /root/rsync.sh
4.驗(yàn)證就很容易了
我們可以在192.168.1.6的機(jī)器的/data/htdocs/www目錄下新建文件,更改文件內(nèi)容,我們很欣慰的發(fā)現(xiàn),192.168.1.5的機(jī)器上馬上也會(huì)發(fā)生相應(yīng)的改變,就像二臺(tái)機(jī)器是網(wǎng)絡(luò)Raid-1樣,非常方便。
總體說來,rsync+inofity比較適用于沒有存儲(chǔ)環(huán)境的小文件的即時(shí)同步更新,如果要更新的文件非常大而且同步的機(jī)器數(shù)量在10臺(tái)以上時(shí),我建議還是以共享存儲(chǔ)的方法來解決,如果沒有資金購(gòu)置昂貴的存儲(chǔ),大家不妨考慮下Heartbeat+DRBD+NFS方案來作為我們的文件服務(wù)器。
參考文檔
http://ixdba.blog.51cto.com/2895551/580280
http://www.ibm.com/developerworks/cn/linux/l-ubuntu-inotify/index.html
作者簡(jiǎn)介:余洪春(博客),網(wǎng)名撫琴煮酒,外企Linux/Unix系統(tǒng)管理員、項(xiàng)目實(shí)施工程師,曾擔(dān)任紅帽RHCE講師,擅長(zhǎng)負(fù)載均衡高可用和中小型證券類和電子商務(wù)網(wǎng)站架構(gòu),目前關(guān)注網(wǎng)站架構(gòu)研究及網(wǎng)絡(luò)安全方向。
【編輯推薦】
- 如何監(jiān)控Linux文件系統(tǒng)事件:inotify使用指南
- CentOS 5.5下rsync使用技巧與權(quán)限問題解讀
- inotify監(jiān)控Linux文件系統(tǒng)的必備利器
- FreeBSD 8上的Rsync同步簡(jiǎn)易教程
- Linux遠(yuǎn)程備份工具Rsync使用案例