1. 程式人生 > >inotify+rsync實時同步

inotify+rsync實時同步

首先要分清楚服務端(server端)和客戶端(client端)的概念

在這裡插入圖片描述


(服務端配置 | 服務端IP173.36.17.71)

rsync以daemon模式啟動

新建rsync配置檔案/etc/rsyncd.conf加入以下內容:

uid = root
gid = root
use chroot = no
max connections = 100  #最大連線數可自行調整
strict modes = yes
port = 873
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
[web]
path = /data/wwwroot/  #客戶端同步過來的檔案存放的位置可自定義
ignore errors = yes
read only = no
write only = no
hosts allow = 173.36.17.105  #允許IP173.36.17.105進行通訊,設定為'*'表示允許所有伺服器通訊,但必須註釋hosts deny選項
hosts deny = *  #拒絕其他任意IP訪問
uid = root
gid = root
auth users = root  #驗證使用者,可自行定義
secrets file = /etc/rsyncd.pwd  #密碼檔案存放位置

新建密碼檔案/etc/rsyncd.pwd並加入以下內容(注意服務端密碼檔案必須為username:password格式):

root:123456

將密碼檔案許可權修改為600

$ chmod 600 /etc/rsyncd.pwd

到此服務端配置基本完畢,防火牆記得開放873埠給客戶端IP173.36.17.105訪問,然後以daemon模式啟動伺服器端的rsync服務

$ rsync --daemon

(客戶端配置 | 客戶端IP173.36.17.105)

新建密碼檔案/etc/rsyncd.pwd並加入以下內容(客戶端密碼檔案只需填入密碼即可):

123456

將密碼檔案許可權修改為600

$ chmod 600 /etc/rsyncd.pwd
安裝inotify-toos同步服務
$ cd /usr/local/src
$ wget http://oxnuioltn.bkt.clouddn.com/inotify-tools-3.14.tar.gz  #如果伺服器無法連網可自行用工具下載此壓縮包後上傳到伺服器
$ tar -zxvf inotify-tools-3.14.tar.gz
$ cd inotify-tools-3.14
$ ./configure --prefix=/usr/local/inotify-tools
$ make && make install
$ cd /usr/local/inotify-tools/bin
$ ln -s /usr/local/inotify-tools/bin/inotifywait /usr/bin/  #做個軟鏈方便系統呼叫命令
編寫同步指令碼/home/shell/inotify.sh
#!/bin/bash
#Author:Benson
#Blog:http://blog.csdn.net/gbenson
#Name:inotify.sh
#Version:V1.0
#Description:
src=/data/wwwroot/html/  #需要同步的源路徑
des=web  #目標伺服器上 rsync --daemon 釋出的名稱
rsyncPasswdFile=/etc/rsyncd.pwd  #密碼檔案存放路徑
remoteIp=173.36.17.71  #目標伺服器IP
user=root  #rsync使用者
cd ${src}
inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
do
    INO_EVENT=$(echo $file | awk '{print $1}')
    INO_FILE=$(echo $file | awk '{print $2}')
    echo "---------------------------$(date)--------------------------------"
    echo $file
    #增加、修改、寫入完成、移動進事件
    if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]
    then
        echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
        rsync -avzcR --password-file=${rsyncPasswdFile} $(dirname ${INO_FILE}) ${user}@${remoteIp}::${des}
    fi
    #刪除、移動出事件
    if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
    then
        echo 'DELETE or MOVED_FROM'
        rsync -avzR --delete --password-file=${rsyncPasswdFile} $(dirname ${INO_FILE}) ${user}@${remoteIp}::${des}
    fi
    #修改屬性事件 指 touch chgrp chmod chown等操作
    if [[ $INO_EVENT =~ 'ATTRIB' ]]
    then
        echo 'ATTRIB'
        if [ ! -d "$INO_FILE" ]
        then
            rsync -avzcR --password-file=${rsyncPasswdFile} $(dirname ${INO_FILE}) ${user}@${remoteIp}::${des}
        fi
    fi
done

在客戶端伺服器中啟動此指令碼並輸出日誌同時保持後臺執行

$ /home/shell/inotify.sh &>/home/shell/inotify.log &

另外因為inotify只在啟動時會監控目錄,他沒有啟動期間的檔案發生更改,他是不知道的,所以這裡每2個小時做1次全量同步,防止各種意外遺漏,保證目錄一致。

$ crontab -e
* */2 * * * rsync -avz --password-file=/etc/rsyncd.pwd /data/wwwroot/html/ [email protected]::web  #加入此段內容

針對inotify的優化(可加入/etc/rc.local實現開機自動生效):

echo 50000000 >/proc/sys/fs/inotify/max_user_watches
echo 50000000 >/proc/sys/fs/inotify/max_queued_events

如文章對您有幫助,請開啟支付寶掃碼領取紅包,就當做對作者的支援,謝謝

在這裡插入圖片描述