2012年11月27日 星期二

[伺服器管理] inotify + rsync 完成即時同步資料

inotify 是個強大的檔案監控系統
可以監控所指定目錄下所有檔案變化,包含新增,刪除,修改...等事件

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/

沒有留言:

張貼留言