rsync+inotify實現數據的實時同步更新

rsync能夠實現觸發式的文件同步,可是經過crontab守護進程方式進行觸發,同步的數據和實際數據會有差別,而inotify能夠監控文件系統的各類變化,當文件有任何變更時,就觸發rsync同步,這樣就能夠解決同步數據的實時性問題。linux

 1、rsync的優勢與不足vim

rsync具備安全性高、備份迅速、支持增量備份等優勢,經過rsync能夠解決對實時性要求不高的數據備份需求,例如按期的備份文件服務器數據到遠端服務器,對本地磁盤按期作數據鏡像等。後端

隨着應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了不少不足,首先,rsync同步數據時,須要掃描全部文件後進行比對,進行差量傳輸。若是文件數量達到了百萬甚至千萬量級,掃描全部文件將是很是耗時的。並且正在發生變化的每每是其中不多的一部分,這是很是低效的方式。其次,rsync不能實時的去監測、同步數據,雖然它能夠經過Linux守護進程的方式進行觸發同步,可是兩次觸發動做必定會有時間差,這樣就致使了服務端和客戶端數據可能出現不一致,沒法在應用故障時徹底的恢復數據。基於以上緣由,rsync+inotify能夠解決這個問題。安全

2、 初識inotifybash

Inotify 是一種強大的、細粒度的、異步的文件系統事件監控機制,linux內核從2.6.13起,加入了Inotify支持,經過Inotify能夠監控文件系統中添加、刪除,修改、移動等各類細微事件,利用這個內核接口,第三方軟件就能夠監控文件系統下文件的各類變化狀況,而inotify-tools就是這樣的一個第三方軟件。服務器

咱們曾講到,rsync能夠實現觸發式的文件同步,可是經過crontab守護進程方式進行觸發,同步的數據和實際數據會有差別,而inotify能夠監控文件系統的各類變化,當文件有任何變更時,就觸發rsync同步,這樣恰好解決了同步數據的實時性問題。網絡

3、 安裝inotify工具inotify-tools異步

因爲inotify特性須要Linux內核的支持,在安裝inotify-tools前要先確認Linux系統內核是否達到了 2.6.13以上,若是Linux內核低於2.6.13版本,就須要從新編譯內核加入inotify的支持,也能夠用以下方法判斷,內核是否支持 inotify(服務器系統爲Centos5.5 x86_64):ide

uname -r

2.6.18-194.el5工具

ls -lsart /proc/sys/fs/inotify/

總計 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的。

4、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)

注:上面所說的文件也包括目錄。

5、rsync+inotify企業應用案例

咱們的後端WEB是二臺部署了Nginx的WEB服務器,因爲沒有共享存儲,咱們如今要實現的是對它們的根目錄/data/htdocs/www實現即時同步更新。

WebServer1:192.168.1.5,Centos5.5 x86_64
WebServer2:192.168.1.6,Centos5.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
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

記得二臺WEB機器都要配置/etc/rsyncd.passwd文件,rsync的配置過程和原理請你們參考我在51cto.com的rsync配置相關文章,這裏就不詳細說明了。

3.咱們配置好WebServer2的inotify

讓其開機即啓動,腳本內容以下:

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

腳本相關解釋以下:

  • 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.1.6的機器的/data/htdocs/www目錄下新建文件,更改文件內容,咱們很欣慰的發現,192.168.1.5的機器上立刻也會發生相應的改變,就像二臺機器是網絡Raid-1樣,很是方便。

整體說來,rsync+inofity比較適用於沒有存儲環境的小文件的即時同步更新,若是要更新的文件很是大並且同步的機器數量在10臺以上時,我建議仍是以共享存儲的方法來解決,若是沒有資金購置昂貴的存儲,你們不妨考慮下Heartbeat+DRBD+NFS方案來做爲咱們的文件服務器。

相關文章
相關標籤/搜索