可以監控所指定目錄下所有檔案變化,包含新增,刪除,修改...等事件
Linux kernel 需要 2.6.13 以才能有支援
故可以利用其機制 + rsync 在發現檔案系統有變化時即執行 rsync 來做同步
rsync 是個好用且強大的同步備份軟體,但可惜的是他在同步時通常是全目錄一起比較後 Diff 把 Diff 部份傳輸,如果檔案很多時,將會消耗許多系統資源。
所以利用 inotily + rsync 來降低其消耗資源,也可以達到即時同步
以下範例將實現將一台 Master 的網頁資料同步至另一台 Slave Server
rsync 遠端同步
將 master 資料(/var/www/myweb) 同步至 slave (/var/www/myweb)
ssh 192.168.1.2
rsync -avz root@192.168.1.1:/var/www/myweb /var/www/
(會要求輸入密碼,如不想輸入密碼請建立 ssh-key 並在指令加上 -e "ssh -i [key-path]")
ps一般情況不需即時同步,即可以使用 crontab job 來做定時同止
1 3 * * * /usr/bin/rsync -avz -e "ssh -i /root/.ssh/priv-key" root@192.168.1.1:/var/www/myweb /var/www/
上述的 rsync 已經是使用 ssh 登入再做 rsync 可以不用架 server,如果需求上有需要 rsync server 可以參考最後一段。
再來安裝 inotify來做即時監控並同步資料
Master:
1. 安裝 inotify
a. 請至 https://github.com/rvoicilas/inotify-tools/wiki/ 下載 inotify-tools
b. 將 inotify-tools-3.14.tar.gz 上傳至 master
c. tar -zxvf inotify-tools-3.14.tar.gz
d. cd inotify-tools-3.14
e. ./configure
f. make
g. make install
2. 使用以下指令測試監控目錄 (/var/www/myweb)
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w%f %e' --event modify,create,move,delete /var/www/myweb
(可以使用另個 ssh 登入並在該目錄下新增刪除檔案)
完整 event 可參考
http://linux.die.net/man/7/inotify
http://en.wikipedia.org/wiki/Inotify
3. 建立 script 用於啟動監控並即時同止
a. vi inotify-tools.sh
加入以下內容
#!/bin/sh
src='/var/www/myweb'
dest='/var/www'
host='192.168.1.2'
/usr/local/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w%f %e' \
--event modify,create,move,delete $src | while read date time file event
do
# echo $date $time $file $event
# cmd="rsync -arq --delete $src $host::backup$dest" old command
cmd="rsync -avz $src root@$host:$dest"
# echo $cmd
$cmd
done
4. 開機時自動啟動
vi /etc/rc.d/rc.local
在後面加入
/root/inotify-tools.sh &
#請依據您放 inotify-tools.sh 的目錄修改
ps.如果不使用 rsync 亦可以使用 nfs + mount 的方式來處理
僅需將 cmd="rsync -avz $src root@$host:$dest"此行的指令
最後 root@$host:$dest 修改為 mount Slave上來目錄路徑即可
(option) 利用 rsync server 來同步資源
Slave: (登入 Slave)
1. yum install rsync xinetd
2. vi /etc/xinetd.d/rsync
內容
service rsync
{
disable = no #改為 no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
#並加入以下內容
[backup] #表示在使用rsync指令時目錄代號 (與 samba 設定相似)
path = /var/www #表示實際指向的目錄
uid = root
gid = root
hosts allow = 192.168.1.0/24 #充許的存取的 host,請依 ip 需求修改
read only = no
3. service xinetd restart
Master:
此時即可將 master 資料(/var/www/myweb) 同步至 slave (/var/www/myweb)
rsync -arq --delete /var/www/myweb 192.168.1.2::backup/
ps一般情況不需即時同步,即可以使用 crontab job 來做定時同止
1 3 * * * /usr/bin/rsync -arq --delete /var/www/myweb 192.168.1.2::backup/