企業實時同步方案—-Rsync+Sersync


原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1433623


    在博文企業實時同步方案—-Sersync介紹中我們詳細介紹了Sersync的原理,設計架構以及和Inotify 等等的優勢區別。這里我就帶大家一起來做一下 Rsync +Sersync 這個同步分發架構案例。

實驗環境介紹:


內核版本:2.6.32-431.el6.x86_64
系統采用最小化安裝,系統經過了基本優化,selinux為關閉狀態,iptables為無限制模式
源碼包存放位置:/root
Rsync客戶端+Sersync服務器(SERSYNC),承擔角色MASTER,IP:172.16.100.3,主機名:rsync-client-sersync
SERSYNC_SLAVE,作為SERSYNC的從機,如果SERSYNC宕機,SERSYNC_SLAVE來接管服務,保證業務不中斷,本實驗不包括它!
Web服務器A(即Rsync服務端)(SWEB1),承擔角色S1,IP:172.16.100.1,主機名:rsync-server-1
Web服務器B(即Rsync服務端)(SWEB2),承擔角色S2,IP:172.16.100.2,主機名:rsync-server-

架構圖

1.jpg


下面,就開始我們的實驗! 


一、在兩臺 SWEB 服務器上部署 Rsync 服務端程序


特別提醒:本文的SWEB服務器即為SWEB1(172.16.100.1),SWEB2(172.16.100.2)。此處僅以SWEB1的 Rsync服務端部署為例,SWEB2的部署和SWEB1一樣,此處不再敖述。

1、安裝 Rsync

[root@SWEB1 ~]# yum install rsync -y

2、修改 Rsync 配置文件

[root@SWEB1 ~]# cat > /etc/rsyncd.conf << EOF
#Rsync server
#created by sunsky 00:17 2013-06-28
##rsyncd.conf start##
uid = root      # rsync對后面模塊中的path路徑擁有什么權限
gid = root      # rsync對后面模塊中的path路徑擁有什么權限
use chroot = no      # 安全操作
max connections = 2000      # 定義連接數2000
timeout = 600      # 600秒超時
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors      # 忽略錯誤
read only = false    # false才能上傳文件,true不能上傳文件
list = false    # 文件列表
hosts allow = 172.16.100.0/24
hosts deny = *
auth users = rsync_bak    # 虛擬用戶,同步時需要用這個用戶
secrets file = /etc/rsync.password      # 密碼文件
#####################################
[web]      # 模塊名稱
comment = redhat.sx site files by sunsky 00:17 2013-06-28    # 注釋
path = /data/web                 # 模塊的路徑
####################################
[download]
comment = redhat.sx site sit data files  by sunsky 00:17 2013-06-28
path = /data/download
#####################################
EOF

特別提示:此處,使用一個多目錄同步的案例。大家可以看需求,如果需求只有一個,那僅僅做一個目錄即可。

       上面的Rsync服務的配置文件,表明允許 172.16.100.0 網段的主機訪問,Rsync同步模塊名為[web]和[download],將同步過來的文件分別放入對應path指定的目錄/data/web,/data/download下。

       如果有多臺目標服務器,則每一臺都需要進行類似的rsync服務端配置,上面的uid和gid需要換成你服務器的相應的同步用戶。注意,Rsync服務賬戶(本文用root)要有對被同步目錄(/data/web和/data/download)的寫入和更新權限。

 

3、創建相關待同步目錄

[root@SWEB1 ~]# mkdir /data/{web,download} -p
[root@SWEB1 ~]# tree /data
/data
├── download
└── web
2 directories, 0 files

提示:此步在S1,S2上都要執行,否則,rsync服務會因為沒有PATH路徑而無法啟動。

4、相關認證和權限項配置

[root@SWEB1 /]# echo 'rsync_bak:redhat' > /etc/rsync.password
[root@SWEB1 /]# chmod 600 /etc/rsync.password
[root@SWEB1 /]# cat /etc/rsync.password
rsync_bak:redhat
[root@SWEB1 /]# ll /etc/rsync.password
-rw-------. 1 root root 7 Jun  4 00:20 /etc/rsync.password

5、以守護進程方式啟動rsync服務

[root@SWEB1 ~]# rsync --daemon

6、查看rsync服務狀態

[root@SWEB1 /]# lsof -i tcp:873
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync   20982 root    3u  IPv4  88170      0t0  TCP *:rsync (LISTEN)
rsync   20982 root    5u  IPv6  88171      0t0  TCP *:rsync (LISTEN)

7、為rsync添加開機自啟動

[root@SWEB1 /]# echo "# rsyncd service daemon by sun 20140702" >>/etc/rc.local
[root@SWEB1 /]# echo "/usr/bin/rsync --daemon"  >> /etc/rc.local
[root@SWEB1 /]# grep daemon /etc/rc.local
# rsyncd service daemon by sun 20140702
/usr/bin/rsync --daemon

這里順帶附上重啟的命令,rsync重啟有點麻煩,需要以先殺掉后臺守護進程,然后再啟動的方式來重啟服務。

[root@SWEB1 /]# pkill rsync
[root@SWEB1 /]# rsync --daemon

二、在 SERSYNC 上配置rsync客戶端


1、安裝Rsync并配置相關權限

在 SERSYNC 上配置 RSYNC 客戶端相關權限認證:


[root@SERSYNC /]# yum install rsync -y
[root@SERSYNC /]# echo "redhat" > /etc/rsync.password
[root@SERSYNC /]# chmod 600 /etc/rsync.password
[root@SERSYNC /]# cat /etc/rsync.password
Redhat
[root@SERSYNC ~]# ll /etc/rsync.password
-rw-------. 1 root root 7 Jun  4 00:20 /etc/rsync.password

2、在SERSYNC上手動測試rsync的同步情況

特別強調:此步很關鍵,如果這不能同步,后面的 SERSYNC 配好了也不會同步數據。

1)分別創建待同步數據

[root@SERSYNC ~]# mkdir /data/{web,download} -p
[root@SERSYNC ~]# touch /data/{web/index.html,download/a.jpg}
[root@SERSYNC ~]# tree /data
/data
├── download
│   └── a.jpg
└── web
    └── index.html
2 directories, 2 files

2)執行同步命令

針對SWEB1(172.16.100.1):

[root@SERSYNC ~]# rsync -avzP /data/web rsync_bak@172.16.100.1::web/ --password-file=/etc/rsync.password
sending incremental file list
web/
web/index.html
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)
sent 92 bytes  received 31 bytes  246.00 bytes/sec
total size is 0  speedup is 0.00
[root@SERSYNC ~]# rsync -avzP /data/download/ rsync_bak@172.16.100.1::download/ --password-file=/etc/rsync.password
sending incremental file list
./
a.jpg
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)
sent 75 bytes  received 30 bytes  210.00 bytes/sec
total size is 0  speedup is 0.00

針對SWEB2(172.16.100.2):

[root@SERSYNC ~]# rsync -avzP /data/web rsync_bak@172.16.100.2::web/ --password-file=/etc/rsync.password
sending incremental file list
web/
web/index.html
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)
sent 92 bytes  received 31 bytes  246.00 bytes/sec
total size is 0  speedup is 0.00
[root@SERSYNC ~]# rsync -avzP /data/download/ rsync_bak@172.16.100.2::download/ --password-file=/etc/rsync.password
sending incremental file list
./
a.jpg
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)
sent 75 bytes  received 30 bytes  70.00 bytes/sec
total size is 0  speedup is 0.00

同步完之后,分別對SWEB1,SWEB2的相應目錄進行查看!此處以 SWEB1 為例:提示:在后面進行部署SERSYNC之前,SERSYNC主服務器(即SERSYNC)上必須要確保手動可以把文件推送到SWEB1,SWEB2上,這樣后續SERSYNC才能調用這些命令來自動推送。

[root@SWEB1 ~]# tree /data/
/data/
├── download
│   └── a.jpg
└── web
    └── web
        └── index.html
3 directories, 2 files

三、在 SERSYNC 上配置 SERSYNC 服務


   上面的工作做好之后呢,下面就開始正式配置我們的Sersync了!

    我們在Sersync安裝過程中所用到包均是從谷歌Sersync項目組取得的,地址:https://code.google.com/p/sersync/downloads/list

    這里,我所用的將是這個 sersync2.5.4_64bit_binary_stable_final.tar.gz 的64位可執行文件版本,里面已經包含了配置文件與可執行文件。下面的操作也都是基于該版本去做的。

1、準備 Sersync 的安裝包

[root@SERSYNC ~]# mkdir /source/
[root@SERSYNC ~]# cd /source/
[root@SERSYNC ~]# wget https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@SERSYNC source]# tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz 
GNU-Linux-x86/
GNU-Linux-x86/sersync2
GNU-Linux-x86/confxml.xml

2、安裝 Sesync 

[root@SERSYNC source]# cp -r GNU-Linux-x86 /usr/local/sersync
[root@SERSYNC source]# tree /usr/local/sersync
/usr/local/sersync
├── confxml.xml
└── sersync2
0 directories, 2 files

3、規范 Sersync 目錄結構

[root@SERSYNC source]# cd /usr/local/sersync
[root@SERSYNC sersync]# mkdir conf bin logs
[root@SERSYNC sersync]# mv confxml.xml conf
[root@SERSYNC sersync]# mv sersync2 bin/sersync
[root@SERSYNC sersync]# tree
.
├── bin
│   └── sersync
├── conf
│   └── confxml.xml
└── logs
3 directories, 2 files

4、配置 Sersync

[root@SERSYNC sersync]# cp conf/confxml.xml conf/confxml.xml.bak.$(date +%F)

[root@SERSYNC sersync]# ls

bin  conf  logs

[root@SERSYNC sersync]# ls conf/

confxml.xml  confxml.xml.bak.2014-06-04

初始化的配置文件內容如下:

為了滿足我們的需求,我們需要修改如下幾處設置:

[root@SERSYNC sersync]# cat conf/confxml.xml -n

  <?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="false">
    <exclude expression="(.*)\.svn"></exclude>
    <exclude expression="(.*)\.gz"></exclude>
    <exclude expression="^info/*"></exclude>
    <exclude expression="^static/*"></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="/opt/tongbu">
        <remote ip="127.0.0.1" name="tongbu1"/>
        <!--<remote ip="192.168.8.39" name="tongbu"/>-->
        <!--<remote ip="192.168.8.40" name="tongbu"/>-->
    </localpath>
    <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>
    <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins ecute 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 ffix-->
    <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>

1)修改24-28行的內容,原內容為:

<localpathwatch="/opt/tongbu">       #定義本地要同步的目錄
              <remoteip="127.0.0.1" name="tongbu1"/>   #
              <!--<remoteip="192.168.8.39" name="tongbu"/>-->    #同步到哪個機器,,同步到機器的哪個模塊
              <!--<remoteip="192.168.8.40" name="tongbu"/>-->
          </localpath>

修改后內容為:

<localpathwatch="/data/web">
              <remoteip="172.16.100.1" name="web"/>    #這里取掉了兩旁的注釋
              <remoteip="172.16.100.2" name="web"/>    #這里取掉了兩旁的注釋
          </localpath>
該文件中分隔符形式為:<!--###########################-->

2)修改31-34行,認證相關部分:

<commonParamsparams="-artuz"/>
<auth start="false"users="root" passwordfile="/etc/rsync.pas"/>
              <userDefinedPortstart="false" port="874"/><!-- port=874 -->
              <timeoutstart="false" time="100"/><!-- timeout=100 -->
              <sshstart="false"/>

修改后內容為:

<commonParamsparams="-aruz"/>
              <auth start="true"users="rsync_bak"passwordfile="/etc/rsync.password"/>
              <userDefinedPortstart="false" port="874"/><!-- port=874 -->
              <timeoutstart="true" time="100"/><!-- timeout=100 -->
              <sshstart="false"/>

提示:上面的幾個配置就是在拼接

rsync -aruz --timeout=100 /data/web 
rsync_bak@172.16.100.1::www/
  
--password-file=/etc/rsync.password

3)修改36-37行

<failLogpath="/tmp/rsync_fail_log.sh"timeToExecute="60"/><!--default every 60mins execute once-->

當同步失敗后,日志記錄到/usr/local/sersync/logs/rsync_fail_log.sh,并且每60分鐘對失敗的log進行重新同步。

修改后的完整配置文件為: 

[root@SERSYNC sersync]# cat -n /usr/local/sersync/conf/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="false">
    <exclude expression="(.*)\.svn"></exclude>
    <exclude expression="(.*)\.gz"></exclude>
    <exclude expression="^info/*"></exclude>
    <exclude expression="^static/*"></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="/data/web">
        <remote ip="172.16.100.1" name="web"/>
        <remote ip="172.16.100.2" name="web"/>
    </localpath>
    <rsync>
        <commonParams params="-aruz"/>
        <auth start="true" users="rsync_bak" passwordfile="/etc/rsync.password"/>
        <userDefinedPort start="false" port="874"/><!-- port=874 -->
        <timeout start="true" time="100"/><!-- timeout=100 -->
        <ssh start="false"/>
    </rsync>
    <failLog path="/usr/local/logs/rsync_fail_log.sh" timeToExecute="60"/><!--default every mins 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 ffix-->
    <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>

以上的配置文件,我們僅僅配置了針對 SWEB1 和 SWEB2 上web這個模塊,即/data/web目錄的自動同步。由于我們還有一個download模塊,即/data/download目錄需要進行自動同步。因此這就意味著,我們需要配置多實例了。

Sersync的多實例和往常的apache,nginx一樣,你只需要把配置文件拷貝一份出來,然后針對不同的實例做不同的修改,然后在最后開啟 sersync 服務的時候指定不同的配置文件做啟動即可!

[root@SERSYNC sersync]# cp /usr/local/sersync/conf/confxml.xml /usr/local/sersync/conf/download_confxml.xml

配置針對download的實例配置文件:

  23    <sersync>
    24<localpath watch="/data/download">
    25    <remote ip="172.16.100.1" name="download"/>
    26    <remote ip="172.16.100.2" name="download"/>
    27</localpath>
    28<rsync>

5、開啟 Sersync 守護進程進行數據同步

a、配置 Sersync 環境變量

[root@SERSYNC sersync]# echo 'export PATH=$PATH:/usr/local/sersync/bin'>>/etc/profile
[root@SERSYNC sersync]# tail -1 /etc/profile
export PATH=$PATH:/usr/local/sersync/bin
[root@SERSYNC sersync]# . /etc/profile
[root@SERSYNC sersync]# which sersync
/usr/local/sersync/bin/sersync

啟動的過程及結果:

[root@SERSYNC ~]# ls /usr/local/sersync/conf/*
/usr/local/sersync/conf/confxml.xml
/usr/local/sersync/conf/confxml.xml.bak.2014-06-04
/usr/local/sersync/conf/download_confxml.xml
[root@SERSYNC ~]# sersync -r -d -o /usr/local/sersync/conf/confxml.xml
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
option: -d run as a daemon
option: -o config xml name:  /usr/local/sersync/conf/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhosthost port: 8008
daemon start,sersync run behind the console 
use rsync password-file :
user isrsync_bak
passwordfile is /etc/rsync.password
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: 32 = 12(Thread pool nums) + 20(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
chmod: cannot access `/usr/local/logs/rsync_fail_log.sh': No such file or directory
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /data/web && rsync -aruz -R --delete ./  --timeout=100 rsync_bak@172.16.100.1::web --password-file=/etc/rsync.password >/dev/null 2>&1 
run the sersync: 
watch path is: /data/web
[root@SERSYNC ~]# sersync -r -d -o /usr/local/sersync/conf/download_confxml.xml
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
option: -d run as a daemon
option: -o config xml name:  /usr/local/sersync/conf/download_confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhosthost port: 8008
daemon start,sersync run behind the console 
use rsync password-file :
user isrsync_bak
passwordfile is /etc/rsync.password
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: 32 = 12(Thread pool nums) + 20(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
chmod: cannot access `/usr/local/logs/rsync_fail_log.sh': No such file or directory
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /data/download && rsync -aruz -R --delete ./  --timeout=100 rsync_bak@172.16.100.1::download --password-file=/etc/rsync.password >/dev/null 2>&1 
run the sersync: 
watch path is: /data/download

注意:我們這里要啟動的是多實例,即confxml.xml和download_confxml.xml

b、開啟后查看進程

[root@SERSYNC ~]# ps -ef |grep sersync
root      2114     1  0 01:56 ?        00:00:00 sersync -r -d -o /usr/local/sersync/conf/confxml.xml
root      2223     1  0 02:03 ?        00:00:00 sersync -r -d -o /usr/local/sersync/conf/download_confxml.xml
root      2295  2244  0 02:08 pts/2    00:00:00 grep sersync

C、配置開機自啟動

[root@SERSYNC ~]# cp /etc/rc.local /etc/rc.local.bak._$(date +%F)

[root@SERSYNC ~]# cat >>/etc/rc.local<< 'EOF'
> # sync data to 172.16.100.1,172.16.100.2
> sersync -d -o /usr/local/sersync/conf/confxml.xml
> sersync -d -o /usr/local/sersync/conf/download_confxml.xml
> EOF

6、測試 Sersync 是否正常

我們在 Sersync 服務端批量創建文件,然后去SWEB1和SWEB2上查看同步效果: 

[root@SERSYNC web]# for i in {1..10000};do echo 123456 > /data/web/$i &>/dev/null;done
[root@SERSYNC web]# for i in {1..10000};do echo 123456 > /data/download/$i &>/dev/null;done
[root@SERSYNC web]# tree /data/
/data/
├── download
│   ├── 1
......  #中間信息省略
......  #中間信息省略
    ├── 9997
    ├── 9998
    ├── 9999
    └── index.html
2 directories, 20001 files

以上,我們是寫入了20000個文件,然后批量測試同步效率:

這種情況下,同步情況不是很令人樂觀

此時,我們可以通過ps -ef |grep rsync|wc -l來查看Sersync的服務端 Rsync的進程數,最好多次統計,你會發現這個進程是動態變化的!

[root@SERSYNC ~]# ps -ef |grep rsync|wc -l
52
[root@SERSYNC ~]# ps -ef |grep rsync|wc -l
63
[root@SERSYNC ~]# ps -ef |grep rsync|wc -l
20
[root@SERSYNC ~]# ps -ef |grep rsync|wc -l
83
[root@SERSYNC ~]# ps -ef |grep rsync|wc -l
83

此時,我們在去SWEB1和SWEB2上tree或者ls下,/data/web和/data/download的同步情況!

需要注意:生產中,寫的越快,并發的進程也就越多!當寫的過多的時候,也是沒法實現實時同步,因此這個也是受寫入數據量大小影響的。

在生產環境中,一般來說以 DELL R710 服務器為主,在千兆網卡情況下,每秒鐘同步 10-100k 的文件能達到同步 40 到 50 個。


以上就是我們的 Rsync + Sersync 的架構實驗!


后面,我就補充一些說明信息。

一、Sersync參數說明

Sersync參數

說明

./sersync  -r

-r參數作用是在開啟實時監控的之前對主服務器目錄與遠程目標機目錄進行一次整體同步。如果需要將sersync運行前,主服務器目錄下已經存在的所有文件或目錄全部同步到遠端,則要以-r參數運行sersync,將本地與遠程整體同步一次。

特別說明:如果設置了過濾器,即在xml文件中,filter為true,則暫時不能使用-r參數進行整體同步。

./sersync  –o old.xml

不指定-o參數時,sersync會使用sersync可執行文件目錄下的默認配置文件confxml.xml,如果需要使用其他的配置文件,可以使用-o參數制定其它配置文件,通過-o參數,我們可以指定多個不同的配置文件,從而實現sersync多進程多實例的數據同步,本文的例子就是如此。

./sersync  –n num

-n參數為指定默認的線程池的線程總數。

例如: ./sersync –n 5 則指定線程總數為5,如果不指定,默認啟動線程池數量是10,如果cpu使用過高,可以通過這個參數調低,如果機器配置較高,可以用-n調高默認的線程總數,提升同步效率。

./sersync  –d

-d參數為后臺啟動服務,在通常情況下,使用-r參數對本地到遠程整體同步一遍后,在后臺運行此參數啟動守護進程實時同步,在第一次整體同步時,-d和-r參數會聯合使用。./sersync  –d -r

./sersync  –m plugnName

-m  參數為不進行同步,只運行插件

./sersync  –m pluginName

例如:./sersync –m command,則在監控到事件后,不對遠程目標服務器進行同步,而是直接運行command插件。

-n  8 –o sun.xml –r –d

多個參數可以配置使用,例如:./sersync –n 16 –o config.xml –r –d,表示設置線程池工作線程為16個,指定sun.xml作為配置文件,子實時監控前做一次整體同步,以守護進程方式在后臺運行。

通常情況下,首先要對本地到遠程整體同步一遍之后,再在后臺運行實時同步操作!

二、Sersync配置文件說明


Sersync 的可選功能是通過 xml 配置文件來實現的,下面來為大家解釋該文件!

在該文件中,使用<!–中間是注釋內容–>的方式去注釋信息,注意不是我們平時#

[root@SERSYNC sersync]# cat conf/confxml.xml -n
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <head version="2.5">
        <host hostip="localhost" port="8008"></host>  hostip與port是針對插件的保留字段,對于同步功能沒有任何作用,保留默認即可。
        <debug start="false"/>  該行為Debug開啟開關。true為開啟debug模式,會在sersync正在運行的控制臺,打印 inotify 事件與 rsync 同步命令,生產環境一般不開啟。
        <fileSystemfs="false"/>#對于XFS文件系統的用戶,需要將這個選項開啟,才能使sersync正常工作
     對于sersync監控的文件,會默認過濾系統的臨時文件(以“開頭,以“~”結尾),除了這些文件外,在6-11行中,我們還可以自定義其它需要過濾的文件。
     通過將 start 設置為 true 后可開啟過濾功能,在exclude標簽中可使用正則表達式。默認給出的兩個例子分別是過濾以“z”結尾的文件與過濾監控目錄下的info路徑(監控路徑/info/*),可以根據需求自己添加。但在開啟的時候,自己一定要測試下,如果正則表達式出現錯誤,控制臺會有相應提示。相比較使用 Rsync 的xclude 功能,被過濾的路徑,不會加入監控,大大減少 Rsync 同步的通訊量
        <filter start="false">
    <exclude expression="(.*)\.svn"></exclude>
    <exclude expression="(.*)\.gz"></exclude>
    <exclude expression="^info/*"></exclude>
    <exclude expression="^static/*"></exclude>
        </filter>
第123行用來定義 inotify 監控參數,我們可以根據項目的特點來優化 Sersync。
對多數應用,可以嘗試把 createFile(監控文件事件選項)設置為false來提高性能,進一步減少 Rsync通訊。因為拷貝文件到監控目錄會產生 create 事件與 close_write 事件,所以如果關閉create 事只監控文件拷貝結束時的事件 close_write,同樣可以實現文件完整同步。
注要使得 createFolder 保持為true,如果將createFolder設為false,則不會對產生的目錄進行監控,該下的子文件與子目錄也不會被監控,所以除非特殊需要,請開啟。默認情況下對創建文件(目錄)事件與文件(目錄)事件都進行監控,如果項目中不需要刪除遠程目標服務器的文件(目錄),則可以將 dele 參數設置為 false,則不對刪除事件進行監控。
        <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>
第248行用來定義所要同步和監控的目錄文件。
/optongbu目錄為sersync主服務器本地待同步的目錄,ip=“192.168.8.39”為從服務器的ip地址,如果有多個器,依次列出來即可。name=“tongbu”,這里的tongbu為rsyncd.con的模塊名字,即中括號中的名稱。
    <localpath watch="/opt/tongbu">
        <remote ip="127.0.0.1" name="tongbu1"/>
        <!--<remote ip="192.168.8.39" name="tongbu"/>-->
        <!--<remote ip="192.168.8.40" name="tongbu"/>-->
    </localpath>
第295行用來定義rsync的命令參數
在 cmonParams 項,我們可以自定義rsync的同步參數,默認是-artuz,auth star“false”設置為true的時候,使用rsync的認證模式傳送,需要配置user與passwordfile(-password-fileetc/rsync.pas)來使用。userDefinedPort 當同步目標服務器的rsync端口不是默認端口的時候使用(-port74)。timeout設置rsync的timeout事件(-timeout=100)。<ssh start=”false”/>如啟表示ssh使用rsync -e ssh的方式進行傳輸。
    <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>
第3用來定義失敗日志腳本配置
如件同步傳輸失敗,會重新傳送,再次失敗就會寫入 rsync_fail_log.sh,然后每隔一段時間(timeToExecute進行設置)執行該腳本再次重新傳送,然后清空該腳本??梢酝ㄟ^path來設置日志路徑
    <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins ecute once-->
第372行用來定義Crontab定期整體同步功能
Cronb可以對監控路徑與遠程目標主機每隔一段時間進行一次整體同步,可能由于一些原因兩次失敗重傳都失,這個時候如果開啟了 crontab 功能,還可以進行一次保證各個服務器文件一致,如果文件量比較大,crtab的時間間隔要設的大一些,否則可能增加通訊開銷,schedule這個參數是設置crontab的時間間隔,默600分鐘。
如啟了 filter 文濾功能,那么crontab整體同步也需要設置過濾,否則雖然實時同步的時候文件被過濾了,但 crontab 整步的時候,如果不單獨設置crontabfilter,還會將需過濾的文件同步到遠程從服務器,crontab的過濾正filter過濾的不同,也給出了兩個實例分別對應與過濾文件與目錄,總之如果同時開啟了filter與crontab,則要開啟crontab的crontabfilter,并按示例設置使其與filter的過濾一一對應。
    <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>
    
從4到行尾,都是插件的相關信息。當plugin標簽設置為true時候,在同步文件或路徑到遠程服務器之后,會插件。通過name參數指定需要執行的插件。目前支持的有command、refreshCDN、socket、http四種插件中,http插件目前由于兼容性原因已經去除,以后會重新加入。
        <plugin name="command">
    <param prefix="/bin/sh" suffix="" ignoreError="true"/><!--prefix /opt/tongbu/mmm.sh ffix-->
    <filter start="false">
        <include expression="(.*)\.php"/>
        <include expression="(.*)\.sh"/>
    </filter>
        </plugin>
    
第548行為插件socket的相關配置
sock插件,開啟該模塊,則向指定ip與端口發送inotify所產生的文件路徑信息
        <plugin name="socket">
    <localpath watch="/opt/tongbu">
        <deshost ip="192.168.138.20" port="8009"/>
    </localpath>
        </plugin>
第595行為插件refreshCDN的相關配置
refrhCDN 用來在同步過程中將文件發送到目地服務器后,刷新cdn接口。如果不想使用,則將start屬性設為fae即可。該模塊根據chinaCDN的協議,進行設計,當有文件產生的時候,就向cdn解耦發送需要刷新的路徑。其中localpath watch=“/data0/htdocs/cms.xoyo.com/site/”是需要監控的目錄。cdinfo標簽指定了cdn接口的域名,端口號,以及用戶名與密碼。sendurl 標需要刷新的url的前綴。regexurl 標簽中,regex屬性為true時候,使用match屬性的正則語句匹配inotify返回的路徑信息,并將正則匹配到的部分作為url一部分
下置文件自帶的意思為,如果產生文件事件為:/data0/htdoc/cms.xoyo.com/site/jx3.xoyo.com/image/a/12txt
經面的match正則匹配后,最后刷新的路徑是:http://pic.xoyo.com/cms/a/123.txt
如果gex屬性為false,最后刷新的路徑就是:http://pic.xoyo.com/cms/jx3.xoyo.com/images/a/123.txt
        <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

這里列舉,如何單獨去運行插件

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

只調用command插件

[root@SERSYNC ~]# sersync -d -m command

只調用refreshCDS插件

[root@SERSYNC ~]# sersync -d -m refreshCDN

只調用socket插件

[root@SERSYNC ~]# sersync -d -m socket

只調用http插件

[root@SERSYNC ~]# sersync -d -m http

OK,本文就到這里,希望能對廣大51博友有所幫助!

轉自:http://nolinux.blog.51cto.com/4824967/1433623

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

(0)
s19930811s19930811
上一篇 2015-03-30
下一篇 2015-03-30

相關推薦

  • 第六周 網絡進程管理

    1、簡述osi七層模型和TCP/IP五層模型 2、簡述iproute家族命令 3、詳細說明進程管理工具htop、vmstat等相關命令,并舉例 4、使用until和while分別實現192.168.0.0/24 網段內,地址是否能夠ping通,弱ping通則輸出”success!”,若ping不通則輸出”fail!&#82…

    2018-01-12
  • 簡述動靜分離

        今天來簡述一下如何實現wordpress的動靜分離以及讀寫分離      首先來放出大圖。   1.來看圖說話     首先來介紹一下這張圖    最前端的兩臺機器是  負責調度后端主機請求動…

    2017-05-18
  • 馬哥教育網絡班21期+第一周課程練習

    1,描述計算機的組成及其功能。 2.按系列羅列linux的發行版,并描述不同發行版之間的練習與區別。 3.描述linux的哲學思想,并按照自己的理解對其進行解釋性描述。 1.       一切皆文件,計算機中所有的文件目錄,        包括計算機的硬件設備顯示為文件格式。 2…

    Linux干貨 2016-07-07
  • 磁盤分區及lvm管理

    1. 硬盤類型 /dev/sda VS /dev/hda /dev/sda     /dev/sda1     /dev/sda2     /dev/sda3 而又的安裝時硬盤驅動設備名為 /dev/hda    /dev/hda1 &nb…

    Linux干貨 2016-09-19
  • 第九周shell腳本編程練習

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; 2、寫一個腳本 (1)?獲取當前主機的主機名,保存于hostname變量中; (2)?判斷此變量的值是否為localhost,如果是,則將當前主機名修改www.magedu.com; (3…

    2017-11-23
  • httpd服務歸納:淺談I/O模型

    1. 四種理論的I/O模型      1) 調用者(服務進程):         阻塞:  進程發起I/O調用,如果調用為完成,進程被掛起休眠,不能再執行其他功能    …

    Linux干貨 2015-05-27

評論列表(1條)

  • 防火板
    防火板 2015-04-10 16:00

    不錯的文章,內容驚濤駭浪.禁止此消息:nolinkok@163.com

欧美性久久久久