Linux課程筆記 Rsync數據同步服務

一 Rsyncphp

1. Rsync介紹正則表達式

Rsync具備可以使本地主機不一樣分區或目錄之間及本地和遠程兩臺主機之間的數據快速同步鏡像,遠程備份等功能。算法

在同步備份時,默認狀況下,Rsync經過獨特的「quick  check」算法,僅同步大小或者最後修改時間發生變化的文件或目錄(也可根據權限,屬主等變化同步,須要指定參數),甚至是隻同步一個文件裏有變化的內容部分,因此可實現快速的同步數據的功能。shell

 

2. Rsync的特性express

  • 支持拷貝特殊文件如連接,設備等
  • 能夠排除指定文件或目錄同步的功能,至關於打包命令tar
  • 能夠作到保持原來文件或目錄的權限、時間、軟硬連接等全部屬性均不變
  • 可實現增量同步,既只同步發生變化的數據
  • 可使用rcp、rsh、ssh等方式來配合傳輸文件,也能夠經過直接的socket鏈接
  • 支持匿名的或認證的進程模式傳輸,方便進行數據備份及鏡像

 

3. Rsync的工做方式安全

Rsync大體使用三種主要的方法來傳輸數據,分別爲bash

(1) 本地數據傳輸服務器

(2) 經過rcp、ssh等傳輸通道架構

(3) 以守護進程的方式傳輸數據併發

 

Rsync本地傳輸的語法爲:

rsync  [OPTION]  SRC  DEST

 

語法說明:

1)  Rsync爲同步的命令

2)  [OPTION]爲同步時的參數選項

3)  SRC爲源,即待拷貝的分區、文件或目錄等

4)  [DEST]爲目的分區、文件或目錄等

 

特別提示:請注意如下命令的差異:

1)  rsync  -avz  /opt/  /tmp

2)  rsync  -avz  /opt   /tmp

1)中/opt/意思是,僅把/opt/目錄裏的內容同步過來,opt目錄自己並不一樣步;然後者2)中/opt表示把opt自己及其所有內容都同步到/tmp下,僅一個/之差,意義就大不一樣。

 

經過遠程shell進行數據傳輸(remote  shell  mode)

經過遠程shell(rcp、ssh等)傳輸能夠分爲兩種狀況,其語法分別爲

拉取:rsync  [OPTION]  [USER@]HOST:SRC  DEST

推送:rsync  [OPTION]  SRC   [USER@]HOST:DEST

 

拉取實例:

rsync   -vzrtopg  --progress  -e  ‘ssh  -p  22’  oldboy@192.168.1.4:/opt  /tmp

-vzrtopg至關於上文的-avz,表示同步文件和目錄屬性不變

--progress顯示同步的過程,能夠用-P替換

-e  ‘ssh  -p  22’表示經過ssh的通道傳輸數據,-p  22能夠省略

 

使用守護進程的方式數據傳輸:

經過守護進程方式傳輸一樣分爲兩種狀況,每種狀況又分爲兩種語法:

拉取:

1)rsync  [OPTION]  [USER@]HOST::SRC  DEST

2)  rsync  [OPTION] rsync:// [USER@]HOST[:PORT]/SRC  [DEST]

 

推送:

1)   rsync  [OPTION] SRC  [USER@]HOST::DEST

2)   rsync  [OPTION] SRC  rsync://[USER@]HOST[:PORT]/DEST

值得注意的是,與遠程shell方式的命令不一樣的是,第1種語法格式,均爲雙冒號鏈接。另外,這個SRC或DEST也再也不是路徑了,而是守護進程中配置的模塊名稱。

 

4. Rsync命令同步參數選項

經常使用參數選項說明:

-v,--verbose詳細模式輸出,傳輸時的進度等信息

-z,--compress傳輸時進行壓縮以提升傳輸效率,--compress-level=NUM可按級別壓縮

-r,--recursive對子目錄以遞歸模式,即目錄下的全部目錄都一樣傳輸,注意是小寫r

-t,--times保持文件時間信息

-o,--owner保持未見屬主信息

-p,--perms保持文件權限

-g,--group保持文件屬組信息

-P,--progress顯示同步的過程及傳輸時的進度等信息

-a,--archive歸檔模式,表示以遞歸方式傳輸文件,並保持全部文件屬性,等於-rtopgDl

-e,--rsh=COMMAND使用的信道協議,指定代替rsh的shell程序

--exclude=PATTERN指定排除不須要傳輸的文件模式

-D,--devices保持設備文件信息

-l,--links保留軟連接

 

5. 開始部署rsync服務--Rsync服務端操做過程:

5.1  配置rsyncd.conf

1)  配置rsyncd.conf

2)  配置文件經常使用參數選項說明:

rsyncd.conf參數

參數說明

uid = root

rsync使用的用戶,缺省uid爲-2,一般爲nobody

gid = root

rsync使用的組,缺省gid爲-2,一般爲nobody

use chroot = no

若是爲true,daemon會在客戶端傳輸文件前「chroot to the path」。這是rsync安全的一個配置,由於咱們大多數都是在內網使用,因此不配也能夠

max  connections = 200

設置最大鏈接數,默認爲0,意味無限制,負值爲關閉這個模塊

timeout = 400

默認爲0,意味着no  timeout,建議爲300-600(5-10分鐘)

pid file =/var/run/rsyncd.pid

rsync  daemon啓動後將其進程PID寫入此文件,若是這個文件進程不會覆蓋該文件,而是會終止

lock file = /var/run/rsyncd.lock

指定lock文件用來支持「max connection」參數,使得總鏈接數不會超過限制,默認爲/var/run/rsyncd.lock

log  file = /var/run/rsyncd.log

不設或者設置錯誤,rsync會使用syslog輸出相關日誌信息

ignore  errors

忽略I/O錯誤

read  only

指定客戶端是否能夠上傳文件,默認對全部模塊都爲true

list = false

是否容許客戶端能夠查看可用模塊列表,默承認以

hosts  allow = 10.0.0.0/24

指定能夠聯繫的客戶端主機名或ip地址或地址段,默認狀況沒有此參數,即均可以鏈接

host deny = 0.0.0.0/32

指定不能夠聯繫的客戶端主機名和ip地址,默認狀況沒有此參數,即均可以鏈接

auth  users  = rsync_backup

指定以空格或逗號分隔的用戶能夠哪些模塊,用戶不須要在本地系統中存在,默認全部用戶無密碼的訪問(anonymous rsync)

secrets  file = /etc/rsyncd.password

指定用戶名和密碼存放的文件,格式:用戶名:密碼,密碼不超過8位

[oldboy]

這裏就是模塊名稱,須要用中括號括起來,起名沒有特殊要求,但最好是有意義的名稱,便於之後維護

path = /oldboy/

在這個模塊中,daemon使用的文件系統或目錄,目錄的權限要注意和配置文件中的權限一直,不然會遇到讀寫問題

#exclude = a b c/2

排除的文件或目錄,相對路徑

特別說明:若是配置中的path = /oldboy/提到的路徑不存在,則須要建立,命令爲:

mkdir  -p /oldboy/

chmod  -R  root.root  /oldboy  #受權權限能夠根據配置文件中的屬主來設定。

 

5.2 配置用於rsync同步的帳號、密碼及帳號文件權限

#auth

echo  「rsync_backup:oldboy」>/etc/rsyncd.password

#注意:其中rsync_backup:oldboy中的rsync_backup爲同步傳輸用到的虛擬帳號,這個帳號僅爲rsync的帳號,不須要是系統帳號,。後面的oldboy爲密碼,不超過8位,帳號和密碼中間用冒號分割。

 

chmod  600  /etc/rsyncd.password   #必須爲600權限

 

#check

cat  /etc/rsyncd.password

ll  /etc/rsync.password

 

 

5.3 啓動rsync服務

以守護進程方式來啓動rsync服務:

rsync  --daemon  #daemon表示以守護進程的方式啓動rsync服務

--address     #綁定指定IP地址提供服務,適用於多網卡的服務器

--config=FILE  #更改配置文件路徑,而不是默認的/etc/rsyncd.conf

--port=Port   更改其餘端口提供服務,而不是缺省的873端口

提示:以上幾個選項爲了解內容,生產場景使用的很少

 

5.4 設置rsync服務開機自啓動

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

 

也可使用chkconfig  rsync  on命令(適用於設置其餘服務爲開機自啓動服務)

#從Windows系統拷貝到Linux系統的文件須要轉換格式:

[root@test2 ~]# dos2unix /etc/init.d/rsyncd

dos2unix: converting file /etc/init.d/rsyncd to UNIX format ...

 

[root@test2 ~]# cat /etc/init.d/rsyncd

#!/bin/sh

#author oldboy QQ 31333741

#

# rsync       Start/Stop Rsync service

#

# chkconfig: 35 13 91

# description: This is Rsync service management shell script

# processname: rsyncd

 

# Source function library.

. /etc/rc.d/init.d/functions

 

start(){

        rsync --daemon

        if [ $? -eq 0 -a `ps -ef|grep -v grep|grep rsync|wc -l` -gt 0 ];then

          action "Starting Rsync:" /bin/true

          sleep 1

        else

          action "Starting Rsync:" /bin/false

          sleep 1

        fi

}

stop(){

        pkill rsync;sleep 1;pkill rsync

        #if [ $? -eq 0 -a `ps -ef|grep -v grep|grep rsync|wc -l` -lt 1 ];then

        if [ `ps -ef|grep -v grep|grep "rsync --daemon"|wc -l` -lt 1 ];then

 

          action "Stopping Rsync: `ps -ef|grep -v grep|grep rsync|wc -l` " /bin/true

          sleep 1

        else

          action "Stopping Rsync: `ps -ef|grep -v grep|grep "rsync --daemon"|wc -l` " /bin/false

          sleep 1

        fi

}

 

case "$1" in

   start)

      start;

     ;;

   stop)

     stop

     ;;

   restart|reload)

    $0 stop;

    $0 start;

     ;;

  *)

        echo $"Usage: $0 {start|stop|restart|reload}"

        ;;

esac

 

#/etc/init.d/rsyncd文件的權限爲700,root用戶

[root@test2 ~]# chkconfig rsyncd on

[root@test2 ~]# chkconfig --list rsyncd

rsyncd          0:關閉  1:關閉  2:啓用  3:啓用  4:啓用  5:啓用  6:關閉

這裏之因此可使用chkconfig設置爲開機自啓動,是由於老師寫的文件比較規範了,要學習這裏的格式。

 

[root@test2 ~]# service rsyncd start

Failed to parse config file: /etc/rsyncd.conf

Starting Rsync:                                            [失敗]

[root@test2 ~]# /etc/init.d/rsyncd start

Failed to parse config file: /etc/rsyncd.conf

Starting Rsync:                                            [失敗]

這裏設置開機自啓動失敗,是由於我沒有配置/etc/rsyncd.conf這個配置文件。

配置文件以下:

[root@test2 ~]# cat /etc/rsyncd.conf

#rsync_config_______________start

#created by oldboy 15:01 2007-6-5

#QQ 31333741 blog:http://oldboy.blog.51cto.com

##rsyncd.conf start##

uid = root

gid = root

use chroot = no

max connections = 200

timeout = 300

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

[oldboy]

path = /oldboy/

ignore errors

read only = false

list = false

hosts allow = 10.0.0.0/24

hosts deny = 0.0.0.0/32

auth users = rsync_backup

secrets file = /etc/rsync.password

 

[root@test2 ~]# service rsyncd start

Starting Rsync:                                            [肯定]

[root@test2 ~]#

[root@test2 ~]#

[root@test2 ~]# /etc/init.d/rsyncd stop

已終止

 

 

重啓rsync的組合命令

pkill  rsync        #關閉rsync服務

rsync  --daemon   #啓動rsync服務

ps  -ef  | grep  rsync   #檢查rsync服務

 

[root@test2 ~]# netstat -tupnl |grep 873

tcp      0     0 0.0.0.0:873        0.0.0.0:*                LISTEN      4380/rsync         

tcp      0     0 :::873            :::*                     LISTEN      4380/rsync         

[root@test2 ~]# ps -ef | grep -v grep | grep rsync

root      4380     1  0 16:56 ?        00:00:00 rsync --daemon

 

6. 開始部署Rsync服務--Rsync客戶端操做過程

6.1 配置rsync帳號及帳號文件權限

請注意與服務端的配置的區別

echo  「oldboy」 > /etc/rsyncd.password  #這裏僅配置了密碼,不須要帳號。這是與服務端的區別。

chmod  600  /etc/rsyncd.password     #必須爲600權限

到此rsync服務配置大功告成!

 

7. 檢查部署的Rsync服務:

默認狀況下,如下均在客戶端rsync客戶端執行操做:下面以[ip:192.168.1..4]爲例說明:

從客戶端推送/etc目錄到服務器rsync指定的目錄下:

推送方法結論:--delete參數的做用,它可使本地的目錄和rsync服務端指定的目錄實現徹底同步,即本地有啥遠端就有啥,本地沒有的,遠端也必須刪除。確保數據一致。推送時使用--delete命令有使遠端rsync服務端的目錄數據丟失的風險。

 

 

二 Sersync應用指南

2.1 項目簡介

Sersync項目利用inotify與rsync技術實現對服務器數據實時同步解決方案,其中inotify用於監控sersync所在服務器上文件系統的事件變化,rsync是目前普遍使用的本地及異地數據同步工具

 

2.2 基本架構

 

 

(1)       線程組是線程是等待線程隊列的守護線程,設計的目的是可以同時處理多個inotify事件,從而提高服務器的併發同步能力

(2)       服務線程的三個做用:

a.  首先是處理同步失敗的文件,將這些文件再次同步,對於再次同步失敗的文件會生成rsync_fail_log.sh腳本,記錄失敗的事件

b.  每隔10個小時執行腳本,同時清空腳本

c.  第三個做用是crontab功能,能夠每隔必定時間,將全部路徑總體同步一次

 

(3)       過濾隊列的創建是爲了過濾短期內產生的重複inotify信息,例如在刪除文件夾的時候,inotify就會同時產生刪除文件夾裏的文件與刪除文件夾的時間,經過過濾隊列,當刪除文件夾時間產生的時候,會將以前加入隊列的刪除文件的時間所有過濾掉,這樣只產生一條刪除文件夾的事件。

 

2.3  Sersync邏輯需求

當前版本的sersync依賴於rsync進行數據同步,在同步主服務器(Master)上開啓sersync,sersync負責監控配置路徑中的文件系統事件變化,而後調用rsync命令把更新的文件同步到目標服務器(Slave),所以,須要在主服務器配置sersync,在同步目標服務器配置rsync server(注意,是rsync服務)

 

2.4  配置同步服務器

2.4.1  Slave上部署rsync服務

(1) 升級rsync到3.0

(2) 寫入配置文件/etc/rsyncd.conf

[root@test4 ~]# /bin/cp /etc/rsyncd.conf /etc/rsyncd.conf.qinbf_$(date +%F)

[root@test4 ~]# echo >/etc/rsyncd.conf<<EOF

> #Rsync server

> #created by oldboy 15:01 2009-6-5

> ##rsyncd.conf start##

> uid = root

> gid = root

> use chroot = no

> max connections = 2000

> timeout = 600

> pid file = /var/run/rsyncd.pid

> lock file = /var/run/rsync.lock

> log file = /var/log/rsyncd.log

> ignore errors

> read only = false

> list = false

> hosts allow = 10.0.0.0/24

> hosts deny = 0.0.0.0/32

> auth users = rsync_backup

> secrets file = /etc/rsync.password

> #####################################

> [www]

> comment = www by old0boy 14:18 2012-1-13

> path = /data0/www/www/

> #####################################

> [bbs]

> comment = bbs by old0boy 14:18 2012-1-13

> path = /data0/www/bbs/

> #####################################

> [blog]

> comment = blog by old0boy 14:18 2012-1-13

> path = /data0/www/blog/

> EOF

(3)建立待同步目錄

mkdir -p /data0/www/www /data0/www/bbs /data0/www/blog

[root@test3 ~]# tree /data0/www

/data0/www

|-- bbs

|-- blog

`-- www

 

3 directories, 0 files

[root@test3 ~]# tree /data0

/data0

`-- www

    |-- bbs

    |-- blog

    `-- www

 

4 directories, 0 files

(4)       配置相關權限認證

[root@test3 ~]# echo "rsync_backup:oldboy123" >/etc/rsync.password

[root@test3 ~]# chmod 600 /etc/rsync.password

[root@test3 ~]# cat /etc/rsync.password   #for check

rsync_backup:oldboy123

[root@test3 ~]# ll /etc/rsync.password     #for check

-rw------- 1 root root 23 09-03 12:15 /etc/rsync.password

 

(5)       開啓守護進程

[root@test3 ~]# rsync --daemon    #開啓進程

[root@test3 ~]# ps -ef |grep rsync   #查看rsync進程的狀況

root     10005     1  0 12:18 ?        00:00:00 rsync --daemon

root     10007  9887  0 12:18 pts/0    00:00:00 grep rsync

[root@test3 ~]# lsof -i :873        #查看端口對應的進程

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

rsync   10005 root    3u  IPv6  20111      0t0  TCP *:rsync (LISTEN)

rsync   10005 root    5u  IPv4  20112      0t0  TCP *:rsync (LISTEN)

#pkill rsync 關閉rsync服務

 

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

 

2.4.2  在Master上配置rsync客戶端

(1) Master上配置rsync權限

[root@test2 ~]# echo "oldboy123" >/etc/rsync.password

[root@test2 ~]# chmod 600 /etc/rsync.password

[root@test2 ~]# cat /etc/rsync.password

oldboy123

[root@test2 ~]# ll /etc/rsync.password

-rw------- 1 root root 10 10-02 11:46 /etc/rsync.password

 (2) Master上手工測試rsync同步狀況

#分別建立待同步數據

[root@test2 ~]# mkdir -p /data0/www/www /data0/www/bbs /data0/www/blog

[root@test2 ~]# cd /data0/www/

 root@test2 www]# pwd

/data0/www

[root@test2 www]# ls

bbs  blog  www

[root@test2 www]# touch www/www.log

[root@test2 www]# touch bbs/bbs.loog

[root@test2 www]# touch blog/blog.log

 

[root@test2 ~]# tree /data0

/data0

`-- www

    |-- bbs

    |   `-- bbs.loog

    |-- blog

    |   `-- blog.log

    `-- www

        `-- www.log

 

4 directories, 3 files

 

#關閉防火牆,執行同步

[root@test2 ~]# rsync -avzP /data0/www/www/ rsync_backup@192.168.1.4::www/ --password-file=/etc/rsync.password

sending incremental file list

./

www.log

           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

 

sent 77 bytes  received 30 bytes  71.33 bytes/sec

total size is 0  speedup is 0.00

 

#/data0/www/www/中最後的這一個「/」很關鍵,直接決定你是同步整個文件夾 ,仍是隻是同步文件夾裏面的文件

……

#而後檢查同步的結果

[root@test3 www]# tree /data0

/data0

`-- www

    |-- bbs

    |   `-- bbs.loog

    |-- blog

    |   `-- blog.log

    `-- www

        `-- www.log

 

4 directories, 3 files

 

2.5 在Master上部署sersync

(1) 下載sersync

[root@test2 ~]# mkdir tools

[root@test2 ~]# cd tools/

[root@test2tools]#wget  https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz(因爲防火牆的問題在虛擬機上沒法直接下載)

 

(2) 安裝sersync

[root@test2 tools]# tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/

GNU-Linux-x86/

GNU-Linux-x86/sersync2

GNU-Linux-x86/confxml.xml

[root@test2 tools]# cd /usr/local/

[root@test2 local]# mv GNU-Linux-x86 sersync

 

(3) 規範sersync目錄結構

[root@test2 sersync]# mkdir bin conf logs

[root@test2 sersync]# mv  sersync2 bin/sersync 

[root@test2 sersync]# mv confxml.xml conf/

[root@test2 sersync]# tree .

.

|-- bin

|   `-- sersync

|-- conf

|   `-- confxml.xml

`-- logs

 

3 directories, 2 files

 

(4) 配置sersync

[root@test2 sersync]# /bin/cp conf/confxml.xml conf/confxml.xml_qinbf_$(date +%F)

而後修改24到28行的部分,原內容爲:

24         <localpath watch="/opt/tongbu">

    25              <remote ip="127.0.0.1" name="tongbu1"/>

    26              <!--<remote ip="192.168.8.39" name="tongbu"/>-->

    27              <!--<remote ip="192.168.8.40" name="tongbu"/>-->

    28          </localpath>

修改成:

24         <localpath watch="/data0/www/www">

 25             <remote ip="192.168.1.4" name="www"/>

 26             <remote ip="192.168.1.5" name="www"/>

 27         </localpath>

 28         <!--################################-->

 29         <localpath watch="/data0/www/bbs">

 30         <remote ip="192.168.1.4" name="bbs"/>

 31         <remote ip="192.168.1.5" name="bbs"/>

 32         </localpath>

 33         <!--################################-->

 34         <localpath watch="/data0/www/blog">

 35         <remote ip="192.168.1.4" name="blog"/>

 36         <remote ip="192.168.1.5" name="blog"/>

 37         </localpath>

 38         <!--################################-->

提示:<localpath watch="/data0/www/www">中watch部分是本地待同步的目錄,name是遠端服務器的同步模塊名

修改29-35行

    29          <rsync>

    30              <commonParams params="-artuz"/>

    31              <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>

    32              <userDefinedPort start="false" port="874"/><!-- port=874 -->

    33              <timeout start="false" time="100"/><!-- timeout=100 -->

    34              <ssh start="false"/>

    35          </rsync>

爲:

39         <rsync>

 40           <commonParams params="-aruz"/>

 41           <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>

 42           <userDefinedPort start="false" port="874"/><!-- port=874 -->

 43           <timeout start="true" time="100"/><!-- timeout=100 -->

 44           <ssh start="false"/>

 45         </rsync>

提示:這幾行的配置實際上是在配置同步的命令參數而已

修改36-37行

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

爲:

 46  <failLog path="/usr/local/sersync/logs/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->

提示:此步修改同步失敗以後,日誌文件路徑

 

2.6 開啓sersync守護進程同步數據

(1) 配置環境變量

[root@test2 sersync]# echo 'export PATH=$PATH:/usr/local/sersync/bin' >>/etc/profile

[root@test2 sersync]# tail -1 /etc/profile

export PATH=$PATH:/usr/local/sersync/bin

[root@test2 sersync]# source /etc/profile

(2)啓動命令

[root@test2 sersync]# sersync -d -r -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: -d      run as a daemon

option: -r      rsync all the local files to the remote servers before the sersync work

#讓Master和slave的數據在初始化的時候相同

option: -o      config xml name:  /usr/local/sersync/conf/confxml.xml #指定配置文件

daemon thread num: 10

parse xml config file

host ip : localhost     host port: 8008

daemon start,sersync run behind the console

use rsync password-file :  

user is rsync_backup      #用戶

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

------------------------------------------

rsync the directory recursivly to the remote servers once

working please wait...

execute command: cd /data0/www/www && rsync -aruz -R --delete ./  --timeout=100 rsync_backup@192.168.1.4::www --password-file=/etc/rsync.password >/dev/null 2>&1

[root@test2 sersync]# run the sersync:

watch path is: /data0/www/www

 

#如今的問題是,僅能同步第一個模塊的目錄

因而,配置多實例,每一個配置文件僅同步一個目錄,僅記錄該目錄的失敗日誌

[root@test2 conf]# cp confxml.xml confxml.xml.new

[root@test2 conf]# cp confxml.xml www_confxml.xml

[root@test2 conf]# cp confxml.xml bbs_confxml.xml

[root@test2 conf]# cp confxml.xml blog_confxml.xml

例如bbs的配置:

23     <sersync>

 24         <!--################################-->

 25         <localpath watch="/data0/www/bbs">

 26         <remote ip="192.168.1.4" name="bbs"/>

 27         <remote ip="192.168.1.5" name="bbs"/>

 28         </localpath>

 29         <!--################################-->

 30         <rsync>

 31             <commonParams params="-aruz"/>

 32           <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>

 33             <userDefinedPort start="false" port="874"/><!-- port=874 -->

 34             <timeout start="true" time="100"/><!-- timeout=100 -->

 35             <ssh start="false"/>

 36         </rsync>

 37   <failLog path="/usr/local/sersync/logs/bbs_rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->

開啓多實例:

sersync -r -d -o /usr/local/sersync/conf/www_confxml.xml

sersync -r -d -o /usr/local/sersync/conf/bbs_confxml.xml

sersync -r -d -o /usr/local/sersync/conf/blog_confxml.xml

 

 

 

 

 

設置開機啓動:

cat >>/etc/rc.local <<EOF

sersync  -d -o /usr/local/sersync/conf/www_confxml.xml

sersync  -d -o /usr/local/sersync/conf/bbs_confxml.xml

sersync  -d -o /usr/local/sersync/conf/blog_confxml.xml

EOF

#在開機啓動的時候通常不須要加上-r參數,由於關機以前大部分的數據是已經同步的,若是再同步,就浪費時間。

其實本例能夠只監控上一次的目錄,這樣能夠一次監控三個子目錄,這樣作是爲了方便學習

寫入10000個文件批量實時同步測試

[root@test2 www]# for i in `seq 10000`;do echo "qinbf">www/$i.txt;done

[root@test2 www]# ps -ef |grep rsync 

root      4380     1  0 05:05 ?        00:00:00 rsync --daemon

root      6246     1  0 10:06 ?        00:00:00 sersync -d -r -o /usr/local/sersync/conf/confxml.xml

root      6601     1  0 10:39 ?        00:00:00 sersync -r -d -o /usr/local/sersync/conf/www_confxml.xml

root      6621     1  0 10:39 ?        00:00:00 sersync -r -d -o /usr/local/sersync/conf/bbs_confxml.xml

root      6641     1  0 10:39 ?        00:00:00 sersync -r -d -o /usr/local/sersync/conf/blog_confxml.xml

root     12592  6601  0 10:54 ?        00:00:00 sh -c cd /data0/www/www && rsync -aruz -R  --timeout=100 "./464.txt" rsync_backup@192.168.1.4::www --password-file=/etc/rsync.password >/dev/null 2>&1

root     12593 12592  0 10:54 ?        00:00:00 rsync -aruz -R --timeout=100 ./464.txt rsync_backup@192.168.1.4::www --password-file=/etc/rsync.password

root     12594  6601  0 10:54 ?        00:00:00 sh -c cd /data0/www/www && rsync -aruz -R  --timeout=100 "./464.txt" rsync_backup@192.168.1.5::www --password-file=/etc/rsync.password >/dev/null 2>&1

root     12599  6246  0 10:54 ?        00:00:00 sh -c cd /data0/www/www && rsync -aruz -R  --timeout=100 "./461.txt" rsync_backup@192.168.1.5::www --password-file=/etc/rsync.password >/dev/null 2>&1

root     12608  6246  0 10:54 ?        00:00:00 sh -c cd /data0/www/www && rsync -aruz -R  --timeout=100 "./463.txt" rsync_backup@192.168.1.4::www --password-file=/etc/rsync.password >/dev/null 2>&1

 

提示:當咱們已經寫入10000個文件,發現同步的線程,依然在同步,甚至才同步400多個文件。可見,實時同步也是相對的,若是沒有海量文件的寫入,同步仍是比較快的。

 

2.7  Sersync參數說明:

Sersync參數

說明

-r

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

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

-o

不指定-o參數時,sersync會使用sersync可執行文件目錄下的默認配置文件confxml.xml,若是要使用其餘的配置文件,則須要使用-o指定

-n

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

例如./sersync -n 5則指定線程總數爲5,若是不指定,默認啓動線程池數量是10,若是cpu使用太高,能夠經過這個參數調低,若是機器配置較高,能夠用-n調高默認的線程總數,提高同步效率

-d

-d參數爲後臺啓動服務,在一般狀況下,使用-r參數對本地到遠程總體同步一遍以後,在後臺運行此參數啓動守護進程實時同步,在第一次總體同步時,-d和-r參數常常會聯合使用

-m

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

./sersync -m pluginName

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

--help

查看幫助的參數,目前還未完善

 

2.8 sersync配置文件說明

#xml配置文件註釋不是」#」,而是<!--中間是註釋內容-->

<?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同步命令

<fileSystem xfs="false"/>

#對於xfs文件系統的用戶,須要將這個選項開啓,才能使sersync正常工做(ext三、ext4的用戶能夠不用開啓)

    <filter start="false">

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

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

        <exclude expression="^info/*"></exclude>

        <exclude expression="^static/*"></exclude>

</filter>

#對於sersync監控文件,會默認過濾系統的臨時文件(以」.」開頭,以」~」結尾),除了這些文件外,能夠自定義其餘須要過濾的文件。將start設置爲true後開啓過濾功能,在exclude標籤中,填寫正則表達式,默認給出兩個例子分別是過濾以」.gz」結尾的文件與過濾監控目錄下的info路徑(監控路徑/info/*),能夠根據須要添加,但開啓的時候,本身測試一下,正則表達式若是出現錯誤,控制檯會有提示。

    <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>

#對於大多數應用,能夠嘗試把createFile設置爲false來提升性能,減小rsync通信。由於拷貝文件到監控目錄會產生create事件與close_write事件,因此若是關閉create事件,只監控文件拷貝結束時的事件close_write,一樣可實現文件完整同步。

 

#要使得createFolder保持爲true,若是將createFolder設爲false,則不會對產生的目錄進行監控,該目錄下的子文件與子目錄也不會被監控。

 

#默認狀況下對建立文件(目錄)事件與刪除文件(目錄)事件都進行監控,若是項目中不須要刪除遠程目標服務器的文件(目錄),則能夠將delete參數設置爲false,則不會對刪除事件進行監控。

 

    <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>

#/opt/tongbu目錄爲sersync主服務器本地待同步的目錄,ip=’192.168.18.39,爲從服務器的IP地址,若是有多個從服務器,依次列出來便可。name=」tongbu」,這裏的tongbu爲rsyncd.conf中的模塊名字,即中括號的名稱

        <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 execute once-->

#失敗日誌配置,默認每60分從新同步

        <crontab start="false" schedule="600"><!--600mins-->

            <crontabfilter start="false">

                <exclude expression="*.php"></exclude>

                <exclude expression="info/*"></exclude>

            </crontabfilter>

        </crontab>

#crontab總體同步,每600分同步一次

        <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>

#plugin標籤設置爲true的時候,在同步文件或路徑到遠程服務器以後,會調用插件。經過name參數指定須要執行的插件。目前支持的又command  refreshCDN socket  http四種插件。其中http插件目前因爲兼容性緣由已經去除,之後會從新加入。

 

#模塊能夠單獨使用(發生文件改變不一樣步只調用插件),只須要在命令行下使用-m參數便可。

 

 

三 inotify+rsync遠程實時同步

 

[root@test2 ~]# ls -l /proc/sys/fs/inotify/*

#若是該目錄下有下面三個文件,就表示支持inotify

-rw-r--r-- 1 root root 0 10-07 23:29 /proc/sys/fs/inotify/max_queued_events

-rw-r--r-- 1 root root 0 10-07 23:29 /proc/sys/fs/inotify/max_user_instances

-rw-r--r-- 1 root root 0 10-07 23:29 /proc/sys/fs/inotify/max_user_watches

 

上傳inotify源軟件包,解壓—編譯—-安裝

 

執行腳本以下:

[root@test2 inotify-tools-3.14]# cat inotify.sh

#!/bin/bash

#para

host01=10.0.0.191

src=/data0/www/www/

dst=www

user=rsync_backup

rsync_passfile=/etc/rsync.password

inotify_home=/usr/local/inotify-tools-3.14/

 

#judge

if [ ! -e "$src" ] \

|| [ ! -e "${rsync_passfile}" ] \

|| [ ! -e "${inotify_home}/bin/inotifywait" ] \

|| [ ! -e "/usr/bin/rsync" ];

then

  echo "Check File and Folder"

  exit 9

fi

 

 

${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src \

| while read file

        do

      #  rsync -avzP --delete --timeout=100 --password-file=${rsync_passfile} $src $user@$host01::$dst >/dev/null 2>&1

         cd $src && rsync -aruz -R --delete ./  --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} >/dev/null 2>&1

        done

exit 0

 

#./ inotify.sh &  在後臺運行

提示:sersync實際上是inotify和rsync的封裝

對比sersync和inotify+rsync,sersync支持過濾,可是通過壓力測試sersync的實時同步測試效果沒有inotify+rsync的效果好。

相關文章
相關標籤/搜索