rsync可以實現觸發式的文件同步,但是通過crontab守護進程方式進行觸發,同步的數據和實際數據會有差異,而inotify可以監控文件系統的各種變化,當文件有任何變動時,就觸發rsync同步,這樣就可以解決同步數據的實時性問題。
一、rsync的優點與不足
rsync具有安全性高、備份迅速、支持增量備份等優點,通過rsync可以解決對實時性要求不高的數據備份需求,例如定期的備份文件服務器數據到遠端服務器,對本地磁盤定期做數據鏡像等。
隨著應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了很多不足,首先,rsync同步數據時,需要掃描所有文件后進行比對,進行差量傳輸。如果文件數量達到了百萬甚至千萬量級,掃描所有文件將是非常耗時的。而且正在發生變化的往往是其中很少的一部分,這是非常低效的方式。其次,rsync不能實時的去監測、同步數據,雖然它可以通過Linux守護進程的方式進行觸發同步,但是兩次觸發動作一定會有時間差,這樣就導致了服務端和客戶端數據可能出現不一致,無法在應用故障時完全的恢復數據?;谝陨显颍瑀sync+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(服務器系統為Centos6.5 x86_64):
uname -r
2.6.18-194.el6
ls -lsart /proc/sys/fs/inotify/
總計 0
max_user_watches
max_user_instances
max_queued_events
通過以上顯示我們明白,Centos6.5 x86_64是支持inotify的。
四、inotify的簡單介紹
Inotify 是文件系統事件監控機制,作為 dnotify 的有效替代。dnotify 是較早內核支持的文件監控機制。Inotify 是一種強大的、細粒度的、異步的機制,它滿足各種各樣的文件監控需要,不僅限于安全和性能。
inotify 可以監視的文件系統事件包括:
- 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,創建新文件
- IN_DELETE,文件被刪除,如 rm
- IN_DELETE_SELF,自刪除,即一個可執行文件在執行時刪除自己
- IN_MOVE_SELF,自移動,即一個可執行文件在執行時移動自己
- IN_UNMOUNT,宿主文件系統被 umount
- IN_CLOSE,文件被關閉,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
- IN_MOVE,文件被移動,等同于(IN_MOVED_FROM | IN_MOVED_TO)
注:上面所說的文件也包括目錄。
五、rsync+inotify企業應用案例
我們的后端WEB是二臺部署了Nginx的WEB服務器,由于沒有共享存儲,我們現在要實現的是對它們的根目錄/data/htdocs/www實現即時同步更新。
WebServer1:192.168.10.5,Centos6.5 x86_64
WebServer2:192.168.10.6,Centos6.5 x86_64
根目錄均為/data/htdocs/www,自動同步順序為WebServer2à WebServer1,我們將WebServer1配置成rsync的服務器端即可
1.我們首先開始安裝inotify-tools
可以到http://inotify-tools.sourceforge.net/下載相應的inotify-tools版本,然后開始編譯安裝:
# cd /usr/local/src
# tar zxvf inotify-tools-3.14.tar.gz
# ln -sv inotify-tools-3.14 inotify-tools
# cd inotify-tools
# ./configure
# make && make install
或直接 yum install inotify-tools
2.WebServer1端
即192.168.10.35的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
記得二臺WEB機器都要配置/etc/rsyncd.passwd文件,rsync的配置過程和原理請大家參考http://blog.csdn.net/moqiang02/article/details/37937795這里就不詳細說明了。
3.我們配置好WebServer2的inotify
讓其開機即啟動,腳本內容如下:
vim /root/rsync.sh
#!/bin/bash
src=/data/htdocs/www/
des=www
ip=192.168.10.35
/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
腳本相關解釋如下:
- timefmt:指定時間的輸出格式。
- format:指定變化文件的詳細信息。
這個腳本的作用就是通過inotify監控文件目錄的變化,進而觸發rsync進行同步操作,由于這個過程是一種主動觸發操作,通過系統內核完成的,所以,比起那些遍歷整個目錄的掃描方式,效率要高很多。
然后我們將此腳本放在/etc/rc.local,即在最后一行添加,/etc/rc.local文件改動后內容如下:
[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 &
修改rc.local后重啟生效,注意最后的“&”不能少,如果不加“&”的話,系統無法重啟。
如果文件無法同步的話,也可能是rsync.sh腳本寫錯了,那么可以在命令行界面直接執行:/root/rsync.sh,看是否有語法錯誤。
4.驗證就很容易了
我們可以在192.168.10.36的機器的/data/htdocs/www目錄下新建文件,更改文件內容,我們很欣慰的發現,192.168.1.5的機器上馬上也會發生相應的改變,就像二臺機器是網絡Raid-1樣,非常方便。
總體說來,rsync+inofity比較適用于沒有存儲環境的小文件的即時同步更新,如果要更新的文件非常大而且同步的機器數量在10臺以上時,我建議還是以共享存儲的方法來解決,如果沒有資金購置昂貴的存儲,大家不妨考慮下Heartbeat+DRBD+NFS方案來作為我們的文件服務器。
原創文章,作者:nene,如若轉載,請注明出處:http://www.www58058.com/90865