天天看點

rsync+inotify實作資料實時同步

目的:  為了實作實時同步,我們使用inotify來監控需要同步的目錄發生的改變,inotify隻是核心中的一個監控檔案變化的子產品,提供了監控檔案變化的API,而要連接配接這個API,需要安裝inotify-tools工具。可以實作檔案的新增,删除,修改,改變屬性等,功能很強大。現在需要一台伺服器做為釋出伺服器,來把改變的檔案,通過rsync實時的同步到内容伺服器。

先介紹一下rsync與inotify,都在在網上找的資料。先聲明下面的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同步,這樣剛好解決了同步資料的實時性問題。

3、測試環境,兩台虛拟主機進行測試功能(web使用nginx部署):

     192.168.10.170   這台主機上部署内容釋出伺服器,安裝rsync-3.1.1.tar.gz 和 intoify-tools.tar.gz

     192.168.10.190   這台主機上部署前端伺服器,隻安裝rsync-3.1.1.tar.gz

     實作功能:當内容釋出伺服器上的内容發生改變時,自動将資料同步到前端伺服器

内容釋出伺服器:

4、安裝rsync-3.1.1.tar.gz (192.168.10.170)

     # tar xf rsync-3.1.1.tar.gz 

     # cd rsync-3.1.1/

     # ./configure --prefix=/usr/local/rsync/

     # make && make install

5、建立使用者檔案

     # cd /usr/local/rsync/

     # vim rsync.passwd

           hadoop    ##隻儲存使用者的密碼

     # chmod 600 ./rsync.passwd   ##修改檔案的權限

6、安裝intoify-tools-3.1.14.tar.gz

     # tar xf intoify-tools-3.1.14.tar.gz 

     # cd intoify-tools-3.1.4/

     # ./configure --prefix=/usr/local/intoify

7、建立rsync複制腳本

     # vim /tmp/rsync.sh

    #!/bin/bash  

    host=192.168.10.190       ##需要資料同步的主機ip

    src=/usr/local/nginx/html/ftp        ##本地需要同步的資料目錄

    des=nginx

    user=hadoop

    /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files  

    do  

    /usr/local/rsync/bin/rsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsync.passwd $src $user@$host::$des  

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

    done  

8、改變腳本檔案的執行權限:

    # chmod 764 rsync.sh

9、讓其在背景運作

    # sh /tmp/rsync.sh &  或 nohup /tmp/rsync.sh &

10、将rsync.sh腳本加入到開機啟動項裡

    # echo "nohup /tmp/rsync.sh &" >> /etc/rc.local

前端伺服器:

1、安裝rsync-3.1.1.tar.gz (192.168.10.190)

2、建立使用者密碼檔案

     # vim /usr/local/rsync/rsync.passwd

            hadoop:hadoop            //在server端隻有密碼,在client端有密碼和使用者名

3、改變其權限

     # chmod 600 rsync.passwd

4、添加配置檔案

     # vim /usr/local/rsync/rsync.conf

    uid = root 

    gid = root 

    use chroot = no 

    max connections = 10 

    strict modes = yes 

    pid file = /var/run/rsyncd.pid  

    lock file = /var/run/rsync.lock  

    log file = /var/log/rsyncd.log  

    [nginx]  

    path = /tmp/        ##資料同步到的目錄

    comment = web file  

    ignore errors  

    read only = no 

    write only = no 

    hosts allow = 192.168.10.170  

    hosts deny = *  

    list = false 

    auth users = hadoop

    secrets file = /usr/local/rsync/rsync.passwd 

5、啟動rsync

     # /usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf  

6、把rsync的啟動腳本加入到開機啟動項裡

     # echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf" >> /etc/rc.local      

PS: 進入/etc/xinetd.d/目錄下看是否有rsync檔案,有說明rsync是由xinetd程序管理的,可以通過xinetd來啟動rsync

     # chkconfig rsync on