天天看點

sersync+rsync原理及部署

一、為什麼要用rsync+sersync架構?

1、sersync是基于inotify開發的,類似于inotify-tools的工具

2、sersync可以記錄下被監聽目錄中發生變化的(包括增加、删除、修改)具體某一個檔案或者某一個目錄的名字,然後使用rsync同步的時候,隻同步發生變化的檔案或者目錄

二、rsync+inotify-tools與rsync+sersync架構的差別?

1、rsync+inotify-tools

 a、inotify隻能記錄下被監聽的目錄發生了變化(增,删,改)并沒有把具體是哪個檔案或者哪個目錄發生了變化記錄下來;

 b、rsync在同步的時候,并不知道具體是哪個檔案或目錄發生了變化,每次都是對整個目錄進行同步,當資料量很大時,整個目錄同步非常耗時(rsync要對整個目錄周遊查找對比檔案),是以效率很低

2、rsync+sersync

 a、sersync可以記錄被監聽目錄中發生變化的(增,删,改)具體某個檔案或目錄的名字;

 b、rsync在同步時,隻同步發生變化的檔案或目錄(每次發生變化的資料相對整個同步目錄資料來說很小,rsync在周遊查找對比檔案時,速度很快),是以效率很高。

總結: 

            當同步的目錄資料量不大時,建議使用rsync+inotify 

            當同步的目錄資料量很大時(幾百G甚至1T以上)檔案很多時,建議使用rsync+sersync

二、sersync安裝配置

2.1sersync同步邏輯圖

    目前版本的sersync依賴于rsync進行資料同步; 

<a href="http://s3.51cto.com/wyfs02/M01/70/11/wKiom1WwkXyQXHIzAACvg-bwYDE379.jpg" target="_blank"></a>

原理步驟:

1.  在同步伺服器(Master)上開啟sersync服務,sersync負載監控配置路徑中的檔案系統事件變化;

2.  調用rsync指令把更新的檔案同步到目标伺服器(S1 和 S2);

3.  需要在主伺服器配置sersync,在同步目标伺服器配置rsync server(注意:是rsync服務)

同步原理:

1.  使用者實時的往sersync伺服器(M)上寫入更新檔案資料;

2.  此時需要在同步主伺服器(M)上配置sersync服務;

3.  在S1 和S2上開啟rsync守護程序服務,以同步拉取來自sersync伺服器(M)上的資料;

通過rsync的守護程序服務後可以發現,實際上sersync就是監控本地的資料寫入或更新事件;然後,在調用rsync用戶端的指令,将寫入或更新事件對應的檔案通過rsync推送到目标伺服器(S1 和S2),如此簡單;

2.2 安裝環境準備

1.系統資源清單

角色

伺服器配置

作業系統版本

IP

機器名

sersync服務(M)

VM

CentOS6.6

172.16.1.28

sersync

rsync服務(S1)

172.16.1.25

WEB1

rsync服務(S2)

172.16.1.26

WEB2

2.檢查系統環境

<code>[root@web ~]# cat/etc/redhat-release </code>

<code>CentOS release </code><code>6.6</code> <code>(Final)</code>

<code>[root@web ~]# uname -r</code>

<code>2.6</code><code>.</code><code>32</code><code>-</code><code>504</code><code>.el6.x86_64</code>

<code>[root@web ~]# uname -m</code>

<code>x86_64</code>

2.3 配置同步伺服器

1.slave上部署rsync服務

2. 更新rsync到3.0版本

<code>[root@web1 ~]# rsync --version|head -</code><code>2</code>

<code>rsync  version </code><code>3.0</code><code>.</code><code>6</code> <code>protocol version </code><code>30</code>

<code>Copyright (C) </code><code>1996</code><code>-</code><code>2009</code> <code>byAndrew Tridgell, Wayne Davison, and others.</code>

3.部署rsync服務

    确定S1和S2伺服器版本是最新的,這看下多台目标伺服器(S1,S2)上配置如下:

<code>[root@web1 ~]# vim /etc/rsyncd.conf</code>

<code>#Rsync server</code>

<code>uid = root</code>

<code>gid = root</code>

<code>use</code> <code>chroot = no                         # 安全相關</code>

<code>max connections = </code><code>2000</code>                  <code># 并發連接配接數</code>

<code>timeout = </code><code>600</code>                           <code># 逾時時間(秒)</code>

<code>pid file =/</code><code>var</code><code>/run/rsyncd.pid           # 指定rsync的pid目錄</code>

<code>lock file =/</code><code>var</code><code>/run/rsync.lock          # 指定rsync的鎖檔案【重要】</code>

<code>log file = /</code><code>var</code><code>/log/rsyncd.log          # 指定rsync的日志目錄</code>

<code>ignore errors </code>

<code>read only = </code><code>false</code>

<code>list = </code><code>false</code>

<code>hosts allow = </code><code>172.16</code><code>.</code><code>1.0</code><code>/</code><code>24</code>

<code>hosts deny = </code><code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>32</code>

<code>auth users = rsync_backup</code>

<code>secrets file =/etc/rsync.password</code>

<code>#################################################</code>

<code>[www]                                   # 子產品 </code>

<code>comment = www </code>

<code>path = /data/www/</code>

<code>[bbs]</code>

<code>comment = bbs</code>

<code>path = /data/bbs/</code>

<code>[blog]</code>

<code>comment = blog</code>

<code>path = /data/blog/</code>

<code>#rsync_config____________end</code>

特别提示: S1,S2的機器 同時部署上述服務;

上面rsync服務的配置檔案,表面允許sersync主伺服器(ip:172.16.1.28)通路rsync同步子產品名為[www][bbs][blog] 将同步過來的檔案分别放入對應的path指定的目錄/data/{www,bbs,blog}下面; 如果有多台目标伺服器,則每一台都需要進行類似的rsync服務配置,上面的uid、gid要換成您伺服器的相應的同步使用者;注意,rsync服務賬戶(本文用的是root)要有對被同步目錄(/data/)的寫入更新權限;

4.建立rsync同步密碼檔案,并設定權限為600

<code>[root@web1 ~]# echo</code><code>"rsync_backup:liubl"</code><code>&gt;/etc/rsync.password</code>

<code>[root@web1 ~]# chmod </code><code>600</code> <code>/etc/rsync.password  </code>

<code>[root@web1 ~]# ll /etc/rsync.password        </code>

<code>-rw-------. </code><code>1</code> <code>root root 19Jun  </code><code>3</code> <code>18</code><code>:</code><code>19</code> <code>/etc/rsync.password </code>

<code>[root@web1 ~]# cat /etc/rsync.password </code>

<code>rsync_backup:liubl</code>

5.啟動守護程序,并寫入開機自啟動

<code>[root@web1 ~]# rsync --daemon</code>

<code>[root@web1 ~]# lsof -i:</code><code>873</code>

<code>COMMAND  PID USER  FD   TYPE   DEVICE SIZE/OFF NODE NAME</code>

<code>rsync   </code><code>1070</code> <code>root   4u  IPv4 </code><code>17190189</code>      <code>0t0 TCP *:rsync (LISTEN)</code>

<code>[root@web1 ~]# </code>

<code>[root@web1 ~]# netstat -nulpt| grep rsync</code>

<code>tcp        </code><code>0</code>     <code>0</code> <code>0.0</code><code>.</code><code>0.0</code><code>:</code><code>873</code>                <code>0.0</code><code>.</code><code>0.0</code><code>:*                   LISTEN      </code><code>1070</code><code>/rsync</code>

<code>設定開機自啟動【寫入到/etc/rc.local裡面】</code>

<code>[root@web1 ~]# vim /etc/rc.local</code>

<code># rsync server progress</code>

<code>/usr/bin/rsync --daemon</code>

6. 建立相關待同步的目錄

<code>mkdir -p /data/{www,bbs,blog}</code>

<code>tree /data</code>

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

2.4Master上配置rsync用戶端

在master上配置rsync用戶端相關權限認證:

<code>[root@web ~]# echo</code><code>"liubl"</code><code>&gt;/etc/rsync.password</code>

<code>[root@web ~]# chmod </code><code>600</code> <code>/etc/rsync.password </code>

<code>[root@web ~]# ll/etc/rsync.password </code>

<code>-rw-------. </code><code>1</code> <code>root root 19Jun  </code><code>5</code> <code>05</code><code>:</code><code>57</code> <code>/etc/rsync.password</code>

<code>[root@web ~]# cat /etc/rsync.password </code>

<code>liubl</code>

2.4.1master上手工測試rsync同步情況

特别提示:此步非常關鍵,如果測試不成功,後面的sersync配好了也不會同步資料;

1)分别建立待同步資料

<code>[root@web ~]# mkdir -p /data/{www,bbs,blog}</code>

<code>[root@web ~]# touch /data/www/www.log /data/bbs/bbs.log/data/blog/blog.log</code>

<code>[root@web ~]# tree /data/</code>

<code>/data/</code>

<code>├── bbs</code>

<code>│   └── bbs.log</code>

<code>├── blog</code>

<code>│   └── blog.log</code>

<code>└── www</code>

<code>    </code><code>└── www.log</code>

<code>  </code> 

<code>3</code> <code>directories, </code><code>3</code> <code>files</code>

2)執行同步指令

<code># rsync-avzP /data/www/ rsync_backup@</code><code>172.16</code><code>.</code><code>1.25</code><code>::www/--password-file=/etc/rsync.password</code>

<code>sending incremental file list</code>

<code>sent </code><code>38</code> <code>bytes  received </code><code>8</code> <code>bytes  </code><code>92.00</code> <code>bytes/sec</code>

<code>total size </code><code>is</code> <code>0</code>  <code>speedup </code><code>is</code> <code>0.00</code>

<code>rsync-avzP /data/www/ rsync_backup@</code><code>172.16</code><code>.</code><code>1.25</code><code>::www/--password-file=/etc/rsync.password</code>

<code>rsync-avzP /data/www/ rsync_backup@</code><code>172.16</code><code>.</code><code>1.26</code><code>::www/--password-file=/etc/rsync.password</code>

<code>rsync-avzP /data/bbs/ rsync_backup@</code><code>172.16</code><code>.</code><code>1.26</code><code>::bbs/--password-file=/etc/rsync.password</code>

<code>rsync-avzP /data/bbs/ rsync_backup@</code><code>172.16</code><code>.</code><code>1.25</code><code>::bbs/--password-file=/etc/rsync.password</code>

<code>rsync-avzP /data/blog/ rsync_backup@</code><code>172.16</code><code>.</code><code>1.25</code><code>::blog/--password-file=/etc/rsync.password</code>

<code>rsync-avzP /data/blog/ rsync_backup@</code><code>172.16</code><code>.</code><code>1.26</code><code>::blog/--password-file=/etc/rsync.password</code>

<code>提示: </code>

<code>在後面進行部署sersync之前,sersync主伺服器上必須要確定手工可以把檔案推送到S1,S2上,這樣後續sersync才能調用這些指令來自動推送</code>

<code>在推送前關閉iptables</code>

3)推送的指令是在 master端(也就是 sersync伺服器上)操作的,同步後檢視S1,S2

<code>[root@web1 ~]# tree /data/</code>

2.5Mster上開始部署sersync服務

1、下載下傳sersync

    在google code下載下傳sersync的可執行檔案版本,裡面有配置檔案與可執行檔案,這用

<code>mkdir -p /applition/tools</code>

<code>cd /applition/tools</code>

<code>wgethttps:</code><code>//sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz</code>

<code>【有時下載下傳失敗,所有要本地留存才行】</code>

<code>[root@web ~]# tar fxzsersync2.</code><code>5</code><code>.4_64bit_binary_stable_final.tar.gz -C /usr/local/</code>

<code>[root@web ~]# cd /usr/local/</code>

<code>[root@cache local]# mv GNU-Linux-x86 sersync</code>

<code>[root@cache local]# treesersync/</code>

<code>sersync/</code>

<code>├── confxml.xml      #   配置檔案</code>

<code>└── sersync2         #   二進制檔案【啟動sersync使用】</code>

<code>0</code> <code>directories, </code><code>2</code> <code>files</code>

2、配置sersync

<code>[root@cache local]# cp sersync/confxml.xmlsersync/confxml.xml.$(date +%F)</code>

<code>[root@cache local]# ll sersync/confxml.xml</code>

<code>-rwxr-xr-x. </code><code>1</code> <code>root root 2214Oct </code><code>26</code>  <code>2011</code> <code>sersync/confxml.xml</code>

<code>[root@cache local]# llsersync/confxml.xml*</code>

<code>-rwxr-xr-x. </code><code>1</code> <code>root root 2214Jun  </code><code>5</code> <code>06</code><code>:38sersync/confxml.xml.</code><code>2015</code><code>-</code><code>06</code><code>-</code><code>05</code>

更改優化sersync配置檔案:

a) 修改24--28行

<code> </code><code>24</code>         <code>&lt;localpathwatch=</code><code>"/opt/tongbu"</code><code>&gt;     # 定義本地要同步的目錄</code>

<code> </code><code>25</code>             <code>&lt;remote ip=</code><code>"127.0.0.1"</code><code>name=</code><code>"tongbu1"</code><code>/&gt;</code>

<code> </code><code>26</code>             <code>&lt;!--&lt;remoteip=</code><code>"192.168.8.39"</code> <code>name=</code><code>"tongbu"</code><code>/&gt;--&gt;        # 同步到哪台機器上 tongbu子產品rsync端子產品名字</code>

<code> </code><code>27</code>             <code>&lt;!--&lt;remoteip=</code><code>"192.168.8.40"</code> <code>name=</code><code>"tongbu"</code><code>/&gt;--&gt;        # 同步到哪台機器上 tongbu子產品</code>

<code> </code><code>28</code>         <code>&lt;/localpath&gt;</code>

修改後的内容為:

<code>         </code><code>&lt;localpathwatch=</code><code>"/data/www"</code><code>&gt;</code>

<code>             </code><code>&lt;remoteip=</code><code>"172.16.1.25"</code> <code>name=</code><code>"www"</code><code>/&gt;</code>

<code>             </code><code>&lt;remoteip=</code><code>"172.16.1.26"</code> <code>name=</code><code>"www"</code><code>/&gt;</code>

<code>         </code><code>&lt;/localpath&gt;</code>

<code>         </code><code>&lt;!--################################################## --&gt;</code>

<code>         </code><code>&lt;localpathwatch=</code><code>"/data/bbs"</code><code>&gt;</code>

<code>             </code><code>&lt;remoteip=</code><code>"172.16.1.25"</code> <code>name=</code><code>"bbs"</code><code>/&gt;</code>

<code>             </code><code>&lt;remoteip=</code><code>"172.16.1.26"</code> <code>name=</code><code>"bbs"</code><code>/&gt;</code>

<code>         </code><code>&lt;localpathwatch=</code><code>"/data/blog"</code><code>&gt;</code>

<code>             </code><code>&lt;remote ip=</code><code>"172.16.1.25"</code><code>name=</code><code>"blog"</code><code>/&gt;</code>

<code>             </code><code>&lt;remoteip=</code><code>"172.16.1.26"</code> <code>name=</code><code>"blog"</code><code>/&gt;</code>

<code>提示:  此步watch=</code><code>"/data/blog"</code><code>就是定義服務端待同步的目錄,和目标伺服器的子產品name=</code><code>"blog"</code>

b)修改31--34行,認證部分【rsync密碼認證】

<code>        </code><code>&lt;rsync&gt;</code>

<code>            </code><code>&lt;commonParamsparams=</code><code>"-artuz"</code><code>/&gt;</code>

<code>            </code><code>&lt;auth start=</code><code>"false"</code><code>users=</code><code>"root"</code> <code>passwordfile=</code><code>"/etc/rsync.pas"</code><code>/&gt;</code>

<code>             </code><code>&lt;userDefinedPortstart=</code><code>"false"</code> <code>port=</code><code>"874"</code><code>/&gt;&lt;!-- port=</code><code>874</code> <code>--&gt;</code>

<code>             </code><code>&lt;timeoutstart=</code><code>"false"</code> <code>time=</code><code>"100"</code><code>/&gt;&lt;!-- timeout=</code><code>100</code> <code>--&gt;</code>

<code>             </code><code>&lt;sshstart=</code><code>"false"</code><code>/&gt;</code>

<code>         </code><code>&lt;/rsync&gt;</code>

修改後的内容如下:

<code>         </code><code>&lt;rsync&gt;</code>

<code>             </code><code>&lt;commonParamsparams=</code><code>"-artuz"</code><code>/&gt;</code>

<code>             </code><code>&lt;auth start=</code><code>"true"</code><code>users=</code><code>"rsync_backup"</code> <code>passwordfile=</code><code>"/etc/rsync.password"</code><code>/&gt;</code>

<code>             </code><code>&lt;timeout start=</code><code>"true"</code> <code>time=</code><code>"100"</code><code>/&gt;&lt;!--timeout=</code><code>100</code> <code>--&gt;</code>

<code>        </code><code>&lt;/rsync&gt;</code>

<code># ***修改内容為 rsync的密碼檔案以及 同步所使用的賬号類似:</code>

<code>rsync -avzP /data/www/rsync_backup@</code><code>172.16</code><code>.</code><code>1.25</code><code>::www/ --password-file=/etc/rsync.password</code>

c)修改37行

<code>         </code><code>&lt;failLogpath=</code><code>"/tmp/rsync_fail_log.sh"</code><code>timeToExecute=</code><code>"60"</code><code>/&gt;&lt;!--</code><code>default</code> <code>every 60mins execute once--&gt;</code>

修改後如下:

<code>        </code><code>&lt;failLog path=</code><code>"/usr/local/sersync/logs/rsync_fail_log.sh"</code><code>timeToExecute=</code><code>"60"</code><code>/&gt;&lt;!--</code><code>default</code> <code>every 60mins execute once--&gt;</code>

<code># 當同步失敗後,日志記錄到/usr/local/sersync/logs/rsync_fail_log.sh檔案中,并且每</code><code>60</code><code>分鐘對失敗的log進行重新同步</code>

修改後的完整配置檔案為:

<code>[root@cache local]# cat  sersync/confxml.xml</code>

<code>&lt;?xmlversion=</code><code>"1.0"</code> <code>encoding=</code><code>"ISO-8859-1"</code><code>?&gt;</code>

<code>&lt;headversion=</code><code>"2.5"</code><code>&gt;</code>

<code>    </code><code>&lt;host hostip=</code><code>"localhost"</code><code>port=</code><code>"8008"</code><code>&gt;&lt;/host&gt;</code>

<code>    </code><code>&lt;debug start=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>&lt;fileSystem xfs=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>&lt;filter start=</code><code>"false"</code><code>&gt;</code>

<code>        </code><code>&lt;excludeexpression=</code><code>"(.*)\.svn"</code><code>&gt;&lt;/exclude&gt;</code>

<code>        </code><code>&lt;excludeexpression=</code><code>"(.*)\.gz"</code><code>&gt;&lt;/exclude&gt;</code>

<code>        </code><code>&lt;excludeexpression=</code><code>"^info/*"</code><code>&gt;&lt;/exclude&gt;</code>

<code>        </code><code>&lt;excludeexpression=</code><code>"^static/*"</code><code>&gt;&lt;/exclude&gt;</code>

<code>    </code><code>&lt;/filter&gt;</code>

<code>    </code><code>&lt;inotify&gt;</code>

<code>        </code><code>&lt;</code><code>delete</code> <code>start=</code><code>"true"</code><code>/&gt;</code>

<code>        </code><code>&lt;createFolderstart=</code><code>"true"</code><code>/&gt;</code>

<code>        </code><code>&lt;createFilestart=</code><code>"false"</code><code>/&gt;</code>

<code>        </code><code>&lt;closeWritestart=</code><code>"true"</code><code>/&gt;</code>

<code>        </code><code>&lt;moveFromstart=</code><code>"true"</code><code>/&gt;</code>

<code>        </code><code>&lt;moveTo start=</code><code>"true"</code><code>/&gt;</code>

<code>        </code><code>&lt;attrib start=</code><code>"false"</code><code>/&gt;</code>

<code>        </code><code>&lt;modify start=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>&lt;/inotify&gt;</code>

<code>    </code><code>&lt;sersync&gt;</code>

<code>        </code><code>&lt;localpathwatch=</code><code>"/data/www"</code><code>&gt;</code>

<code>            </code><code>&lt;remoteip=</code><code>"172.16.1.25"</code> <code>name=</code><code>"www"</code><code>/&gt;</code>

<code>            </code><code>&lt;remoteip=</code><code>"172.16.1.26"</code> <code>name=</code><code>"www"</code><code>/&gt;</code>

<code>        </code><code>&lt;/localpath&gt;</code>

<code>        </code><code>&lt;!--################################################## --&gt;</code>

<code>        </code><code>&lt;localpathwatch=</code><code>"/data/bbs"</code><code>&gt;</code>

<code>            </code><code>&lt;remoteip=</code><code>"172.16.1.25"</code> <code>name=</code><code>"bbs"</code><code>/&gt;</code>

<code>            </code><code>&lt;remoteip=</code><code>"172.16.1.26"</code> <code>name=</code><code>"bbs"</code><code>/&gt;</code>

<code>        </code><code>&lt;localpathwatch=</code><code>"/data/blog"</code><code>&gt;</code>

<code>            </code><code>&lt;remoteip=</code><code>"172.16.1.25"</code> <code>name=</code><code>"blog"</code><code>/&gt;</code>

<code>            </code><code>&lt;remoteip=</code><code>"172.16.1.26"</code> <code>name=</code><code>"blog"</code><code>/&gt;</code>

<code>        </code><code>&lt;!-- ##################################################--&gt;</code>

<code>            </code><code>&lt;auth start=</code><code>"true"</code><code>users=</code><code>"rsync_backup"</code><code>passwordfile=</code><code>"/etc/rsync.password"</code><code>/&gt;</code>

<code>            </code><code>&lt;userDefinedPortstart=</code><code>"false"</code> <code>port=</code><code>"874"</code><code>/&gt;&lt;!-- port=</code><code>874</code> <code>--&gt;</code>

<code>            </code><code>&lt;timeout start=</code><code>"true"</code><code>time=</code><code>"100"</code><code>/&gt;&lt;!-- timeout=</code><code>100</code> <code>--&gt;</code>

<code>            </code><code>&lt;sshstart=</code><code>"false"</code><code>/&gt;</code>

<code>        </code><code>&lt;failLogpath=</code><code>"/usr/local/sersync/logs/rsync_fail_log.sh"</code><code>timeToExecute=</code><code>"60"</code><code>/&gt;&lt;!--</code><code>default</code> <code>every 60mins execute once--&gt;</code>

<code>        </code><code>&lt;crontab start=</code><code>"false"</code><code>schedule=</code><code>"600"</code><code>&gt;&lt;!--600mins--&gt;</code>

<code>            </code><code>&lt;crontabfilterstart=</code><code>"false"</code><code>&gt;</code>

<code>                </code><code>&lt;excludeexpression=</code><code>"*.php"</code><code>&gt;&lt;/exclude&gt;</code>

<code>                </code><code>&lt;excludeexpression=</code><code>"info/*"</code><code>&gt;&lt;/exclude&gt;</code>

<code>            </code><code>&lt;/crontabfilter&gt;</code>

<code>        </code><code>&lt;/crontab&gt;</code>

<code>        </code><code>&lt;plugin start=</code><code>"false"</code><code>name=</code><code>"command"</code><code>/&gt;</code>

<code>    </code><code>&lt;/sersync&gt;</code>

<code>    </code><code>&lt;plugin name=</code><code>"command"</code><code>&gt;</code>

<code>        </code><code>&lt;param prefix=</code><code>"/bin/sh"</code><code>suffix=</code><code>""</code> <code>ignoreError=</code><code>"true"</code><code>/&gt;  &lt;!--prefix /opt/tongbu/mmm.sh suffix--&gt;</code>

<code>        </code><code>&lt;filter start=</code><code>"false"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>include</code> <code>expression=</code><code>"(.*)\.php"</code><code>/&gt;</code>

<code>            </code><code>&lt;includeexpression=</code><code>"(.*)\.sh"</code><code>/&gt;</code>

<code>        </code><code>&lt;/filter&gt;</code>

<code>    </code><code>&lt;/plugin&gt;</code>

<code>    </code><code>&lt;plugin name=</code><code>"socket"</code><code>&gt;</code>

<code>        </code><code>&lt;localpathwatch=</code><code>"/opt/tongbu"</code><code>&gt;</code>

<code>            </code><code>&lt;deshostip=</code><code>"192.168.138.20"</code> <code>port=</code><code>"8009"</code><code>/&gt;</code>

<code>    </code><code>&lt;plugin name=</code><code>"refreshCDN"</code><code>&gt;</code>

<code>        </code><code>&lt;localpathwatch=</code><code>"/data0/htdocs/cms.xoyo.com/site/"</code><code>&gt;</code>

<code>            </code><code>&lt;cdninfodomainname=</code><code>"ccms.chinacache.com"</code> <code>port=</code><code>"80"</code><code>username=</code><code>"xxxx"</code> <code>passwd=</code><code>"xxxx"</code><code>/&gt;</code>

<code>            </code><code>&lt;sendurlbase=</code><code>"http://pic.xoyo.com/cms"</code><code>/&gt;</code>

<code>            </code><code>&lt;regexurlregex=</code><code>"false"</code><code>match=</code><code>"cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"</code><code>/&gt;</code>

<code>&lt;/head&gt;</code>

3、開啟sersync守護程序同步資料

啟動指令

<code>[root@web ~]# /usr/local/sersync/sersync2  -d -r -o /usr/local/sersync/confxml.xml</code>

<code>配置sersync環境變量</code>

<code>[root@web ~]# echo</code><code>"PATH=$PATH:/usr/local/sersync/"</code><code>&gt;&gt;/etc/profile</code>

<code>[root@web ~]# source /etc/profile</code>

<code>[root@web ~]# sersync2</code>

啟動指令後傳回結果如下為正常:

<code>set</code> <code>the system param</code>

<code>execute:echo50000000 &gt; /proc/sys/fs/inotify/max_user_watches</code>

<code>execute:echo </code><code>327679</code><code>&gt; /proc/sys/fs/inotify/max_queued_events</code>

<code>parse the command param</code>

<code>option: -d      run </code><code>as</code> <code>a daemon</code>

<code>option: -r      rsync all the local files to the remoteservers before the sersync work</code>

<code>option: -o      config xml name:  /usr/local/sersync/confxml.xml</code>

<code>daemon thread num: </code><code>10</code>

<code>parse xml config file</code>

<code>host ip : localhost     host port: </code><code>8008</code>

<code>daemon start,sersync runbehind the console </code>

<code>use</code> <code>rsync password-file :</code>

<code>user </code><code>is</code> <code>rsync_backup</code>

<code>passwordfile </code><code>is</code>         <code>/etc/rsync.password</code>

<code>config xml parse success</code>

<code>please </code><code>set</code> <code>/etc/rsyncd.confmax connections=</code><code>0</code> <code>Manually</code>

<code>sersync working thread </code><code>12</code>  <code>= </code><code>1</code><code>(primary thread) + </code><code>1</code><code>(fail retry thread) + </code><code>10</code><code>(daemon sub threads)</code>

<code>Max threads numbers </code><code>is</code><code>: </code><code>32</code> <code>= </code><code>12</code><code>(Thread pool nums) +</code><code>20</code><code>(Sub threads)</code>

<code>please according your cpu ,</code><code>use</code> <code>-n paramto adjust the cpu rate</code>

<code>chmod: cannot access`/usr/local/sersync/logs/rsync_fail_log.sh': No such file or directory</code>

<code>------------------------------------------</code>

<code>rsync the directory recursivlyto the remote servers once</code>

<code>working please wait...</code>

<code>execute command: cd /data/www&amp;&amp; rsync -artuz -R --</code><code>delete</code> <code>./ --timeout=</code><code>100</code> <code>rsync_backup@</code><code>172.16</code><code>.</code><code>1.25</code><code>::www--password-file=/etc/rsync.password &gt;/dev/</code><code>null</code> <code>2</code><code>&gt;&amp;</code><code>1</code> 

<code>run the sersync: </code>

<code>watch path </code><code>is</code><code>: /data/www</code>

補充: 多執行個體情況

    1、配置多個confxml.xml檔案(比如:www、bbs、blog....等等)

    2、根據不同的需求同步對應的執行個體檔案

<code>/usr/local/sersync/sersync2  -d -o /usr/local/sersync/www_confxml.xml</code>

<code>/usr/local/sersync/sersync2  -d -o /usr/local/sersync/bbs_confxml.xml</code>

<code>/usr/local/sersync/sersync2  -d -o /usr/local/sersync/blog_confxml.xml</code>

<code># 多執行個體初始化同步指令:</code>

<code>/usr/local/sersync/sersync2 -r-d -o /usr/local/sersync/www_confxml.xml</code>

<code>/usr/local/sersync/sersync2 -r-d -o /usr/local/sersync/bbs_confxml.xml</code>

<code>/usr/local/sersync/sersync2 -r-d -o /usr/local/sersync/blog_confxml.xml</code>

<code> </code> 

<code>/bin/cp /etc/rc.local/etc/rc.local_$(data +%F)</code>

<code>cat&gt;&gt;/etc/rc.local&lt;&lt;EOF</code>

<code>#sync data to </code><code>25</code> <code>26</code>

<code>EOF</code>

壓測:寫入10K個檔案批量同步測試結果:

<code># </code><code>for</code> <code>n </code><code>in</code> <code>`seq </code><code>10000</code><code>`;</code><code>do</code> <code>echodddd&gt;www/$n.txt;done</code>

<code># ps -ef |greprsync</code>

<code>root     </code><code>17283</code>    <code>1</code>  <code>0</code> <code>Jun05 ?        </code><code>00</code><code>:</code><code>00</code><code>:</code><code>02</code> <code>/usr/local/sersync/sersync2 -d-r -o /usr/local/sersync/confxml.xml</code>

<code>root     </code><code>19363</code>    <code>1</code>  <code>0</code> <code>Jun05 ?        </code><code>00</code><code>:</code><code>00</code><code>:</code><code>01</code> <code>/usr/local/sersync/bin -d -o/usr/local/sersync/confxml.xml</code>

<code>root     </code><code>19394</code>    <code>1</code>  <code>0</code> <code>Jun05 ?        </code><code>00</code><code>:</code><code>00</code><code>:</code><code>01</code> <code>/usr/local/sersync/bin -r -d-o /usr/local/sersync/confxml.xml</code>

<code>root     </code><code>19414</code>    <code>1</code>  <code>0</code> <code>Jun05 ?        </code><code>00</code><code>:</code><code>00</code><code>:</code><code>01</code> <code>/usr/local/sersync/bin -r -d-o /usr/local/sersync/confxml.xml</code>

<code>root     </code><code>29484</code> <code>17283</code>  <code>0</code> <code>01</code><code>:</code><code>33</code> <code>?        </code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code> <code>sh -c cd /data/www &amp;&amp;rsync -artuz -R  --timeout=</code><code>100</code><code>"./395.txt"</code> <code>rsync_backup@</code><code>172.16</code><code>.</code><code>1.25</code><code>::www--password-file=/etc/rsync.password &gt;/dev/</code><code>null</code> <code>2</code><code>&gt;&amp;</code><code>1</code> 

<code>root     </code><code>29487</code> <code>29484</code>  <code>0</code> <code>01</code><code>:</code><code>33</code> <code>?        </code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code> <code>rsync -artuz -R --timeout=</code><code>100</code><code>./</code><code>395</code><code>.txt rsync_backup@</code><code>172.16</code><code>.</code><code>1.25</code><code>::www --password-file=/etc/rsync.password</code>

<code>root     </code><code>29490</code> <code>17283</code>  <code>0</code> <code>01</code><code>:</code><code>33</code> <code>?        </code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code> <code>sh -c cd /data/www &amp;&amp;rsync -artuz -R  --timeout=</code><code>100</code><code>"./396.txt"</code> <code>rsync_backup@</code><code>172.16</code><code>.</code><code>1.25</code><code>::www--password-file=/etc/rsync.password &gt;/dev/</code><code>null</code> <code>2</code><code>&gt;&amp;</code><code>1</code> 

<code>提示:我們發現本地已經寫完了</code><code>10000</code><code>個,但是同步的線程,依然在同步;甚至才同步了</code><code>1000</code><code>多個</code>

2.6 檢查節點是否同步成功

WEB1 同步檢視對比

WEB2 同步檢視對比

[root@web1 data]# du /data/www/

26944   /data/www/

26964   /data/www/

27024   /data/www/

27036   /data/www/

[root@web2 data]# du /data/www/

26880   /data/www/

26908   /data/www/

26940   /data/www/

26960   /data/www/

每秒同步20--30個檔案

每秒同步20-30個檔案

三、指令參數說明

Sersync參數

說明

./sersync -r

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

提别說明:如果設定了過濾器,即在xml檔案中,filter為true,則暫時不能使用-r參數進行整體同步;

./sersync -o xx.xml

不指定 -o參數: sersync使用sersync可執行檔案目錄下的預設配置檔案confxml.xml

指定 -o 參數:可以指定多個不同的配置檔案,進而實作sersync多程序多執行個體的資料同步

./sersync -n num

-n參數為:指定預設的線程池的線程總數;

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

./sersync -d

-d參數為:背景服務,通常情況下使用 -r參數對本地到遠端整體同步一遍後,在背景運作此參數啟動守護程序實時同步;在第一次整體同步時,-d 和 -r參數經常會聯合使用;

./sersync -m

pluginName

-m參數:不進行同步,隻運作插件 ./sersync -m pluginName

例如:./sersync -m command,則在監控到事件後,不對遠端目标伺服器進行同步,而是直接運作command插件

組合指令使用說明:

-n 8 -o liubl.xml -r -d

多個參數可以配合使用,例如:./sersync -n 16 -o config.xml -r -d 表示設定線程池工作線程為16個,指定liubl.xml作為配置檔案,在實時監控前 做一次整體同步,以守護程序方式在背景運作;

./sersync --help

很遺憾,它沒有檢視幫助(需要的話2條路,要麼看源代碼,要麼自測求驗證)

四、sersync服務配置檔案參數詳解

4.1 初始的配置檔案

    sersync可選功能是通過xml配置檔案來實作的,基本配置檔案如下:

<code>[root@cache sersync]# cat confxml.xml.</code><code>2015</code><code>-</code><code>06</code><code>-</code><code>05</code> 

<code>     </code><code>1</code> <code>&lt;?xml version=</code><code>"1.0"</code> <code>encoding=</code><code>"ISO-8859-1"</code><code>?&gt;</code>

<code>     </code><code>2</code> <code>&lt;head version=</code><code>"2.5"</code><code>&gt;</code>

<code>     </code><code>3</code>     <code>&lt;host hostip=</code><code>"localhost"</code> <code>port=</code><code>"8008"</code><code>&gt;&lt;/host&gt;</code>

<code>     </code><code>4</code>     <code>&lt;debug start=</code><code>"false"</code><code>/&gt;</code>

<code>     </code><code>5</code>     <code>&lt;fileSystem xfs=</code><code>"false"</code><code>/&gt;</code>

<code>     </code><code>6</code>     <code>&lt;filter start=</code><code>"false"</code><code>&gt;</code>

<code>     </code><code>7</code>         <code>&lt;exclude expression=</code><code>"(.*)\.svn"</code><code>&gt;&lt;/exclude&gt;</code>

<code>     </code><code>8</code>         <code>&lt;exclude expression=</code><code>"(.*)\.gz"</code><code>&gt;&lt;/exclude&gt;</code>

<code>     </code><code>9</code>         <code>&lt;exclude expression=</code><code>"^info/*"</code><code>&gt;&lt;/exclude&gt;</code>

<code>    </code><code>10</code>         <code>&lt;exclude expression=</code><code>"^static/*"</code><code>&gt;&lt;/exclude&gt;</code>

<code>    </code><code>11</code>     <code>&lt;/filter&gt;</code>

<code>    </code><code>12</code>     <code>&lt;inotify&gt;</code>

<code>    </code><code>13</code>         <code>&lt;</code><code>delete</code> <code>start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>14</code>         <code>&lt;createFolder start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>15</code>         <code>&lt;createFile start=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>16</code>         <code>&lt;closeWrite start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>17</code>         <code>&lt;moveFrom start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>18</code>         <code>&lt;moveTo start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>19</code>         <code>&lt;attrib start=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>20</code>         <code>&lt;modify start=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>21</code>     <code>&lt;/inotify&gt;</code>

<code>    </code><code>22</code>

<code>    </code><code>23</code>     <code>&lt;sersync&gt;</code>

<code>    </code><code>24</code>         <code>&lt;localpath watch=</code><code>"/opt/tongbu"</code><code>&gt;</code>

<code>    </code><code>25</code>              <code>&lt;remoteip=</code><code>"127.0.0.1"</code> <code>name=</code><code>"tongbu1"</code><code>/&gt;</code>

<code>    </code><code>26</code>              <code>&lt;!--&lt;remoteip=</code><code>"192.168.8.39"</code> <code>name=</code><code>"tongbu"</code><code>/&gt;--&gt;</code>

<code>    </code><code>27</code>              <code>&lt;!--&lt;remoteip=</code><code>"192.168.8.40"</code> <code>name=</code><code>"tongbu"</code><code>/&gt;--&gt;</code>

<code>    </code><code>28</code>         <code>&lt;/localpath&gt;</code>

<code>    </code><code>29</code>         <code>&lt;rsync&gt;</code>

<code>    </code><code>30</code>              <code>&lt;commonParamsparams=</code><code>"-artuz"</code><code>/&gt;</code>

<code>    </code><code>31</code>              <code>&lt;auth start=</code><code>"false"</code><code>users=</code><code>"root"</code> <code>passwordfile=</code><code>"/etc/rsync.pas"</code><code>/&gt;</code>

<code>    </code><code>32</code>              <code>&lt;userDefinedPortstart=</code><code>"false"</code> <code>port=</code><code>"874"</code><code>/&gt;&lt;!-- port=</code><code>874</code> <code>--&gt;</code>

<code>    </code><code>33</code>              <code>&lt;timeoutstart=</code><code>"false"</code> <code>time=</code><code>"100"</code><code>/&gt;&lt;!-- timeout=</code><code>100</code> <code>--&gt;</code>

<code>    </code><code>34</code>              <code>&lt;sshstart=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>35</code>         <code>&lt;/rsync&gt;</code>

<code>    </code><code>36</code>         <code>&lt;failLog path=</code><code>"/tmp/rsync_fail_log.sh"</code><code>timeToExecute=</code><code>"60"</code><code>/&gt;&lt;!--</code><code>default</code> <code>every 60mins execute once--&gt;</code>

<code>    </code><code>37</code>         <code>&lt;crontab start=</code><code>"false"</code><code>schedule=</code><code>"600"</code><code>&gt;&lt;!--600mins--&gt;</code>

<code>    </code><code>38</code>              <code>&lt;crontabfilterstart=</code><code>"false"</code><code>&gt;</code>

<code>    </code><code>39</code>                  <code>&lt;excludeexpression=</code><code>"*.php"</code><code>&gt;&lt;/exclude&gt;</code>

<code>    </code><code>40</code>                  <code>&lt;excludeexpression=</code><code>"info/*"</code><code>&gt;&lt;/exclude&gt;</code>

<code>    </code><code>41</code>              <code>&lt;/crontabfilter&gt;</code>

<code>    </code><code>42</code>         <code>&lt;/crontab&gt;</code>

<code>    </code><code>43</code>         <code>&lt;plugin start=</code><code>"false"</code> <code>name=</code><code>"command"</code><code>/&gt;</code>

<code>    </code><code>44</code>     <code>&lt;/sersync&gt;</code>

<code>    </code><code>45</code>

<code>    </code><code>46</code>     <code>&lt;plugin name=</code><code>"command"</code><code>&gt;</code>

<code>    </code><code>47</code>         <code>&lt;param prefix=</code><code>"/bin/sh"</code> <code>suffix=</code><code>""</code><code>ignoreError=</code><code>"true"</code><code>/&gt; &lt;!--prefix /opt/tongbu/mmm.sh suffix--&gt;</code>

<code>    </code><code>48</code>         <code>&lt;filter start=</code><code>"false"</code><code>&gt;</code>

<code>    </code><code>49</code>              <code>&lt;includeexpression=</code><code>"(.*)\.php"</code><code>/&gt;</code>

<code>    </code><code>50</code>              <code>&lt;includeexpression=</code><code>"(.*)\.sh"</code><code>/&gt;</code>

<code>    </code><code>51</code>         <code>&lt;/filter&gt;</code>

<code>    </code><code>52</code>     <code>&lt;/plugin&gt;</code>

<code>    </code><code>53</code>

<code>    </code><code>54</code>      <code>&lt;plugin name=</code><code>"socket"</code><code>&gt;</code>

<code>    </code><code>55</code>         <code>&lt;localpath watch=</code><code>"/opt/tongbu"</code><code>&gt;</code>

<code>    </code><code>56</code>              <code>&lt;deshostip=</code><code>"192.168.138.20"</code> <code>port=</code><code>"8009"</code><code>/&gt;</code>

<code>    </code><code>57</code>         <code>&lt;/localpath&gt;</code>

<code>    </code><code>58</code>     <code>&lt;/plugin&gt;</code>

<code>    </code><code>59</code>     <code>&lt;plugin name=</code><code>"refreshCDN"</code><code>&gt;</code>

<code>    </code><code>60</code>         <code>&lt;localpath watch=</code><code>"/data0/htdocs/cms.xoyo.com/site/"</code><code>&gt;</code>

<code>    </code><code>61</code>              <code>&lt;cdninfodomainname=</code><code>"ccms.chinacache.com"</code> <code>port=</code><code>"80"</code><code>username=</code><code>"xxxx"</code> <code>passwd=</code><code>"xxxx"</code><code>/&gt;</code>

<code>    </code><code>62</code>              <code>&lt;sendurlbase=</code><code>"http://pic.xoyo.com/cms"</code><code>/&gt;</code>

<code>    </code><code>63</code>              <code>&lt;regexurlregex=</code><code>"false"</code> <code>match=</code><code>"cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"</code><code>/&gt;</code>

<code>    </code><code>64</code>         <code>&lt;/localpath&gt;</code>

<code>    </code><code>65</code>     <code>&lt;/plugin&gt;</code>

<code>    </code><code>66</code> <code>&lt;/head&gt;</code>

4.2 xml配置檔案說明

    說明: xml配置檔案的注釋不用“#”,而是&lt;!-- 中間是注釋内容 --&gt;

<code>     </code><code>3</code>     <code>&lt;host hostip=</code><code>"localhost"</code><code>port=</code><code>"8008"</code><code>&gt;&lt;/host&gt;</code>

hostip與port是針對插件的保留字段,對于同步功能沒有任何作用,保留預設即可;

4.3 Debug開啟開關

設定為true,表示開啟debug模式,會在sersync正在運作的控制台列印inotify時間與rsync同步指令;

4.4 XFS檔案系統開關

對于xfs檔案系統的使用者,需要将這個選項開啟,才能使用sersync正常工作;

4.5 filter檔案過濾功能

    說明:一般情況下,不給用戶端添加過濾,如有必要才添加;

對于大多數應用,可以嘗試把createFile(監控檔案事件選項)設定為false來提高性能,減少rsync通訊;

因為拷貝檔案到監控目錄會産生create事件與close_write事件,是以如果關閉create事件,隻監控檔案拷貝結束時的時間close_write,同樣可以實作檔案完整同步;

注意:強将creatFolder保持為true,如果将createFolder設為false,則不會對産生的目錄進行監控,該目錄下的子檔案與子目錄也不會被監控;是以除非特殊需要,請開啟; 預設情況下對建立檔案(目錄)事件與删除檔案(目錄)事件都進行監控,如果項目中不需要删除遠端目标伺服器的檔案(目錄),則可以将delete參數設定為false,則不對删除事件進行監控;

本文轉自奔跑在路上部落格51CTO部落格,原文連結http://blog.51cto.com/qiangsh/1871844如需轉載請自行聯系原作者

qianghong000