點(diǎn)擊訪問原文
您還可以加入全棧技術(shù)交流群(QQ群號(hào):254842154)
對(duì)于一個(gè)系統(tǒng)管理員來(lái)說(shuō),如何較實(shí)時(shí)地在多臺(tái)服務(wù)器之間同步文件,是一個(gè)很重要的任務(wù)。之前我有一篇文章介紹了如何定時(shí)同步服務(wù)器文件,但是無(wú)法做到實(shí)時(shí)。今天給大家介紹一個(gè)inotify+rsync的實(shí)時(shí)同步方案,可以應(yīng)用于文件備份,多臺(tái)負(fù)載服務(wù)器代碼同步等場(chǎng)景。
前提條件
inotify是linux內(nèi)核從2.6.13引入的文件系統(tǒng)變化通知機(jī)制。因此,需要檢查你的服務(wù)器版本是否支持inotify機(jī)制
grep INOTIFY_USER /boot/config-$(uname -r)
假如輸出
CONFIG_INOTIFY_USER=y
則代表支持。
安裝inofity-tools工具包
yum install inotify-tools
應(yīng)用場(chǎng)景
多臺(tái)負(fù)載服務(wù)器的代碼通常需要實(shí)時(shí)地保持一致,傳統(tǒng)的做法是使用crontab定時(shí)任務(wù)同步,這種方法不夠?qū)崟r(shí)而且效率低下。
今天以inotify+rsync為搭配介紹新的代碼同步方案。
假設(shè)現(xiàn)在有三臺(tái)服務(wù)器A,B,C,三臺(tái)服務(wù)器是負(fù)載服務(wù)器,站點(diǎn)所在目錄結(jié)構(gòu)一致。現(xiàn)在要實(shí)現(xiàn)只發(fā)布代碼到A服務(wù)器,自動(dòng)同步代碼到B和C服務(wù)器。首選需要讓A服務(wù)器可以通過公鑰方式登錄到B和C,執(zhí)行以下三步:
①在服務(wù)器A生成一對(duì)公鑰和秘鑰。使用 ssh-keygen -t rsa生成,一路回車即可;
②進(jìn)入秘鑰文件夾查看文件。其中id_rsa.pub是公鑰,id_rsa是私鑰;
cd ~/.ssh
③打開id_rsa.pub文件,并把它的內(nèi)容拷貝到服務(wù)器B和C的 /root/.ssh/authorized_keys 文件中,假如 /root/.ssh 目錄下沒有 authorized_keys 文件,則新建一個(gè)文件。
現(xiàn)在,在A服務(wù)器就可以直接通過ssh命令實(shí)現(xiàn)無(wú)密碼登錄了
//指定端口號(hào),把ip_address替換成你ip地址
ssh root@ip_address -p 27631
//默認(rèn)端口號(hào)
ssh root@ip_address
編寫腳本:
#!/bin/sh
#var
src="/var/www/html/t/"
des_ip="ip_address1 ip_address2"
#function
inotify_fun ()
{
/usr/bin/inotifywait -mrq --timefmt '%Y%m%d-%H:%M' --format '%T %e %w%f' \
-e attrib,close_write,delete,create,modify,move $1|while read time file
do
for ip in $des_ip
do
echo $des_ip
echo "`date +%Y%m%d-%T`: rsync -avzq --delete --progress $1 root@$ip:$1"
rsync -avzrtopgq --delete --progress $1 root@$ip:$1
#echo
done
done
}
#main
for a in $src
do
inotify_fun $a
done
des_ip 中的 ip_address1 和 ip_address2 替換成實(shí)際的ip地址,多個(gè)ip地址用空格隔開。src是需要實(shí)時(shí)同步的目錄,源服務(wù)器和目標(biāo)服務(wù)器的目錄結(jié)構(gòu)一致。保存腳本文件為rsync.sh,然后用定時(shí)任務(wù)運(yùn)行它一次,運(yùn)行成功后取消該定時(shí)任務(wù)(我暫時(shí)不知道如何運(yùn)行腳本一次,只能用這個(gè)土方法了。。。哪位大神知道麻煩告知一聲)。
inotifywait的e參數(shù)表示要監(jiān)聽哪些事件:
access 訪問,讀取文件。
modify 修改,文件內(nèi)容被修改。
attrib 屬性,文件元數(shù)據(jù)被修改。
move 移動(dòng),對(duì)文件進(jìn)行移動(dòng)操作。
create 創(chuàng)建,生成新文件
open 打開,對(duì)文件進(jìn)行打開操作。
close 關(guān)閉,對(duì)文件進(jìn)行關(guān)閉操作。
delete 刪除,文件被刪除。
查看任務(wù)是否在運(yùn)行
ps -ef |grep inotify
假如修改了腳本文件,需要關(guān)閉inotify之后再重新運(yùn)行定時(shí)任務(wù)再取消。
sudo pkill inotifywait