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

?

rsync可以實現觸發式的文件同步,但是通過crontab守護進程方式進行觸發,同步的數據和實際數據會有差異,而inotify可以監控文件系統的各種變化,當文件有任何變動時,就觸發rsync同步,這樣就可以解決同步數據的實時性問題。

一、rsync的優點與不足

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(服務器系統為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

(0)
nenenene
上一篇 2018-01-05 15:35
下一篇 2018-01-06 07:48

相關推薦

  • blog test

    just test

    Linux干貨 2017-02-28
  • N25-第十周博客作業

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) 內核空間的啟動流程 一. POST 加電自檢 在加電之后,智能設備所運行的內部存儲的一系列檢測程序集合??s寫為POST。這些檢測程序在軟件加載到硬件上運行之前對硬件的基本完整性加以驗證。 用于實現POST的代碼在主板上ROM(CMOS)芯片上。 二. Boot Sequence(BI…

    Linux干貨 2017-03-25
  • python env seup

    ffffffffffffffffffffffffffffffffffffff

    2018-03-12
  • Linux之DNS服務

    DNS服務 DNS: Domain Name Service,協議(C/S, 53/udp, 53/tcp)應用層協議 BIND:BekerleyInternatName Domain, ISC (www.isc.org) 本地名稱解析配置文件:hosts     /etc/hosts   &nbs…

    Linux干貨 2016-10-05
  • Nginx:

    來自為知筆記(Wiz)

    Linux干貨 2016-10-26
  • 救援模式安裝RPM

    救援模式安裝RPM 步驟如下: (1)先讓RPM“自殺”掉,必須要使用忽略依賴選項—nodeps,否則卸載不了RPM程序。 (2)卸載完成后,將機器重啟,按F2鍵進入機器的BIOS模式,如下圖選擇CD-ROM啟動,最后按F10保存退出。 (3)機器將會從光驅上使用光盤文件做引導啟動,如下圖界面,相信大家都非常熟悉,該界面在我們安裝新系統的時候,也會見到。啰嗦…

    Linux干貨 2016-08-26
欧美性久久久久