rsync+inotify 實現數據實時同步

    Rsync (Rmote sync)是一款非常好的數據同步工具,能夠通過對比同步雙方的數據變動,實現增量同步,還可以通過LAN/WAN實現遠程多臺主機間文件的同步,還能結合crond任務計劃來執行自動備份,又可以結合ssh實現遠程數據備份的安全,種種特性使他看起來相當優秀。但如果需備份數據十分龐大時,它的不足之處就顯現出來了,比如每次執行同步操作時,rsync都會掃描全部數據進而計算出增量部分,而后再同步增量數據,這將會十分耗時,使其變得低效;并且受限于crond計劃任務最小時間間隔為一分鐘,會導致同步源端和目的段數據不一致,這在高可用環境中是不被允許的。這個時候我們就可以構建Rsync+Inotify架構來解決此應用瓶頸。

    一、實驗拓撲

      blob.png

    二、實驗環境  

      (1)、實驗平臺

         VMware Workstation 10

      (2)、實驗主機以及系統環境

         主機Rclient:

           IP地址:192.168.2.204 啟用rsync客戶端,安裝Inotify-tools

           系統環境:CentOS-6.5-x86_64

         主機Rserver1:

           IP地址:192.168.2.205 啟用rsync服務器功能

           系統環境:CentOS-6.5-x86_64

         主機Rserver2:

           IP地址:192.168.2.205 啟用rsync服務器功能

           系統環境:CentOS-6.5-x86_64

    三、實驗所需軟件以及版本

      blob.png

    四、實驗目的

      主機Rclient創建有/data/{tom,jerry}非空目錄并擔任rsync客戶端角色并且結合inotify-tools工具;Rserver1和Rserver2主機分別創建有/data/test1和/data/test2擔任rsync服務器端角色本實驗旨在驗證當主機Rclient的/data/{tom,jerry}目錄內內容發生變化時能夠實時同步到服務器端的同/data/test1和/data/test1目錄中。

    五、rsync

      1、rsync特性

          (1)、可以鏡像備份整個目錄樹或者文件系統。

          (2)、可以借助于rcp(remote file copy)、rsh(remote shell)、ssh(secure shell)傳輸文件,又可以通過sockets直接連接傳輸。

          (3)、基于增量備份機制,有較高的同步效率。

          (4)、支持匿名和認證的進程模式傳輸,方便數據傳輸與鏡像。

          (5)、可以指定排除同步部分目錄或文件。

          (6)、支持拷貝設備文件、鏈接等特殊文件。

          (7)、文件或目錄的拷貝可以保留其權限、時間戳、軟硬鏈接等所有屬性。

      2、rsync工作模式(工作模式演示示例在主機Rclient上進行)

        (1)、在了解rsync工作模式之前,我們先安裝rsync,有兩種方式,在此只演示編譯安裝,實驗過程使用yum安裝版本

           第一種,yum方式自動安裝

           # yum -y install rsync   \\安裝rsync

           # yum -y install xinetd  \\由于rsync是瞬時守護進程,因此安裝xinetd超級守護進程代為管理

           # chkconfig xinetd on   \\設置超級守護進程開機啟動 

           # service xinetd start  \\啟動超級守護進程

           # chkconfig rsync on    \\啟動rsync

           blob.png

           rsync安裝并啟動完成

           第二種,編譯安裝

           注:本次編譯安裝源碼存放目錄為/root

           # tar -xf rsync-3.1.1.tar.gz \\展開源文件

           # cd rsync-3.1.1             \\進入到源文件目錄

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

           # make && make install 

           導出環境變量

           # vim /etc/profile.d/rsync.sh

           blob.png

           注意,默認編譯安裝的版本xinetd超級進程是不支持管理的我們要修改其相應配置文件

           # vim /etc/xinetd.d/rsync 

           blob.png

            

        (1)、列表模式,功能類似于ls命令,但rsync的列表模式可以列出遠程文件

           rsync列出文件,跟ls有所不同我們可以驗證一下,事先創建測試文件

           # touch /data/tom/{a,b,c,d}

           # ll /data/tom

           blob.png

           我們看到,ll后面跟的參數如果是目錄的話,最末尾帶不帶/沒有影響,我們再看看rsync

           blob.png

           并且,rysnc不能在當前文件夾直接使用,會報錯,后面必須跟參數,而ll則不同,看下圖

           blob.png

           blob.png   

           還可以列出遠程文件目錄(本文事先已將Rserver2主機/etc/inittab文件拷貝至其/data/test2中)

           blob.png

           小結:

             1、rsync列表模式,后面參數為目錄并且/結尾,則列出該目錄以及目錄中的所有文件;否則,只列出目錄本身 

             2、rsync列表模式中,rsync命令后面必須跟參數,直接在當前目錄下列出當前目錄會報錯。

        (2)、shell模式

          shell即本地模式,可實現在本機磁盤進行數據同步,不過不同于copy,rsync可以搭配起選項來擴展其功能。

          語法:

          rsync [option]…SRC [SRC]…DEST [DEST]

          option是rsync能夠使用的選項,如下

            -n : 同步測試,不執行同步    

            -v :  –verbose,詳細輸出模式,顯示詳細過程    

            -q : –quiet,靜默模式,盡可能輸出少的信息    

            -c : –checksum,可以對傳輸的文件進行較驗的,強制對文件傳輸進行校驗    

            -r  : –recursive,遞歸復制    

            -p : –perms,保存文件的權限    

            -t  : –times,保留文件的時間戳    

            -l  : –links,保留文件的符號鏈接    

            -g : –group,保留文件的屬組    

            -o : –owner,保留文件的屬主    

            -D : –devices,保留設備文件

            -A : –acls,保留acl訪問控制列表

            -a : –archives歸檔,復制時可以保存原有的屬主屬主等屬性信息,甚至包括一點額外的屬性。等同于-rlptgoD    

            -e SSH : 遠程復制時,表示使用ssh協議作承載。如果ssh端口不是22,可以用-e ‘ssh -p 22’    

            -z : 基于網絡時使用,對文件壓縮后傳輸   

            –progress : 顯示壓縮進度條的,簡寫-P   

            –stats : 顯示如何執行壓縮和傳輸的,也就是顯示傳輸狀態的

          [SRC]  需要拷貝的分區,文件或目錄

          [DEST] 目的分區或目錄

          如果沒有源或目的分區或目錄,即時列表模式

          小結:

           1、使用該模式,要特別留意拷貝的源目錄的末尾是否有/,若果有則是拷貝目錄下所有文件到目標而不會拷貝目錄本身,如果沒有則會將目錄本身以及其內所有文件拷貝到目標。

           

       (3)、遠程shell模式

          遠程shell模式與本地shell模式類似,只是需要指定另外一臺主機的ip地址,該模式中需要手動輸入驗證用戶的密碼,一般為系統用戶。該模式有兩種使用方式

              拉取 rsync [option] …[USER]@HOST:SRC DEST  //拉取模式既是從遠程主機拉取文件到本地目錄

              推送 rsync [option]…SRC [USER]@HOST:DEST   //推送模式即時將本地文件推送至遠程主機目錄中

          示例:將本機/data/tom/*推送至Rserver主機的/data/test1/中

          # rsync -avz –progress -e 'ssh -p 22' /data/test1/ 192.168.1.205:/data/test1

          blob.png

          將主機Rserver2 /data/test2/inittab 文件拉取到本地/data/jerry/中

          # rsync -avz –progress -e 'ssh -p 22' 192.168.1.206:/data/test2/inittab /data/jerry/

          blob.png

          小結:

           1、本例中使用安全文件傳輸,借助與ssh通道,使用系統用戶驗證。

           2、注意,本模式下,本地端和遠程主機端都必須安裝rsync軟件。

       (4)、服務模式(daemon mode)

          服務模式下,rsync以服務進程形式監聽與TCP 873端口,接受客戶端的匿名或者認證請求進行文件備份或者恢復,本模式依賴于配置文件/etc/rsync.conf(該配置文件默認不存在,需手動創建,后述)啟動服務進程,依賴于/etc/rsync.passwd文件實現認證。   

      3、配置rsync服務模式并驗證

       (1)、在主機Rserver1上進行服務器配置

        創建/etc/rsync.conf配置文件          

        # vim /etc/rsyncd.conf

          # Global setting

        uid = root   //rsync同步共享用戶的身份(如在模塊中定義則覆蓋全局定義)

        gid = root  //rsync同步共享用戶組的身份(如在模塊中定義則覆蓋全局定義)

        use chroot = no //不使用chroot

        port = 873    //定義監聽端口默認873,使用873端口時此項可以省略

        max connections =200  //服務器最大并發數

        timeout = 300       //會話超時時長

        pid file = /var/run/rsyncd.pid  //pid文件存放路徑

        lock file = /var/run/rsyncd.lock //lock文件存放路徑,服務啟動停止時會用到

        log file = /var/log/rsyncd.log  //日志文件存放路徑

        log format = %h %o %l %b      //日志記錄格式

        motd file = /etc/rsyncd.motd    //登陸提示信息

        ignore errors             //忽略錯誤信息

        read only = false          //是否允許用戶上傳文件,默認為true 

        list = false             //是否允許用戶列出文件,默認為true 

        write only = false         //是否允許

        hosts allow = 192.168.2.0/24  //允許哪些主機訪問

        hosts deny = *           //拒絕哪些主機訪問

        auth users = test          //同步時認證所需的用戶

        secrets file = /etc/rsyncd.passwd //認證時所需的密碼文件

        #Directory to be synced   

        [test1]   //模塊名稱,客戶端需精確指定該模塊名稱

        path = /data/test1 //模塊對應的目錄路徑

        創建認證文件/etc/rsyncd.passwd

         # vim /etc/rsyncd.passwd

          test:123456  //用戶名和密碼格式,存放方式明文。

        修改密碼文件權限,僅使屬主有權限

         # chmod 600 /etc/rsyncd.passwd

        確認模塊中path定義的目錄的屬組屬主與/etc/rsyncd.conf文件中定義的一致

         blob.png

        創建登陸提示信息文件(此步默認為空,并且生產環境不建議使用)

         # vim /etc/rsyncd.motd

         blob.png 

        啟動服務

         由于rsync為瞬時進程,需超級進程xinetd管理,確保xinetd安裝并啟動

         # chkconfig xinetd on

         # chkconfig rsync on 

         # chkconfig –list | grep rsync    

         blob.png   

         873端口已監聽,服務成功啟動    

         blob.png             

         小結: 

           一、在配置文件/etc/rsyncd.conf中部分選項在全局和模塊下均可做配置,例如ignore errors,read only,write only,hosts allow,hosts deny,auth users,secrets file,exclude,pre-xfer exec,post-xfer exec等,全局配置中的選項對所有模塊有效;模塊下定義的僅對當前模塊有效;另外,模塊中定義選項值優先于全局配置。

           二、模塊中定義的共享目錄的屬主、數組必須與配置文件中的uid、gid一致,否則要修改。

           三、認證時用到的密碼文件屬組和其它不能有權限,否則要更改。

       (2)、服務器主機Rserver2主機配置主機Rserver1,此處不再贅述。

       (3)、在客戶端主機上創建密碼文件,使其能認證連接到rsync服務器

         # vim /etc/rsyncd.passwd

           123456

         小結: 

          1、客戶端的密碼文件中,只填寫密碼即可。

       (4)、示例

         同樣有兩種方式,推送和拉取,不過在該模式中,這兩種方式又分別有兩種不同的格式

         將客戶端中的/data/tom目錄內的文件推送至服務器Rserver1的/data/test1中

         推送:(在主機Rserver1測試模塊對應路徑/data/test1;認證信息:test:123456)

         格式1:

         # rsync -avz –password-file=/etc/rsyncd.passwd /data/tom/ test@192.168.2.205::test1 

         blob.png

         格式2:測試時,請將格式1已同步過去的文件手動清空

         # rsync -avz –password-file=/etc/rsyncd.passwd –progress /data/tom/ rsync://test@192.168.2.205:/data/test1/

         blob.png

         拉?。海ㄔ谥鳈CRserver2上進行,模塊路徑為/data/test2,該路徑中事先存有inittab文件)

         格式1:

         # rsync -avz –progress –password-file=/etc/rsyncd.passwd test@192.168.2.206::test2 /data/jerry/

         格式2:

         # rsync -avz –progress –password-file=/etc/rsyncd.passwd rsync://test@192.168.2.206:/test2 /data/jerry

         

    六、inotify-tools

      1、inotify

        (1)、 inotify,linux內核版本2.6.13以及更新版本支持,提供強大的文件系統監控,通過打開一個獨立的文件描述符并以此監控一個或則多個文件的打開、關閉、移動/重命名、刪除創建或者改變屬性的事件。由于notify是內核功能,因此需要使用時,需要通過其接口程序inotify-tools接口程序調取使用。

        (2)、inotify可調用函數

           inotify_init    //創建inotify實例系統調用,返回指向該實例文件描述符

           inotify_init1   //帶有附帶標志的描述符生成

           inotify_add_watch //增加對文件或目錄的監控,并指定監控時間 

           inotify_rm_wacth  //移除制定監控項目

           read  //讀取包含事件信息的緩存

           close //關閉文件描述符,移除此描述符上所有監控,當實例所有描述符關閉,將釋放資源和下層對象。

        (3)、監控程序創建流程

           1、使用inotify_init創建實例并生成文件描述符

           2、添加監控

           3、等待事件

           4、處理事件,完成后繼續等待事件

           5、監控不在活動或者受到關閉信號時,關閉描述符,清空相關信息,退出。

        (4)、inotify可監控事件

           IN_ACCESS  被監控項目或者目錄中文件被訪問過。

           IN_MODIFY  被監控項目或者目錄文件被修改過

           IN_ATTRIB  被監控項目或者目錄文件的元數據被修改過

           IN_CLOSE_WAITE 一個打開的等待修改的文件或目錄被關閉

           IN_CLOSE_NOWRITE 一個以只讀方式打開的文件或目錄被關閉

           IN_CLOSE   包含上兩個事件

           IN_OPEN    文件或目錄被打開

           IN_MOVED_FROM 被監控項目或目錄中的文件被移除監控區域,該事件包含于IN_MOVED_TO關聯的cookie

           IN_MONED_TO   項目或者目錄被移進監控區域

           IN_MOVE    包含上兩個事件

           IN_CREATE  在監控區域中新建目錄或文件

           IN_DELETE  在監控區域中刪除目錄或文件

           IN_DELETE_SELF 監控項目本身被刪除,監控中止并收到IN_IGNORED事件

           IN_MOVE_SELF   監控項目本身被移動

      2、inotify-tools

        (1)、inotify-tools是基于linux平臺為inotify的提供的C語言開發的接口工具,并提供一系列命令行工具并利用這些工具監控文件系統的事件。

        (2)、inotify-tools安裝流程

           檢查安裝環境,確認系統支持             

           blob.png //內核支持

           查看內核inotify參數

           blob.png

             1、/proc/sys/fs/inotify/max_queued_events

               該參數值是調用inotify_init時分配給實例的event隊列最大值,超出該值的event被丟棄,并觸發IN_Q_OVERFLOW事件。默認值:16384

               注意,該參數定義的是events隊列長度,若文件龐大且變化頻繁需調整該值以適應監控。

             2、/proc/sys/fs/inotify/max_user_instances

               該參數值定義了用戶創建inotify實例的上限。默認值:128

             3、/proc/sys/fs/inotify/max_user_watches

               該參數定義了每個inotify示例可監控的最大目錄數,如果監控文件龐大需調大該值。默認值:8192

            參數調整示例:

               可使用重定向方式修改   

               echo 10000000 > /proc/sys/fs/inotify/max_user_watches

        (3)、安裝inotify-tools(編譯安裝源文件放在/root下,工作目錄/root)

             # tar -xf inotify-tools-3.13.tar.gz

             # cd inotify-tools-3.13

             # ./configure

             # make && make install 

             這樣就編譯安裝完成了,并在/usr/local/bin/生成下面兩個可執行文件

             # ll /usr/local/bin/inotify*

            -rwxr-xr-x 1 root root 38582 Jul 17 03:32 /usr/local/bin/inotifywait

               該文件執行阻塞,等待inotify事件,用以監控文件和目錄或監控整個目錄樹(可遞歸監控),還可以結合shell腳本實現高級功能。

            -rwxr-xr-x 1 root root 40353 Jul 17 03:32 /usr/local/bin/inotifywatch

               該文件收集inotify的統計數據,包括事件類型以及同一事件發生的次數

       (4)、inotifywait和inotifywatch用法

            inotifywait [-hcmrq] [-e <event> ] [-t <seconds> ] [–format <fmt> ] [–timefmt <fmt>  

         參數

            -h,–help     //輸出幫助信息 

            @          //排除不需要監視的文件,可以是相對路徑,也可以是絕對路徑 

            –fromfile    //從文件讀取需要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭 

            -m,–monitor   //接收到一個事情而不退出,無限期地執行。默認行為是接收到一個事情后立即退出 

            -d,–daemon    //跟–monitor一樣,除了是在后臺運行,需要指定 –outfile把事情輸出到一個文件。也意味著使用了–syslog 

            -o,–outfile    //輸出事情到一個文件而不是標準輸出。 

            -s,–syslog    //輸出錯誤信息到系統日志 

            -r,–recursive  //監視一個目錄下的所有子目錄。 

            -q,–quiet     //指定一次,不會輸出詳細信息,指定二次,除了致命錯誤,不會輸出任何信息。 

            –exclude      //正則匹配需要排除的文件,大小寫敏感。 

            –excludei     //正則匹配需要排除的文件,忽略大小寫。 

            -t,–timeout#  //設置超時時間,如果為0,則無限期地執行下去。 

            -e,–event    //指定監視的事件。 

            -c,–csv      //輸出csv格式。 

            –timefmt     //指定時間格式,用于–format選項中的%T格式。 

            –format      //指定輸出格式。 

               %w 表示發生事件的目錄 

               %f 表示發生事件的文件 

               %e 表示發生的事件 

               %Xe 事件以“X”分隔 

               %T 使用由–timefmt定義的時間格式

           可監聽的事件:

            access

             文件讀取

            modify

             文件更改。

            attrib

             文件屬性更改,如權限,時間戳等。 

            close_write

             以可寫模式打開的文件被關閉,不代表此文件一定已經寫入數據。 

            close_nowrite

             以只讀模式打開的文件被關閉。 

            close

             文件被關閉,不管它是如何打開的。 

            open

             文件打開。 

            moved_to

             一個文件或目錄移動到監聽的目錄,即使是在同一目錄內移動,此事件也觸發。 

            moved_from

             一個文件或目錄移出監聽的目錄,即使是在同一目錄內移動,此事件也觸發。 

            move

             包括moved_to和 moved_from 

            move_self

             文件或目錄被移除,之后不再監聽此文件或目錄。 

            create

             文件或目錄創建 

            delete

             文件或目錄刪除

            delete_self

             文件或目錄移除,之后不再監聽此文件或目錄

            unmount

             文件系統取消掛載,之后不再監聽此文件系統。

         inotifywatch [-hvzrqf] [-e <event> ] [-t <seconds> ] [-a <event> ] [-d <event> ] <file> [ … ]       

            參數

            -h,–help    # 輸出幫助信息 

            -v,–verbose  # 輸出詳細信息 

            @          # 排除不需要監視的文件,可以是相對路徑,也可以是絕對路徑。 

            –fromfile    # 從文件讀取需要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。 

            -z,–zero    # 輸出表格的行和列,即使元素為空 

            –exclude     # 正則匹配需要排除的文件,大小寫敏感。 

            –excludei    # 正則匹配需要排除的文件,忽略大小寫。 

            -r,–recursive # 監視一個目錄下的所有子目錄。 

            -t,–timeout  # 設置超時時間 

            -e,–event    # 只監聽指定的事件。 

            -a,–ascending # 以指定事件升序排列。 

            -d,–descending# 以指定事件降序排列

    七、搭建rsync+inotify架構,實現實時同步

     1、上文中rsync客戶端和服務器端已經配置完畢。

     2、在rsync客戶端主機配置自動實時同步

       (1)、創建自動實時同步腳本

        blob.png

       (3)、賦予腳本可執行權限

         # chmod +x /usr/sbin/auto_synced.sh    

       (3)將該腳本添加到rc.local中使其能開機運行

         # vim /etc/rc.local

         blob.png

       (4)、啟動腳本程序

         # bash /usr/sbin/auto_rsynced.sh &>> /var/log/auto_rsynced.log &

     3、測試同步效果     

       (1)、在客戶端/data/tom/目錄下,創建10個.txt文件

         # for i in {1..10}; do dd if=/dev/zero of=/data/tom/$i.txt bs=10M count=1; done 

         blob.png

         查看完整時間屬性

         blob.png

         在同步服務器端查看同步后的文件屬性

         blob.png

         可以看到實時同步效果還是很不錯的。

               

       

                     

        

    

原創文章,作者:Silently,如若轉載,請注明出處:http://www.www58058.com/6318

(0)
SilentlySilently
上一篇 2015-07-24
下一篇 2015-07-24

相關推薦

  • 馬哥教育網絡21期+第七周練習博客

    馬哥教育網絡21期+第七周練習博客 1、創建一個10G分區,并格式為ext4文件系統; 首先掛載一個新的硬盤使用fdisk /dev/sdb進入相應的磁盤空間劃分一個10G的磁盤空間; Command (m for help): n Command action    …

    Linux干貨 2016-08-22
  • N_28 linux基礎知識

    1.計算機的組成
    2.linux的各發行版
    3.linux的哲學思想
    4.一些linux的基本命令
    5.幫助信息
    6.FHS

    2017-12-01
  • 集中練習6-bash腳本

    集中練習6-bash腳本

    Linux干貨 2017-12-05
  • CA服務器的搭建以及證書簽署、dropbear的編譯安裝

    CA服務器的搭建以及證書簽署、dropbear的編譯安裝 一、CA Server和Client: 1、CA server:創建私鑰CA (1)   openssl的配置文件:/etc/pki/tls/openssl.conf   如果Client端的申請是來自不同的國家,則需要將下圖中紅色框內的三項,由“match”改為“opt…

    Linux干貨 2016-09-23
  • class15磁盤管理(二) 高級磁盤管理(一)

    掛載點和/etc/fstab 配置文件系統體系 被mount、fsck和其它程序使用 系統重啟時保留文件系統體系 可以在設備欄使用文件系統卷標 使用mount -a命令掛載  /etc/fstab 中的所有文件系統 文件掛載配置文件 /etc/fstab每行定義一個要掛載的文件系統;   &nbsp…

    Linux干貨 2016-09-05
  • linux文件系統上的權限

    文件系統上的權限是指文件系統上的文件和目錄的權限,主要針對三類對象進行的(訪問者)進行的定義: 針對文件來說 r 使用工具cat nano去看文件里面內容的權限 w 可以修改文件的內容 x 二進制程序以及腳本需要發起系統調用,去啟動為一個進程 針對目錄來說 r 是否可以查看目錄里面的內容 有r權限的話 可以使用ls -l w 對目錄里面是否可以創建文件或者目…

    Linux干貨 2017-04-01
欧美性久久久久