rsync+inotify實時數據的同步實例

rsync+inotify實時數據的同步

一、rsync+inotify的組合爲什麼會出現??

 
    rsync缺陷:

               1、由於rsync在實施大量數據備份時,工作方式是掃描整個數據文 件,其實發生更改  的只是一小部分,導致過多的佔用系統資源。    
               2、rsync不能實時的去監測、同步數據,雖然它可以通過linux守護進程的方式進行觸發同步,但是兩次觸發動作一定會有時間差,這樣就導致了服務端和客戶端數據  可能出現不一致,無法在應用故障時完全的恢復數據。    

    inotify優點:

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


二、安裝inotify工具inotify-tools並簡單解釋基本用法    
     1、安裝inotify得條件:內核版本必須得在2.6.13以上的版本才支持。    
     2、判斷當前版本是否支持安裝inotify    
        # uname -r    
        2.6.32-431.el6.x86_64 (看下內核版本)    
        或    
        # ll /proc/sys/fs/inotify(看下有沒有下面這三個文件如果有則說明支持inotify)    
        total 0    
        -rw-r--r-- 1 root root 0 Aug 17 12:03 max_queued_events    
        -rw-r--r-- 1 root root 0 Aug 17 12:03 max_user_instances    
        -rw-r--r-- 1 root root 0 Aug 17 12:03 max_user_watches    
    3、安裝inotify    
        (1)編譯安裝    
            下載源碼包:http://inotify-tools.sourceforge.net(從其他地方下載也可以)    
            #tar xf inotify-tools-3.14.tar.gz    
            #cd inotify-tools-3.14    
            #./conifgure    
            #make && make install               
            # ll /usr/local/bin/inotifywa*(查看下是否生成了這兩個文件)    
            -rwxr-xr-x 1 root root 44271 Aug 17 12:15 /usr/local/bin/inotifywait    
            -rwxr-xr-x 1 root root 41361 Aug 17 12:15 /usr/local/bin/inotifywatch    
        (2)yum安裝    
            #yum install inotify-tools    
                 (這裏不做說明)    
        這裏對生成的inotifywait和inotifywatch作下說明    
            inotify-tools安裝完成後,會生成inotifywait和inotifywatch兩個指令,其中,inotifywait用於等待文件或文件集上的一個特定事件,它可以監控任何文件和目錄設置,並且可以遞歸地監控整個目錄樹。    
            inotifywatch用於收集被監控的文件系統統計數據,包括每個inotify事件發生多少次等信息    
    4、 inotify相關參數    
        inotify定義了下列的接口參數,可以用來限制inotify消耗kernel memory的大小。由於這些參數都是內存參數,因此,可以根據應用需求,實時的調節其大小。下面分別做簡單介紹。    
            /proc/sys/fs/inotify/max_queued_evnets    
               表示調用inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丟棄,但會觸發IN_Q_OVERFLOW事件。    
            /proc/sys/fs/inotify/max_user_instances    
                表示每一個real user ID可創建的inotify instatnces的數量上限。    
            /proc/sys/fs/inotify/max_user_watches    
                表示每個inotify instatnces可監控的最大目錄數量。如果監控的文件數目巨大,需要根據情況,適當增加此值的大小,例如:    
            echo 30000000 > /proc/sys/fs/inotify/max_user_watches    
    5、 inotifywait相關參數    
        Inotifywait是一個監控等待事件,可以配合shell腳本使用它,下面介紹一下常用的一些參數:    
         -m, 即--monitor,表示始終保持事件監聽狀態。    
         -r, 即--recursive,表示遞歸查詢目錄。    
         -q, 即--quiet,表示打印出監控事件。    
         -e, 即--event,通過此參數可以指定要監控的事件,常見的事件有modify、delete、create、attrib等。    
三、案例:    
        有一個負載調度節點和三個服務節點以及一個內容發佈節點構成,內容發佈節點負責將用戶發佈的數據生成靜態頁面,同時將靜態網頁傳輸到三臺服務節點,    
        而負載調度節點負責將用戶請求根據負載算法調度到相應的服務節點,實現用戶訪問。用戶要求在前端訪問到的網頁數據始終是最新的、一致的。

 
        我們這裏讓3個WEB服務器節點,即時同步網站上的數據(通過上面inotify的介紹是個監控工具和rsync結合,兩兩結合,幹活完美!)    
        這裏介紹下,rsync工作原理:是在三臺WEB節點當rsync的服務器端,server服務器當rsync的客戶端,同步數據就是,server服務器向節點推送數據的過程

1

        配置步驟:    
            1、軟件的安裝    
                三臺節點:

                    rsync安裝:#yum install xinetd 

                server節點:     
                        安裝inotify我們這裏實驗用的是編譯安裝 

                                
                           
            2、配置文件rsyncd.conf配置           
                (1)#vim /etc/rsyncd.conf(這個文件是需要自己創建)    
                    # Global Settings    
                    uid = nobody    
                    gid = nobody    
                    use chroot = no    
                    max connections = 10    
                    strict modes = yes    
                    pid file = /var/run/rsyncd.pid    
                    log file = /var/log/rsyncd.log

                    # Directory to be synced    
                    [web1]    
                    path = /web1/data    
                    ignore errors = yes    
                    read only = no    
                    write only = no    
                    hosts allow = 192.168.1.2    
                    hosts deny = *    
                    list = false    
                    uid = root    
                    gid = root    
                    auth users = web1user    
                    secrets file = /etc/web1.pass


                   # echo "web1user:123" >> /etc/web1.pass(創建帳號密碼)    
                    #chmod -R 600 /etc/web1.pass

                (2)#vim /etc/rsyncd.conf(這個文件是需要自己創建)    
                    # Global Settings    
                    uid = nobody    
                    gid = nobody    
                    use chroot = no    
                    max connections = 10    
                    strict modes = yes    
                    pid file = /var/run/rsyncd.pid    
                    log file = /var/log/rsyncd.log

                    # Directory to be synced    
                    [web2]    
                    path = /web2/data    
                    ignore errors = yes    
                    read only = no    
                    write only = no    
                    hosts allow =192.168.1.3    
                    hosts deny = *    
                    list = false    
                    uid = root    
                    gid = root    
                    auth users = web2user    
                    secrets file = /etc/web2.pass


                    #echo "web2user:123" >> /etc/web2.pass    
                    #chmod -R 600 /etc/web2.pass


                (3)#vim /etc/rsyncd.conf(這個文件是需要自己創建)    
                    # Global Settings    
                    uid = nobody    
                    gid = nobody    
                    use chroot = no    
                    max connections = 10    
                    strict modes = yes    
                    pid file = /var/run/rsyncd.pid    
                    log file = /var/log/rsyncd.log

                    # Directory to be synced    
                    [web3]    
                    path = /web3/data    
                    ignore errors = yes    
                    read only = no    
                    write only = no    
                    hosts allow = 192。168.1.4    
                    hosts deny = *    
                    list = false    
                    uid = root    
                    gid = root    
                    auth users = web3user    
                    secrets file = /etc/web3.pass


                   # echo "web3user:123" >> /etc/web3.pass    
                    #chmod -R 600 /etc/web3.pass


            三個節點配置文件配置完成後,啓用#chkconfig rsync on && service xinetd start;    
            加入開機啓動echo  “/usr/local/bin/rsync --daemon” >>/etc/rc.local


        2、 配置內容發佈節點    
            配置內容發佈節點的主要工作是將生成的靜態網頁實時的同步到集羣中三個服務節點    
            #!/bin/bash    
            host1=192.168.1.2    
            host2=192.168.1.3    
            host3=192.168.1.4    
            src=/web/wwwroot/    
            dst1=web1    
            dst2=web2    
            dst3=web3    
            user1=web1user    
            user2=web3user    
            user3=web3user    
            /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib  $lj \    
            | while read files    
                    do    
                    /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@$host1::$dst1    
              /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user2@$host2::$dst2    
              /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user3@$host3::$dst3    
                            echo "${files} was rsynced" >>/tmp/rsync.log 2>&1    
                     done


          # echo "123" >> /etc/server.pass(這裏只需要密碼即可) 
         # chmod  -R 600 /etc/server.pass

            本相關解釋如下:    
            --timefmt:指定時間的輸出格式。    
            --format:指定變化文件的詳細信息。    
            這兩個參數一般配合使用,通過指定輸出格式,輸出類似與:    
            15/04/10 00:29 /web/wwwroot/ixdba.shDELETE,ISDIR was rsynced    
            15/04/10 00:30 /web/wwwroot/index.htmlMODIFY was rsynced    
            15/04/10 00:31 /web/wwwroot/pcre-8.02.tar.gzCREATE was rsynced    
            這個腳本的作用就是通過inotify監控文件目錄的變化,進而觸發rsync進行同步操作,由於這個過程是一種主動觸發操作,通過系統內核完成的,所以,比起那些遍歷整個目錄的掃描方式,效率要高很多。    
            有時會遇到這樣的情況:向inotify監控的目錄(這裏是/web/wwwroot/)寫入一個很大文件時,由於寫入這個大文件需要一段時間,    
            此時inotify就會持續不停的輸出該文件被更新的信息, 這樣就會持續不停的觸發rsync去執行同步操作,佔用了大量系統資源,那麼針對這種情況,最理想的做法是等待文件寫完後再去觸發rsync同步。    
            在這種情況下,可以修改inotify的監控事件,即:“-e close_write,delete,create,attrib”是指 “監聽 創建 移動 刪除 寫入 權限” 事件。    
            接着,將這個腳本命名爲inotifyrsync.sh,放到/web/wwwroot目錄下,然後給定可執行權限,放到後臺運行:    
            chmod 755 /web/wwwroot/inotifyrsync.sh    
            /web/wwwroot/inotifyrsync.sh &    
            最後,將此腳本加入系統自啓動文件:    
            echo  “/web/wwwroot/inotifyrsync.sh &”>>/etc/rc.local    

        3 測試rsync+inotify實時同步功能    
        所有配置完成後,可以在網頁發佈節點的/web/wwwroot目錄下添加、刪除或者修改某個文件,    
        然後到三個服務節點對應的目錄查看文件是否跟隨網頁發佈節點的/web/wwwroot目錄下文件發生變化,    
        如果你看到三個服務節點對應的目錄文件跟着內容發佈節點目錄文件同步變化,那麼我們這個系統就配置成功了。

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