Sersync+Rsync實現服務器數據實時同步及xml高級配置!

Rsync介紹與詳解http://fdgui.blog.51cto.com/3484207/1408780

 

什麼是sersync?

sersync主要用於服務器同步,web鏡像等功能。基於boost1.43.0,inotify api,rsync command.開發。目前使用的比較多的同步解決方案是inotify-tools+rsync ,另外一個是google開源項目Openduckbill(依賴於inotify- tools),這兩個都是基於腳本語言編寫的。相比較上面兩個項目,本項目優點是: 
sersync是使用c++編寫,而且對linux系統文件系統產生的臨時文件和重複的文件操作進行過濾,所以在結合rsync同步的時候,節省了運行時耗和網絡資源。因此更快。

單純使用rsync和使用serync+rsync的區別:

使用rsync+crontab做定時同步時,主服務器端開啓rsync守護進程,而鏡像服務器是運行rsync客戶端,平時一般會利用crontab定時獲取rsync服務器上的數據。 
但使用rsync+sersync做實時同步時,用於推送文件的服務器運行sersync服務,用於接收文件的服務器則運行rsync守護進程,簡單來說就是sersync會利用rsync命令將文件推送到rsync服務器,實際線上使用一般會把sersync作爲主服務器,rsync作爲鏡像服務器,實現數據同步備份,web鏡像等功能。

前提條件:
在使用sersync之前,我們必須安裝配置好rsync服務器。這裏我們需要注意的是,純粹的使用rsync做單向同步時,rsync的守護進程是運行在文件推送的服務器上,而接收的服務器是運行rsync客戶端。使用sersync做文件實時同步剛好相反,用於接收文件的服務器運行rsync守護進程。

一、安裝sersync:

下載地址:https://code.google.com/p/sersync/downloads/list

[root@master src]#ls
sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@master src]#tar xzf sersync2.5.4_64bit_binary_stable_final.tar.gz 
[root@master src]#ls
GNU-Linux-x86 sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@master src]#cd GNU-Linux-x86/
[root@master GNU-Linux-x86]#ll
total 1776
-rwxr-xr-x 1 root root    2214 Oct 26  2011 confxml.xml
-rwxr-xr-x 1 root root 1810128 Oct 26  2011 sersync2

爲了方面使用,我們把它COPY到:
[root@master GNU-Linux-x86]#mkdir /usr/local/sersync
[root@master GNU-Linux-x86]#mv * /usr/local/sersync/


二、基本配置:

2.1 創建密碼文件:

[root@master GNU-Linux-x86]#cd /usr/local/sersync/
[root@master sersync]#echo "password123" > rsync.passwd
[root@master sersync]#chmod 600 rsync.passwd 

2.2 編輯主配置文件:

以下紅色部分爲我修改的

[root@master sersync]#vi confxml.xml

<?xml version="1.0" encoding="ISO-8859-1"?> 
<head version="2.5"> 
    <host hostip="localhost" port="8008"></host> 
    <debug start="false"/> 
    <fileSystem xfs="false"/>

<!--監控事件的過程中過濾特定文件,和特定文件夾的文件 --> 
<filter start="true"> 
        <exclude expression="(.*)\.html"></exclude> 
        <exclude expression="(.*)\.php"></exclude>

        <exclude expression="(.*)\.jpg"></exclude>

        <exclude expression="(.*)\.gif"></exclude>

        <exclude expression="(.*)\.png"></exclude>

        <exclude expression="(.*)\.css"></exclude>

        <exclude expression="(.*)\.js"></exclude> 

        <exclude expression="^tmp/*"></exclude> 
    </filter>

<!--設置要監控的事件 --> 
    <inotify> 
        <delete start="true"/> 
        <createFolder start="true"/> 
<createFile start="true"/>
        <closeWrite start="true"/> 
        <moveFrom start="true"/> 
        <moveTo start="true"/> 
        <attrib start="false"/> 
<modify start="true"/>
    </inotify>

    <sersync>

  <!--設定監控目錄--> 
<localpath watch="/var/www/html">

  <!--指定遠端rsync的地址和模塊名-->

<remote ip="192.168.204.129" name="webhome"/> 
            <!--<remote ip="192.168.204.128" name="tongbu"/>--> 
            <!--<remote ip="192.168.8.40" name="tongbu"/>--> 
        </localpath>

    <rsync> 
        <commonParams params="-artuz"/>

      <!--是否啓用驗證,並指定密碼存放文件 --> 
<auth start="true" users="apache" passwordfile="/usr/local/sersync/rsync.passwd" /> 
        <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—>

  <!--是否啓用執行完整rsync,並指定執行週期 -->     
<crontab start="true" schedule="1200"><!--600mins--> 
        <crontabfilter start="true"> 

        <exclude expression="(.*)\.html"></exclude> 
        <exclude expression="(.*)\.php"></exclude>

        <exclude expression="(.*)\.jpg"></exclude>

        <exclude expression="(.*)\.gif"></exclude>

        <exclude expression="(.*)\.png"></exclude>

        <exclude expression="(.*)\.css"></exclude>

        <exclude expression="(.*)\.js"></exclude> 

        <exclude expression="^tmp/*"></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="/opt/tongbu"> 
            <deshost ip="192.168.138.20" port="8009"/> 
        </localpath> 
    </plugin> 
    <plugin name="refreshCDN"> 
        <localpath watch="/data0/htdocs/cms.xoyo.com/site/"> 
            <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> 
            <sendurl base="http://pic.xoyo.com/cms"/
            <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/> 
        </localpath> 
    </plugin> 
</head>


三、啓用同步功能:

再次強調,所有sersync客戶端都需要安裝rsync,並啓動爲服務。在上述配置文件中須將所有需要同步的客戶端IP加入。

使用如下命令進行初始化同步,並監視指定目錄變化情況:

[root@master sersync]#./sersync2 -r
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -r rsync all the local files to the remote servers before the sersync work
daemon thread num: 10
parse xml config file
host ip : localhost host port: 8008
will ignore the inotify createFile event 
Start the crontab Every 600 minutes rsync all the files to the remote servers entirely
開啓crontab過濾功能: 作整體同步的時候會對如下文件進行過濾
*.php
info/*
use rsync password-file :
user is client
passwordfile is /usr/local/sersync/rsync.passwd
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) 
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /var/www/html && rsync -artuz -R --delete ./ [email protected]::webhome --password-file=/usr/local/sersync/rsync.passwd --exclude="*.php" --exclude="info/*" >/dev/null 2>&1 
run the sersync: 
watch path is: /var/www/html

Tip:如果需要將sersync運行前,已經存在的所有文件或目錄全部同步到遠程,要以-r參數運行sersync,將本地與遠程整體同步一次。
如果設置了過濾器,即在xml文件中,filter爲true,則暫時不能使用-r參數進行整體同步。-r參數將會無效。

相關參數:

參數-d:啓用守護進程模式
參數-r:在監控前,將監控目錄與遠程主機用rsync命令推送一遍
c參數-n: 指定開啓守護線程的數量,默認爲10個
參數-o:指定配置文件,默認使用confxml.xml文件
參數-m:單獨啓用其他模塊,使用 -m refreshCDN 開啓刷新CDN模塊
參數-m:單獨啓用其他模塊,使用 -m socket 開啓socket模塊
參數-m:單獨啓用其他模塊,使用 -m http 開啓http模塊
不加-m參數,則默認執行同步程序

可選功能與xml高級配置


<host hostip="localhost" port="8008"></host>
hostip與port是針對插件的保留字段,對於同步功能沒有任何作用,保留默認即可。

filter文件過濾功能
對於sersync監控的文件,會默認過濾系統的臨時文件(以“.”開頭,以“~”結尾),除了這些文件外,可以自定義其他需要過濾的文件。
<filter start="true">
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
</filter>
將start設置爲 true,在exclude標籤中,填寫正則表達式,默認給出兩個例子分別是過濾以”.gz”結尾的文件與過濾監控目錄下的info路徑(監控路徑/info /*),
可以根據需要添加,但開啓的時候,自己測試一下,正則表達式如果出現錯誤,控制檯會有提示。相比較使用rsync 的exclude功能,被過濾的路徑,不會加入監控,大大減少rsync的通訊量。

inotify監控參數設定(優化)
對於inotify監控參數可以進行設置,根據您項目的特點優化srsync。
<inotify>
<delete start="true"/>
<createFolder  start="true"/>
<createFile start="true"/>
</inotify>
對於大多數應用,可以嘗試把createFile(監控文件事件選項)設置爲false來提高性能,減少 rsync通訊。因爲拷貝文件到監控目錄會產生create事件與close_write事件,所以如果關閉create事件,只監控文件拷貝結束時的事 件close_write,同樣可以實現文件完整同步。
注意:強將createFolder保持爲true,如果將createFolder設爲false,則不會對產生的目錄進行監控,該目錄下的子文件與子目錄也不會被監控。所以除非特殊需要,請開啓。默認情況下對創建文件(目錄)事件與刪除文件(目錄)事件都進行監控,如果項目中不需要刪除遠程目標服務器的文件(目錄),則可以將delete 參數設置爲false,則不對刪除事件進行監控。

Debug開啓

<debug start="false"/>

設置爲true,開啓debug模式,會在sersync正在運行的控制檯,打印inotify事件與rsync同步命令。

XFS文件系統

<fileSystem xfs="false"/>

對於xfs文件系統的用戶,需要將這個選項開啓,才能使sersync正常工作.

 

文件監控與遠程同步設置

<localpath watch="/opt/tongbu">
<remote ip="192.168.0.104" name="tongbu1"/>
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>


Rsync參數配置

<rsync>
<commonParams params="-artuz"/>
<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>

commonParams可以用戶自定義rsync參數,默認是-artuz
auth start=”false” 設置爲true的時候,使用rsync的認證模式傳送,需要配置user與passwrodfile(–password-file=/etc/rsync.pas),來使用。
userDefinedPort  當遠程同步目標服務器的rsync端口不是默認端口的時候使用(–port=874)。timeout設置rsync的timeout時間(–timeout=100)。ssh 使用rsync -e ssh的方式進行傳輸。

失敗日誌腳步配置

<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/>

對於失敗的傳輸,會進行重新傳送,再次失敗就會寫入rsync_fail_log,然後每隔一段時間(timeToExecute進行設置)執行該腳本再次重新傳送,然後清空該腳本。可以通過path來設置日誌路徑。

Crontab定期整體同步功能

<crontab start="false" schedule="600"><!--600mins-->
<crontabfilter start="false">
<exclude expression="*.gz"></exclude>
<exclude expression="info/*"></exclude>
</crontabfilter>
</crontab>

crontab可以對監控路徑與遠程目標主機每隔一段時間進行一次整體同步,可能由於一些原因兩次失敗重傳都失敗了,這個時候如果開啓了crontab功 能,還可以進一步保證各個服務器文件一致,
如果文件量比較大,crontab的時間間隔要設的大一些,否則可能增加通訊開銷。schedule這個參數是設置crontab的時間間隔,默認是600分鐘
如果開啓了filter文件過濾功能,那麼crontab整體同步也需要設置過濾,否則雖然實時同步的時候文件被過濾了,但crontab整體同步的時候 如果不單獨設置crontabfilter,還會將需過濾的文件同步到遠程,
crontab的過濾正則與filter過濾的不同,也給出了兩個實例分別對 應與過濾文件與目錄。總之如果同時開啓了filter與crontab,則要開啓crontab的crontabfilter,並按示例設置使其與filter的過濾一一對應。

插件設置

<plugin start="false" name="command"/>

當設置爲true的時候,將文件同步到遠程服務器後會調用name參數指定的插件。

command插件

當文件同步完成後,會調用command插件,如同步文件是test.php,則test.php文件在改動之後,調用rsync同步到遠程服務器後,調用command插件,執行

/bin/sh test.php  suffix >/dev/null 2>&1

如果suffix 設置了,則會放在inotify事件test.php之後
如果ignoreError爲true,則會添加>/dev/null 2>&1
當然還可以設置command的filter,當filter爲ture,include可以只對正則匹配到的文件,調用command。

“refreshCDN”,就在同步過程中將文件發送到目的服務器後刷新cdn接口。如果不想使用,則將start屬性設爲false即可。如果需要使用其他插件,則查看其他plugin標籤,將插件名稱改爲 xml中其它插件的名稱即可。
該模塊根據chinaCDN的協議,進行設計,當有文件產生的時候,就向cdn接口發送需要刷新的路徑位置。刷新CDN模塊需要配置的xml文件如下。

<plugin name="refreshCDN">
<localpath watch="/data0/htdocs/cms.xoyo.com/site/">
<cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
<sendurl base="http://pic.xoyo.com/cms"/>
<regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
</localpath>
</plugin>

其中 localpath watch 是需要監控的目錄。

cdnifo標籤制定了cdn接口的域名,端口號,以及用戶名與密碼。

sendurl標籤是需要刷新的url的前綴。

regexurl標籤中的,regex屬性爲true時候,使用match屬性的正則語句匹配inotify返回的路徑信息,並將正則匹配到的部分作爲url一部分,

舉例:

如果產生文件事件爲:/data0/htdoc/cms.xoyo.com/site/jx3.xoyo.com/image/a/123.txt

經過上面的match正則匹配後,最後刷新的路徑是:

http://pic.xoyo.com/cms/jx3/a/123.txt;

如果regex屬性爲false,最後刷新的路徑是

http://pic.xoyo.com/cms/jx3.xoyo.com/images/a/123.txt;


socket插件

socket插件,開啓該模塊,則向指定ip與端口發送inotify所產生的文件路徑信息。

Http插件

http插件,可以向指定域名的主機post,inotify監控的事件。


單獨運行插件

插件也可以單獨使用,即不對遠程目標機進行同步,直接調用插件:

只調用command插件

./sersync -d -m command

只調用refreshCDN插件

./sersync -d -m refreshCDN

只調用socket插件

./sersync -d -m socket

只調用http插件

./sersync -d -m http

 





 

 

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