inotify+rsync實時同步
阿新 • • 發佈:2018-10-31
首先要分清楚服務端(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