下面我們來看一篇linux中使用rsync+inotify-tools+ssh文件實(shí)時(shí)同步的例子,這個(gè)對于很多大站的朋友都是這樣操作的,下面一起來看看吧.
在某些服務(wù)器架構(gòu)中,會(huì)遇到文件同步問題,例如需要做站點(diǎn)鏡像備份,同步文件到多個(gè)CDN節(jié)點(diǎn)等,需要解決的主要有兩個(gè)問題.
1.如何實(shí)現(xiàn)文件同步問題? 2.何時(shí)執(zhí)行同步操作?
文件同步可以使用rsync+ssh,什么時(shí)候自行同步操作呢?可能部分人會(huì)想到cron,這個(gè)沒錯(cuò),可以實(shí)現(xiàn)的,但是確實(shí)有點(diǎn)浪費(fèi)資源,因?yàn)閏ron并不知道文件是否被修改過,只是不停的周期性的執(zhí)行,如果文件修改后再執(zhí)行同步操作,不修改就不執(zhí)行那應(yīng)該比較好,其實(shí)inotify就可以做到,只要你的服務(wù)器不是古董級別的,就支持inotify,來幾句沒用的話:
Inotify 是一個(gè) Linux特性,它監(jiān)控文件系統(tǒng),并且及時(shí)向?qū)iT的應(yīng)用程序發(fā)出相關(guān)的事件警告,比如刪除、讀、寫和卸載操作等。Inotify 反應(yīng)靈敏,用法非常簡單,并且比 cron 任務(wù)的繁忙輪詢高效得多。
假設(shè)某服務(wù)器架構(gòu)中有兩臺(tái)web服務(wù)器(IP為192.168.1.252和192.168.1.254),一臺(tái)代碼更新發(fā)布服務(wù)器(IP為192.168.1.251),需要同步的目錄是/data/www/.
rsync文件同步,下面介紹一下安裝步驟:
在代碼發(fā)布服務(wù)器(192.168.1.251)上安裝inotify,執(zhí)行如下命令.
- tar xzvf inotify-tools-3.14.tar.gz
- cd inotify-tools-3.14
- ./configure
- make
- make install
- cd ..
在所有服務(wù)器上(代碼發(fā)布服務(wù)器和需要同步的服務(wù)器)上安裝rsync,命令如下:
- tar zxvf rsync-3.0.9.tar.gz
- cd rsync-3.0.9
- ./configure
- make
- make install
以上命令在每臺(tái)服務(wù)器上都需要執(zhí)行,在代碼發(fā)布服務(wù)器與需要同步的服務(wù)器之間配置ssh key信任,在代碼發(fā)布服務(wù)器上生成公鑰和私鑰.
ssh-keygen -t rsa
直接三次回車,將公鑰添加到各個(gè)需要更新的主機(jī)authorized_keys 文件中,在代碼更新服務(wù)器上再執(zhí)行.
- ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.252
- ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.254
如果有提示 輸入yes,按提示輸入密碼回車,然后兩臺(tái)需要web服務(wù)器(192.168.1.252和192.168.1.254)重啟ssh.
service sshd restart
在代碼發(fā)布服務(wù)器上以root身份創(chuàng)建inotify_rsync.sh腳本vi /root/inotify_rsync.sh 輸入.
- #!/bin/sh
- SRC=/data/www/ #代碼發(fā)布服務(wù)器目錄
- DST=/data/www/ #目標(biāo)服務(wù)器目錄
- IP="192.168.1.252 192.168.1.254" #目標(biāo)服務(wù)器IP,多個(gè)以空格隔開
- USER=root
- /usr/local/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w%f %e' --exclude "(.swp|.swx|.svn)" \
- -e create,move,delete,close_write,attrib $SRC | while read files
- do //Vevb.com
- for i in $IP
- do
- /usr/local/bin/rsync -ahqzt --exclude Runtime --delete $SRC $USER@$i:$DST
- echo $files >>/tmp/rsync.log 2>&1
- done
- done
相關(guān)解釋:
- uusr/local/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w%f %e' --exclude "(.swp|.swx|.svn)" \
- -e create,move,delete,close_write,attrib $SRC | while read files
-m 是保持一直監(jiān)聽
-r 是遞歸查看目錄
-q 是打印出事件
-e create,move,delete,close_write,attrib 是指 “監(jiān)聽 創(chuàng)建 移動(dòng) 刪除 寫入 權(quán)限” 事件.
/usr/local/bin/rsync -ahqzt --exclude Runtime --delete $SRC $USER@$i:$DST
-a 存檔模式
-h 保存硬連接
-q 制止非錯(cuò)誤信息
-z 壓縮文件數(shù)據(jù)后傳輸
-t 維護(hù)修改時(shí)間
-delete 刪除于多余文件
--exclude 排除同步的文件
然后賦予腳本可執(zhí)行權(quán)限:chmod +x /root/inotify_rsync.sh
設(shè)置開機(jī)自啟動(dòng) echo "/root/inotify_rsync.sh &" >> /etc/rc.local
執(zhí)行腳本/root/inotify_rsync.sh &,在代碼更新服務(wù)器的/data/www/目錄中創(chuàng)建文件,測試效果.
新聞熱點(diǎn)
疑難解答
圖片精選