使用rsync+inotify的意義:
其實同步服務器之間的目錄,只需要安裝rsync並通過腳本就可以做到定時同步。但是採用inotify是爲了做到更精確的同步,因爲inotify是一個文件監控工具,它會對指定文件的狀態進行實時監控輸出。實時同步的邏輯就是通過inotify對同步內容監控,然後通過記錄來使用rsync命令實現實時傳輸。
本文章只對操作過程做詳細記錄,具體功能一概而過。
模擬環境:
將服務器1中的a目錄,b目錄實時同步到服務器2中的c目錄,d目錄。a→c b→d
服務器1 IP:172.16.1.20 a目錄:/alidata/htmlService/ b目錄: /alidata/phpService/
服務器2 IP:172.16.8 c目錄:/alidata/htmlService/ d目錄: /alidata/phpService/
操作注意事項:
*建議用root用戶進行安裝
安裝rsync,測試手動同步
服務器2:
1.安裝rsync
yum -y install rsync
2.添加pass文件,pass文件名和位置都可自定義
vim /root/rsync.pass
user:password #自定義rsync用戶名和密碼,中間冒號隔開
保存退出
chmod 600 /root/rsync.pass #修改文件權限,必須要600
3.打開/etc/rsyncd.conf,修改如下:
port = 873 #rsync服務端口
log file = /var/log/rsync/rsyncd.log
pid file = /var/log/rsync/rsyncd.pid
[htmlService] #自定義模塊名稱,一個目錄對應一個模塊
path = /alidata/htmlService/ #被同步的目錄,c目錄
uid = root #使用root用戶執行rsync
gid = root
read only = no
write only = no
auth users = nginx_user
secrets file = /root/rsync.pass #pass文件位置
hosts allow = 172.16.1.20 #允許訪問的IP,服務器1
[phpService]
path = /alidata/phpService/
uid = root
gid = root
read only = no
write only = no
auth users = nginx_user
secrets file = /root/rsync.pass
hosts allow = 172.16.1.20
4.啓動rsync服務,並添加自啓動
rsync --daemon
echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local
服務器1
1.安裝xinet,rsync,inotify
yum -y install rsync xinet
2.添加pass文件,輸入服務器1中設置的密碼
vim /root/rsync.pass
password
保存退出
chmod 600 /root/rsync.pass #修改文件權限,必須要600
3.測試rsync命令是否成功
執行命令:
rsync -avpgolr --progress --delete /alidata/htmlService/ [email protected]::nginx --password-file=/root/rsync.pass
/alidata/htmlService/ #服務器要傳輸的文件目錄
user #pass文件用戶名
172.16.1.8
htmlService #rsyncd.conf文件中模塊名稱
--password-file=/root/rsync.pass :pass文件位置
安裝配置inotify
服務器1
1.安裝inotify
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar -zxvf inotify-tools-3.14.tar.gz
./configure
make && make install
2.手動執行inotifywait命令,監控/alidata/htmlService/目錄
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move /alidata/htmlService/
3.再打開一個終端,運行rsync命令,檢查inotifywait命令是否輸出操作歷史
rsync -avpgolr --progress --delete /alidata/htmlService/ [email protected]::nginx --password-file=/root/rsync.pass
4.以上成功後,就可以用下面腳本做到實時同步
htmlService(){
srdir="/alidata/htmlService/" # 同步的文件夾
user="nginx_user" # pass文件用戶名
ip="172.16.1.8"
pass_file="/home/ngariPro/rsync.pass" #pass文件位置
module_name="htmlService" #模塊名稱
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $srdir | while read file
do
rsync -avpgolr --progress --delete $srdir $user@$ip::$module_name --password-file=$pass_file
echo " ${file} was rsynced" >> /alidata/logs/inotify/inotify.log 2>&1
done
}
phpService(){
srdir="/alidata/phpService/" #同步的文件夾
user="nginx_user" #pass文件用戶名
ip="172.16.1.8"
pass_file="/home/ngariPro/rsync.pass" #pass文件位置
module_name="phpService" #模塊名稱
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $srdir | while read file
do
rsync -avpgolr --progress --delete $srdir $user@$ip::$module_name --password-file=$pass_file
echo " ${file} was rsynced" >> /alidata/logs/inotify/inotify.log 2>&1
done
}
htmlService
phpService
5.將腳本放在後臺運行,添加自啓動
nohup sh /root/xxx.sh &
echo “nohup sh /root/xxx.sh &” >>/etc/rc.local