rsync+inotify實現數據實時同步

      在上篇博文《rsync實現Linux服務器數據同步》中,我們講了rsync實現文件同步的方法與特點,rsync在這方面有着很多優點,但也並非完美無缺。比如,rsync不能實時地監控數據變化,來實現實時同步的目的,雖然可以使用計劃任務的方式定時觸發同步,但兩次觸發動作一定會有時間差,對於實時性要求高的環境,這是不可接受的。另外,rsync每次開始時都需要掃描目錄裏面的所有文件,然後進行差量傳輸,如果目錄裏面的文件達到十萬,甚至百萬級別時,整個操作將非常耗時,而發生改變的可能只是其中的一兩個文件,這樣無疑是很低效率的行爲。
      在瞭解了rsync 的不足之處後,我們再來了解一下inotify。Inotify是linux系統本身的一種文件系統事件的監控機制,通過它可以監控到文件系統的變化,如:添加、刪除、修改等各種細微的動作。利用這個內核接口,第三方軟件可以監控文件系統下文件的各種變化情況,Inotify-tools就是這樣一款軟件,當它與rsync結合使用時,可以彌補rsync所存在的缺陷,達到最好的效果。
      操作環境如下,服務器A的/data目錄爲源,對其中的內容做任何更新都將即時同步到B和C服務器中的/test目錄。

服務器B和C的 rsync.conf配置:

---------------------------------------

uid=root     
gid=root     
use chroot=no                     
max connections=20                
strict mode =yes                  
pid file=/var/run/rsyncd.pid      
lock file=/var/lock/rsync.lock    
log file=/var/log/rsyncd.log      

[model1]                         
path=/data/                       
comment=Test              
ignore errors                   
read only=no                       
write only=no                     
hosts allow=192.168.0.10          
hosts deny=*                      
list=false                                         
auth users=alex                  
secrets file=/etc/rsyncd.pass      

---------------------------------------

配置完成後,啓動服務器的rsync守護,並將rsync服務加入到自啓動文件中。
echo “/usr/local/bin/rsync –daemon “>> /etc/rc.local
注:關於rsync配置的詳細介紹,可參考我博客中上一篇的rsync博文。

 

 

服務器A上安裝配置inotify-tools工具:
注:linux內核版本需要高於2.6.13才能支持inotify特性。
1. 下載安裝inotify-tool工具
wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/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-3.14/
make
make install 
ln -s /usr/local/inotify-tools-3.14/  /usr/local/inotify
安裝完inotify-tools後,會生成inotifywait和inotifywatch兩個指令。其中,inotifywait用於等待文件或文件集上的一個特定事件,可以監控任何文件和目錄設置,並且可以遞歸地監控整個目錄樹;inotifywatch用於收集被監控的文件系統統計數據,包括每個inotify事件發生多少次等信息。

2. 添加同步目錄
mkdir  /data

3.添加密碼文件
vi /etc/rsyncd.passwd
123456

4.創建腳本:
vi  inotify.sh
---------------------------------------
#!/bin/bash
host1=192.168.0.20
host2=192.168.0.30
src=/data
dst=/test
user=alex
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib /apps/apk_update/ | while read files
do
/usr/bin/rsync -vzrtopg --delete --progress  --password-file=/etc/rsyncd.passwd  $src $user@$host1::$dst

/usr/bin/rsync -vzrtopg --delete --progress  --password-file=/etc/rsyncd.pass  $src $user@$host2::$dst

echo "${files} was rsynced" >> /tmp/rsync.log 2>&1
done

---------------------------------------

inotifywait的相關參數:
-m 即 –monitor ,表示始終保持事件監聽狀態;
-r  即 –recursive,表示遞歸查詢目錄
-q 即 –quiet ,打印出監控事件
--timefmt,指定時間的輸出格式
--format,指定變化文件的詳細信息

5.啓動腳本
sh inotify.sh &
最後,將些腳本加入自啓動文件
echo “sh inotify.sh &” >> /etc/rc.local

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章