sersync基于rsync+inotify實現數據實時同步

jopen 9年前發布 | 24K 次閱讀 sersync

 sersync基于rsync+inotify實現數據實時同步

前言

提到數據同步就必然會談到rsync,一般簡單的服務器數據傳輸會使用ftp/sftp等方式,但是這樣的方式效率不高,不支持差異化增量同步也不支持實時傳輸。針對數據實時同步需求大多數人會選擇rsync+inotify-tools的解決方案,但是這樣的方案也存在一些缺陷(文章中會具體指出),sersync是國人基于前兩者開發的工具,不僅保留了優點同時還強化了實時監控,文件過濾,簡化配置等功能,幫助用戶提高運行效率,節省時間和網絡資源。

可靠高效的數據實時同步方式

</blockquote>


更新歷史

2015年08月14日 - 更新GitHub源碼安裝包
2015年08月13日 - 初稿

閱讀原文 - http://wsgzao.github.io/post/sersync/

擴展閱讀

基于rsync+sersync的服務器文件同步實戰 - http://www.markdream.com/technologies/server/syncfile-by-rsync.shtml
通過 rsync sersync 實現高效的數據實時同步架構 - https://www.cnhzz.com/rsync_sersync/
Rsync+sersync實現數據實時同步 - http://www.cnblogs.com/wjoyxt/p/4581410.html
rsync - https://rsync.samba.org/
inotify-tools - https://github.com/rvoicilas/inotify-tools
sersync - http://code.google.com/p/sersync/


原理

Synchronize files and folders between servers -using inotiy and rsync with c++ 服務器實時同步文件,服務器鏡像解決方案

</blockquote>

sersync主要用于服務器同步,web鏡像等功能。基于boost1.43.0,inotify api,rsync command.開發。目前使用的比較多的同步解決方案是inotify-tools+rsync,另外一個是google開源項目Openduckbill(依賴于inotify- tools),這兩個都是基于腳本語言編寫的。相比較上面兩個項目,本項目優點是:

  1. sersync是使用c++編寫,而且對linux系統文件系統產生的臨時文件和重復的文件操作進行過濾(詳細見附錄,這個過濾腳本程序沒有實現),所以在結合rsync同步的時候,節省了運行時耗和網絡資源。因此更快。
  2. 相比較上面兩個項目,sersync配置起來很簡單,其中bin目錄下已經有基本上靜態編譯的2進制文件,配合bin目錄下的xml配置文件直接使用即可。
  3. 另外本項目相比較其他腳本開源項目,使用多線程進行同步,尤其在同步較大文件時,能夠保證多個服務器實時保持同步狀態。
  4. 本項目有出錯處理機制,通過失敗隊列對出錯的文件重新同步,如果仍舊失敗,則按設定時長對同步失敗的文件重新同步。
  5. 本項目自帶crontab功能,只需在xml配置文件中開啟,即可按您的要求,隔一段時間整體同步一次。無需再額外配置crontab功能。
  6. 本項目socket與http插件擴展,滿足您二次開發的需要。
  7. </ol>

    針對上圖的設計架構,這里做幾點說明,來幫助大家閱讀和理解該圖

    </blockquote>

    1 )線程組線程是等待線程隊列的守護線程,當事件隊列中有事件產生的時候,線程組守護線程就會逐個喚醒同步線程。當 隊列中 Inotify 事件較多的時候,同步線程就會被全部喚醒一起工作。這樣設計的目的是為了能夠同時處理多個 Inotify 事件,從而提升服務器的并發同步能力。同步線程的最佳數量=核數 x 2 + 2。
    2 ) 那么之所以稱之為線程組線程,是因為每個線程在工作的時候,會根據服務器上新寫入文件的數量去建立子線程,子線程可以保證所有的文件與各個服務器同時同步。當要同步的文件較大的時候,這樣的設計可以保證每個遠程服務器都可以同時獲得需要同步的文件。
    3 ) 服務線程的作用有三個:

    • 處理同步失敗的文件,將這些文件再次同步,對于再次同步失敗的文件會生成 rsync_fail_log.sh 腳本,記錄失敗的事件。
    • 每隔10個小時執行 rsync_fail_log.sh 腳本一次,同時清空腳本。
    • crontab功能,可以每隔一定時間,將所有路徑整體同步一次。
    • </ul>

      4 )過濾隊列的建立是為了過濾短時間內產生的重復的inotify信息,例如在刪除文件夾的時候,inotify就 會同時產生刪除文件夾里的文件與刪除文件夾的事件,通過過濾隊列,當刪除文件夾事件產生的時候,會將之前加入隊列的刪除文件的事件全部過濾掉,這樣只產生 一條刪除文件夾的事件,從而減輕了同步的負擔。同時對于修改文件的操作的時候,會產生臨時文件的重復操作。

      角色

      注意主從配置的區別,記得調整SELinux和防火墻

      </blockquote>

      iptables配置實踐 - http://wsgzao.github.io/post/iptables/
      LTMP手動編譯安裝以及全自動化部署實踐 - http://wsgzao.github.io/post/ltmp/

      1. 服務器A(主服務器)
      2. 服務器B(從服務器/備份服務器)
      3. rsync默認TCP端口為873
      4. </ol>

        服務器B

        #在服務器B上安裝rsync
        cd /app/local
        wget  http://rsync.samba.org/ftp/rsync/src/rsync-3.1.1.tar.gz
        tar zxf rsync-3.1.1.tar.gz
        cd rsync-3.1.1
        ./configure
        make && make install

        設置rsync的配置文件

        vi /etc/rsyncd.conf

        服務器B上的rsyncd.conf文件內容

        uid=root gid=root

        最大連接數

        max connections=36000

        默認為true,修改為no,增加對目錄文件軟連接的備份

        use chroot=no

        定義日志存放位置

        log file=/var/log/rsyncd.log

        忽略無關錯誤

        ignore errors = yes

        設置rsync服務端文件為讀寫權限

        read only = no

        認證的用戶名與系統帳戶無關在認證文件做配置,如果沒有這行則表明是匿名

        auth users = rsync

        密碼認證文件,格式(虛擬用戶名:密碼)

        secrets file = /etc/rsync.pass

        這里是認證的模塊名,在client端需要指定,可以設置多個模塊和路徑

        [rsync]

        自定義注釋

        comment = rsync

        同步到B服務器的文件存放的路徑

        path=/app/data/site/ [img] comment = img path=/app/data/site/img

        創建rsync認證文件 可以設置多個,每行一個用戶名:密碼,注意中間以“:”分割

        echo "rsync:rsync" > /etc/rsync.pass

        設置文件所有者讀取、寫入權限

        chmod 600 /etc/rsyncd.conf
        chmod 600 /etc/rsync.pass

        啟動服務器B上的rsync服務

        rsync --daemon -v

        rsync --daemon

        監聽端口873

        netstat -an | grep 873 lsof -i tcp:873

        COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsync 31445 root 4u IPv4 443872 0t0 TCP :rsync (LISTEN) rsync 31445 root 5u IPv6 443873 0t0 TCP :rsync (LISTEN)

        設置rsync為服務啟動項(可選)

        echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local

        要 Kill rsync 進程,不要用 kill -HUP {PID} 的方式重啟進程,以下3種方式任選

        ps -ef|grep rsync|grep -v grep|awk '{print $2}'|xargs kill -9

        cat /var/run/rsyncd.pid | xargs kill -9

        pkill rsync

        再次啟動

        /usr/local/bin/rsync --daemon</pre>

        服務器A

        #安裝rsync
        cd /app/local
        wget  http://rsync.samba.org/ftp/rsync/src/rsync-3.1.1.tar.gz
        tar zxf rsync-3.1.1.tar.gz
        cd rsync-3.1.1
        ./configure
        make && make install

        安裝inotify-tools

        cd /app/local wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz tar zxf inotify-tools-3.14.tar.gz cd inotify-tools-3.14 ./configure --prefix=/app/local/inotify make && make install

        安裝sersync

        cd /app/local wget https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz tar zxf sersync2.5.4_64bit_binary_stable_final.tar.gz mv /app/local/GNU-Linux-x86/ /app/local/sersync cd /app/local/sersync

        配置下密碼文件,因為這個密碼是要訪問服務器B需要的密碼和上面服務器B的密碼必須一致

        echo "rsync" > /app/local/sersync/user.pass

        修改權限

        chmod 600 /app/local/sersync/user.pass

        修改confxml.conf

        vi /app/local/sersync/confxml.xml</pre>

        <?xml version="1.0" encoding="ISO-8859-1"?>
        <head version="2.5">
         <host hostip="localhost" port="8008"></host>
         <debug start="true"/>
         <fileSystem xfs="false"/>
         <filter start="false">
         <exclude expression="(.).php"></exclude>
         <exclude expression="^data/"></exclude>
         </filter>
         <inotify>
         <delete start="true"/>
         <createFolder start="true"/>
         <createFile start="false"/>
         <closeWrite start="true"/>
         <moveFrom start="true"/>
         <moveTo start="true"/>
         <attrib start="false"/>
         <modify start="false"/>
         </inotify>

        <sersync> <localpath watch="/home/"> <!-- 這里填寫服務器A要同步的文件夾路徑--> <remote ip="8.8.8.8" name="rsync"/> <!-- 這里填寫服務器B的IP地址和模塊名--> <!--<remote ip="192.168.28.39" name="tongbu"/>--> <!--<remote ip="192.168.28.40" name="tongbu"/>--> </localpath> <rsync> <commonParams params="-artuz"/> <auth start="true" users="rsync" passwordfile="/app/local/sersync/user.pass"/> <!-- rsync+密碼文件 這里填寫服務器B的認證信息--> <userDefinedPort start="false" port="874"/><!-- port=874 --> <timeout start="false" time="100"/><!-- timeout=100 --> <ssh start="false"/> </rsync> <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--><!-- 修改失敗日志記錄(可選)--> <crontab start="false" schedule="600"><!--600mins--> <crontabfilter start="false"> <exclude expression=".php"></exclude> <exclude expression="info/"></exclude> </crontabfilter> </crontab> <plugin start="false" name="command"/> </sersync>

        <!-- 下面這些有關于插件你可以忽略了 --> <plugin name="command"> <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix--> <filter start="false"> <include expression="(.).php"/> <include expression="(.).sh"/> </filter> </plugin>

        <plugin name="socket"> <localpath watch="/home/demo"> <deshost ip="210.36.158.xxx" port="8009"/> </localpath> </plugin> <plugin name="refreshCDN"> <localpath watch="/data0/htdocs/cdn.markdream.com/site/"> <cdninfo domainname="cdn.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> <sendurl base="; <regexurl regex="false" match="cdn.markdream.com/site([/a-zA-Z0-9]*).cdn.markdream.com/images"/> </localpath> </plugin> </head></pre>

        #運行sersync
        nohup /app/local/sersync/sersync2 -r -d -o /app/local/sersync/confxml.xml >/app/local/sersync/rsync.log 2>&1 &
        nohup /app/local/sersync/sersync2 -r -d -o /app/local/sersync/img.xml >/app/local/sersync/img.log 2>&1 &

        -d:啟用守護進程模式 -r:在監控前,將監控目錄與遠程主機用rsync命令推送一遍 -n: 指定開啟守護線程的數量,默認為10個 -o:指定配置文件,默認使用confxml.xml文件</pre>

        GitHub源碼倉庫

        file://E:\sersync   (0 folders, 3 files, 1.88 MB, 1.88 MB in total.)
            inotify-tools-3.14.tar.gz 350.36 KB
            rsync-3.1.1.tar.gz    869.26 KB
            sersync2.5.4_64bit_binary_stable_final.tar.gz 710.24 KB

        sersync -
        https://github.com/wsgzao/sersync

        來自:http://wsgzao.github.io/post/sersync/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!