目的: 為了實作實時同步,我們使用inotify來監控需要同步的目錄發生的改變,inotify隻是核心中的一個監控檔案變化的子產品,提供了監控檔案變化的API,而要連接配接這個API,需要安裝inotify-tools工具。可以實作檔案的新增,删除,修改,改變屬性等,功能很強大。現在需要一台伺服器做為釋出伺服器,來把改變的檔案,通過rsync實時的同步到内容伺服器。
先介紹一下rsync與inotify,都在在網上找的資料。先聲明下面的rsync與inotify介紹不是我自己寫的。
1、rsync
與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支援增量備份等優點,通過rsync可以解決對實時性要求不高的資料備份需求,例如定期的備份檔案伺服器資料到遠端伺服器,對本地磁盤定期做資料鏡像等。随着應用系統規模的不斷擴大,對資料的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了很多不足,首先,rsync同步資料時,需要掃描所有檔案後進行比對,進行差量傳輸。如果檔案數量達到了百萬甚至千萬量級,掃描所有檔案将是非常耗時的。而且正在發生變化的往往是其中很少的一部分,這是非常低效的方式。其次,rsync不能實時的去監測、同步資料,雖然它可以通過linux守護程序的方式進行觸發同步,但是兩次觸發動作一定會有時間差,這樣就導緻了服務端和用戶端資料可能出現不一緻,無法在應用故障時完全的恢複資料。基于以上原因,rsync+inotify組合出現了!
2、inotify
Inotify 是一種強大的、細粒度的、異步的檔案系統事件監控機制,linux核心從2.6.13起,加入了Inotify支援,通過Inotify可以監控檔案系統中添加、删除,修改、移動等各種細微事件,利用這個核心接口,第三方軟體就可以監控檔案系統下檔案的各種變化情況,而inotify-tools就是這樣的一個第三方軟體。在上面章節中,我們講到,rsync可以實作觸發式的檔案同步,但是通過crontab守護程序方式進行觸發,同步的資料和實際資料會有差異,而inotify可以監控檔案系統的各種變化,當檔案有任何變動時,就觸發rsync同步,這樣剛好解決了同步資料的實時性問題。
3、測試環境,兩台虛拟主機進行測試功能(web使用nginx部署):
192.168.10.170 這台主機上部署内容釋出伺服器,安裝rsync-3.1.1.tar.gz 和 intoify-tools.tar.gz
192.168.10.190 這台主機上部署前端伺服器,隻安裝rsync-3.1.1.tar.gz
實作功能:當内容釋出伺服器上的内容發生改變時,自動将資料同步到前端伺服器
内容釋出伺服器:
4、安裝rsync-3.1.1.tar.gz (192.168.10.170)
# tar xf rsync-3.1.1.tar.gz
# cd rsync-3.1.1/
# ./configure --prefix=/usr/local/rsync/
# make && make install
5、建立使用者檔案
# cd /usr/local/rsync/
# vim rsync.passwd
hadoop ##隻儲存使用者的密碼
# chmod 600 ./rsync.passwd ##修改檔案的權限
6、安裝intoify-tools-3.1.14.tar.gz
# tar xf intoify-tools-3.1.14.tar.gz
# cd intoify-tools-3.1.4/
# ./configure --prefix=/usr/local/intoify
7、建立rsync複制腳本
# vim /tmp/rsync.sh
#!/bin/bash
host=192.168.10.190 ##需要資料同步的主機ip
src=/usr/local/nginx/html/ftp ##本地需要同步的資料目錄
des=nginx
user=hadoop
/usr/local/inotify/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/local/rsync/bin/rsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsync.passwd $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
8、改變腳本檔案的執行權限:
# chmod 764 rsync.sh
9、讓其在背景運作
# sh /tmp/rsync.sh & 或 nohup /tmp/rsync.sh &
10、将rsync.sh腳本加入到開機啟動項裡
# echo "nohup /tmp/rsync.sh &" >> /etc/rc.local
前端伺服器:
1、安裝rsync-3.1.1.tar.gz (192.168.10.190)
2、建立使用者密碼檔案
# vim /usr/local/rsync/rsync.passwd
hadoop:hadoop //在server端隻有密碼,在client端有密碼和使用者名
3、改變其權限
# chmod 600 rsync.passwd
4、添加配置檔案
# vim /usr/local/rsync/rsync.conf
uid = root
gid = root
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
[nginx]
path = /tmp/ ##資料同步到的目錄
comment = web file
ignore errors
read only = no
write only = no
hosts allow = 192.168.10.170
hosts deny = *
list = false
auth users = hadoop
secrets file = /usr/local/rsync/rsync.passwd
5、啟動rsync
# /usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf
6、把rsync的啟動腳本加入到開機啟動項裡
# echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf" >> /etc/rc.local
PS: 進入/etc/xinetd.d/目錄下看是否有rsync檔案,有說明rsync是由xinetd程序管理的,可以通過xinetd來啟動rsync
# chkconfig rsync on