rsync+inotify文件實時同步

 

1、rsync

與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支持增量備份等優點,通過rsync可以解決對實時性要求不高的數據備份需求,例如定期的備份文件服務器數據到遠端服務器,對本地磁盤定期做數據鏡像等。
隨着應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了很多不足,首先,rsync同步數據 時,需要掃描所有文件後進行比對,進行差量傳輸。如果文件數量達到了百萬甚至千萬量級,掃描所有文件將是非常耗時的。而且正在發生變化的往往是其中很少的 一部分,這是非常低效的方式。其次,rsync不能實時的去監測、同步數據,雖然它可以通過linux守護進程的方式進行觸發同步,但是兩次觸發動作一定 會有時間差,這樣就導致了服務端和客戶端數據可能出現不一致,無法在應用故障時完全的恢復數據。基於以上原因,rsync+inotify組合出現了!

2、inotify

Inotify 是一種強大的、細粒度的、異步的文件系統事件監控機制,linux內核從2.6.13起,加入了Inotify支持,通過Inotify可以監控文件系統 中添加、刪除,修改、移動等各種細微事件,利用這個內核接口,第三方軟件就可以監控文件系統下文件的各種變化情況,而inotify-tools就是這樣 的一個第三方軟件。
在上面章節中,我們講到,rsync可以實現觸發式的文件同步,但是通過crontab守護進程方式進行觸發,同步的數據和實際數據會有差異,而inotify可以監控文件系統的各種變化,當文件有任何變動時,就觸發rsync同步,這樣剛好解決了同步數據的實時性問題。

具體大家可以參照http://www.ibm.com/developerworks/cn/linux/l-ubuntu-inotify/index.html來進行學習。

接下面我們來開始進行rsync與inotify的安裝、配置、測試。

下面是2個服務器的結構,分別爲主機名、ip、狀態、內核、位數、同步的目錄,並將2臺服務器均是redhat5.4發行版本。

一、主服務器(server端,我這裏是nginx)
其中主服務器需要安裝rsync與inotify,主服務器作爲server,向備份服務器client傳輸文件
1、安裝rsync
  1. [root@nginx ~]# cd /usr/src/
  2. [root@nginx src]# ll
  3. total 16
  4. drwxr-xr-x 2 root root 4096 Jan 26 2010 debug
  5. drwxr-xr-x 2 root root 4096 Jan 26 2010 kernels
  6. [root@nginx src]# wget http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz
  7. [root@nginx src]# tar zxvf rsync-3.0.9.tar.gz
  8. [root@nginx src]# cd rsync-3.0.9
  9. [root@nginx rsync-3.0.9]# ./configure --prefix=/usr/local/rsync
  10. [root@nginx rsync-3.0.9]# make
  11. [root@nginx rsync-3.0.9]# make install
2、建立密碼認證文件
  1. [root@nginx rsync-3.0.9]# cd /usr/local/rsync/
  2. [root@nginx rsync]# echo "rsync-pwd" >/usr/local/rsync/rsync.passwd
其中rsync-pwd可以自己設置密碼,rsync.passwd名字也可以自己設置
  1. [root@nginx rsync]# chmod 600 rsync.passwd
無論是爲了安全,還是爲了避免出現以下錯誤,密碼文件都需要給600權限
  1. password file must not be other-accessible
  2. continuing without password file
3、安裝inotify
  1. [root@nginx rsync]# cd /usr/src/
  2. [root@nginx src]# wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
  3. [root@nginx src]# tar zxvf inotify-tools-3.14.tar.gz
  4. [root@nginx src]# cd inotify-tools-3.14
  5. [root@nginx inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify
  6. [root@nginx inotify-tools-3.14]# make
  7. [root@nginx inotify-tools-3.14]# make install
4、創建rsync複製腳本
此項功能主要是將server端的目錄/tmp裏的內容,如果修改了(無論是添加、修改、刪除文件)能夠通過inotify監控到,並通過rsync實時的同步給client的/tmp裏,下面是通過shell腳本實現的。
  1. #!/bin/bash
  2. host=192.168.10.221
  3. src=/tmp/
  4. des=web
  5. user=webuser
  6. /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
  7. | while read files
  8. do
  9. /usr/bin/rsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsync.passwd $src $user@$host::$des
  10. echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
  11. done
注意:經過1樓的提示,我發現如果把rsync.log的放到tmp(備份的目錄)或發送一直複製的問題,所以建議各位吧rsync的日誌放到其他的目錄下(非備份目錄)。
其中host是client的ip,src是server端要實時監控的目錄,des是認證的模塊名,需要與client一致,user是建立密碼文件裏的認證用戶。
把這個腳本命名爲rsync.sh,放到監控的目錄裏,比如我的就放到/tmp下面,並給予764權限
  1. [root@nginx tmp]# chmod 764 rsync.sh
然後運行這個腳本
  1. [root@nginx tmp]# sh /tmp/rsync.sh &
請記住,只有在備份服務器client端的rsync安裝並啓動rsync之後,在啓動rsync.sh腳本,否則有時候會滿屏出現:
  1. rsync: failed to connect to 192.168.10.221: Connection refused (111)
  2. rsync error: error in socket IO (code 10) at clientserver.c(107) [sender=2.6.8]
我們還可以把rsync.sh腳本加入到開機啓動項裏
  1. [root@nginx tmp]# echo "/tmp/rsync.sh" >> /etc/rc.local

二、備份服務器(client,我這裏爲nginx-backup

1、安裝rsync(備份服務器只安裝rsync

  1. [root@nginx-backup ~]# cd /usr/src/
  2. [root@nginx-backup src]# ll
  3. total 16
  4. drwxr-xr-x 2 root root 4096 Jan 26 2010 debug
  5. drwxr-xr-x 2 root root 4096 Jan 26 2010 kernels
  6. [root@nginx-backup src]# wget http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz
  7. [root@nginx-backup src]# tar zxvf rsync-3.0.9.tar.gz
  8. [root@nginx-backup src]# cd rsync-3.0.9
  9. [root@nginx-backup rsync-3.0.9]# ./configure --prefix=/usr/local/rsync
  10. [root@nginx-backup rsync-3.0.9]# make
  11. [root@nginx-backup rsync-3.0.9]# make install
2、建立用戶與密碼認證文件
  1. [root@nginx-backup rsync-3.0.9]# echo "webuser:rsync-pwd" > /usr/local/rsync/rsync.passwd
請記住,在server端建立的密碼文件,只有密碼,沒有用戶名;而在備份服務端client裏建立的密碼文件,用戶名與密碼都有。
  1. [root@nginx-backup rsync]# chmod 600 rsync.passwd
需要給密碼文件600權限
3、建立rsync配置文件
  1. uid = root
  2. gid = root
  3. use chroot = no
  4. max connections = 10
  5. strict modes = yes
  6. pid file = /var/run/rsyncd.pid
  7. lock file = /var/run/rsync.lock
  8. log file = /var/log/rsyncd.log
  9. [web]
  10. path = /tmp/
  11. comment = web file
  12. ignore errors
  13. read only = no
  14. write only = no
  15. hosts allow = 192.168.10.220
  16. hosts deny = *
  17. list = false
  18. uid = root
  19. gid = root
  20. auth users = webuser
  21. secrets file = /usr/local/rsync/rsync.passwd
其中web是server服務端裏的認證模塊名稱,需要與主服務器裏的一致,以上的配置我的自己服務器裏的配置,以供參考。
把配置文件命名爲rsync.conf,放到/usr/local/rsync/目錄裏
啓動rsync
  1. [root@nginx-backup rsync]# /usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf
如果出現以下問題:
  1. /usr/local/rsync/bin/rsync: error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory,
可以採用下面方法解決
  1. [root@nginx-backup rsync]# whereis libiconv.so.2
  2. libiconv.so: /usr/local/lib/libiconv.so.2 /usr/local/lib/libiconv.so
找到所需模塊所在的目錄,然後把此目錄添加到/etc/ld.so.conf裏,並更新庫文件
  1. [root@nginx-backup rsync]# echo "/usr/local/lib/" >> /etc/ld.so.conf
  2. [root@nginx-backup rsync]# ldconfig
我們可以把rsync腳本加入到開機啓動項裏
  1. [root@nginx-backup rsync]# echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf" >> /etc/rc.local
現在rsync與inotify在server端安裝完成,rsync在備份服務器client端也安裝完成
下面是server端的tmp文件情況

下面是client端tmp的文件情況

接下來我們來做一下測試,在server裏創建個test-rsync文件,看看client是否能收到

在看client端是否有test-rsync文件,同時client端的tmp目錄文件是否與server端的文件完全一致

可以看到在client端,已經收到了test-rsync文件,而且client的tmp裏的文件與server裏tmp的文件完全相同、文件數目一致。
現在rsync與inotify的搭建與配置完成了,並實現了服務器直接數據的實時同步;大家可以根據自己的需要來進行相應的配置。
BTW:在rsync+inotify這種備份方法的時候,我公司遇到了一個問題,那就是主服務已經給備用服務同步完數據了,但主服務器磁盤看 見滿了,需要把已經備份的文件刪除,但同時在備份服務器裏保留主服務器裏的文件,也就是說主服務器裏刪除文件的時候,備份服務器裏不跟着刪除文件,我查看 了很多英文文檔,測試了很多遍,最後找到了一個解決方法,那就是在主服務器裏,把rsync.sh這個腳本里第9行的--delete參數給去掉,就可以 解決這個問題。

轉自http://dl528888.blog.51cto.com/2382721/771533

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