一 Rsyncphp
1. Rsync介紹正則表達式
Rsync具備可以使本地主機不一樣分區或目錄之間及本地和遠程兩臺主機之間的數據快速同步鏡像,遠程備份等功能。算法
在同步備份時,默認狀況下,Rsync經過獨特的「quick check」算法,僅同步大小或者最後修改時間發生變化的文件或目錄(也可根據權限,屬主等變化同步,須要指定參數),甚至是隻同步一個文件裏有變化的內容部分,因此可實現快速的同步數據的功能。shell
2. Rsync的特性express
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的效果好。