實作目标:将主機A(192.168.239.128)下的一個目錄,同步到主機B(192.168.239.130)下的一個目錄,并對A主機進行監控,當A主機該目錄下的檔案發生變化立即同步至主機B中。
rsync安裝很簡單,不管是同步端機器還是被同步端機器,都隻需安裝rsync包既可,如果配置了yum源,可直接使用yum安裝,指令如下:
# yum -y install rsync
啟動rsync的方法很簡單,有以下兩種方法,推薦使用第二種方法:
方法一:--daemon參數方式,是讓rsync以伺服器模式運作,指令如下:
啟動
# /usr/bin/rsync --daemon --config=/etc/rsyncd.conf
檢視端口
# netstat -tulnp | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 27064/rsync
tcp 0 0 :::873 :::* LISTEN 27064/rsync
注釋:--config用于指定rsyncd.conf的位置,如果預設在/etc目錄下預設可以不用指定
方法二:xinetd監管,隻需将/etc/xinetd.d/rsync檔案中的disable = yes 改為no即可,如下:
# default: off
# description: The rsync server is a good addition to an ftp server, as it \
# allows crc checksumming etc.
service rsync
{
disable = no #将yes改為no
flags = IPv6
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
然後啟動xinetd服務
# service xinetd start
Starting xinetd: [ OK ]
檢視端口,會發現rsync并沒有監聽,但是xinetd監聽了873端口
# netstat -tulnp | grep 873
tcp 0 0 :::873 :::* LISTEN 28245/xinetd
修改/etc/xinetd.d/rsync主要是要打開rsync這個daemon, 一旦有rsync client要連接配接時, xinetd會把它轉移給 rsyncd(port 873)
第一部分:B伺服器端
1.配置檔案參數說明
全局參數
說明
motd file
定義伺服器資訊,需自己編輯,預設沒有,也可不配置
pid file
PID檔案,預設沒有,一般指定為:/var/run/rsyncd.pid
port
端口,預設指定為873
address
指定伺服器IP位址
子產品參數
comment
描述資訊,自定義
path
需要同步的目錄路徑
use chroot
如果為yes,rsync程序将chroot 到檔案系統中的目錄中,好處是保護系統被安裝漏洞侵襲的可能。缺點是需要超級使用者權限。另外對符号連結檔案,将會排除在外。
max connetions
允許用戶端最大連結數,0表示無限制
log file
日志檔案,一般設定為:/var/log/rsync.log
lock file
鎖檔案,用來記錄最大連接配接數,預設是/var/lock/rsyncd.lock
read only
隻讀,預設為yes,表示不讓用戶端上傳檔案到伺服器
write only
隻寫,預設為no,表示用戶端可以下載下傳檔案,yes表示不能下載下傳
list
列出伺服器上提供同步的資料目錄,預設為yes
uid
伺服器傳輸檔案時使用哪個使用者執行,預設是nobody,如果遇到權限檔案,可能需要root使用者
gid
伺服器傳輸檔案時使用哪個使用者組執行,預設是nobody
exclude
排除不需要同步的目錄或檔案,多個用空格隔開
auth users
認證使用者,必須是伺服器上存在的使用者
secrets file
指定密碼檔案路徑
strict modes
是否檢查密碼檔案權限,擁有組和其他人必須為0
hosts allow
允許哪些位址可以同步,可以是IP或網段,多個用空格隔開
hosts deny
拒絕哪些位址的同步,可以是IP或網段,多個用空格隔開
ignore errors
忽略IO錯誤
log format
日志格式
timeout
逾時時間
2.B伺服器端操作步驟
<code>(1)準備步驟</code>
<code>mkdri </code><code>/data/</code> <code>#建立一個目錄,接受來自A主機的檔案或目錄</code>
<code>useradd</code> <code>rsync</code> <code>#增加一個使用者,用于啟動程序傳輸檔案,也可以使用root</code>
<code>chown</code> <code>-R </code><code>rsync</code><code>:</code><code>rsync</code> <code>/data</code> <code>#修改目錄屬性</code>
<code>(2)建立配置檔案</code>
<code>vim </code><code>/etc/rsyncd</code><code>.conf </code>
<code>##rsync.conf config start</code>
<code>uid = </code><code>rsync</code>
<code>gid = </code><code>rsync</code>
<code>use chroot = no </code>
<code>max connetctions = 200</code>
<code>timeout = 100</code>
<code>pid </code><code>file</code> <code>= </code><code>/var/run/rsyncd</code><code>.pid</code>
<code>lock </code><code>file</code> <code>= </code><code>/var/run/rsync</code><code>.lock</code>
<code>log </code><code>file</code> <code>= </code><code>/var/log/rsyncd</code><code>.log</code>
<code>[backup]</code>
<code>path = </code><code>/data/</code>
<code>ignore errors</code>
<code>read</code> <code>only = no</code>
<code>list = no</code>
<code>hosts allow = 192.168.239.128</code>
<code>auth </code><code>users</code> <code>= rsync_backup</code>
<code>secrets </code><code>file</code> <code>= </code><code>/etc/rsync</code><code>.password</code>
<code>##rsync config end </code>
<code>chmod</code> <code>600 </code><code>/etc/rsyncd</code><code>.conf</code>
<code>(3)建立密碼檔案:</code>
<code>echo</code> <code>"rsync_backup:123456"</code><code>></code><code>/etc/rsync</code><code>.password</code>
<code>chmod</code> <code>600 </code><code>/etc/rsync</code><code>.password</code>
<code>(4)啟動服務:</code>
<code>rsync</code> <code>--daemon</code>
<code>(5)設定開機自啟</code><code>rsync</code><code>服務:</code>
<code>vim </code><code>/etc/rc</code><code>.</code><code>local</code>
<code>添加</code>
<code># rsync server progress</code>
<code>/usr/bin/rsync</code> <code>--daemon</code>
第二部分:A用戶端操作步驟
<code>(1)配置密碼檔案:</code>
<code>echo</code> <code>"123456"</code><code>></code><code>/etc/rsync</code><code>.password</code>
<code>(2)手工測試資料推送:</code>
<code>rsync</code> <code>-avzP </code><code>/etc/hosts</code> <code>[email protected]::backup --password-</code><code>file</code><code>=</code><code>/etc/rsync</code><code>.password</code>
<code>#傳輸一個檔案到B上,看是否成功!</code>
<code>在B伺服器端進行檢視,用戶端的</code><code>/etc/hosts</code><code>檔案已經同步至備份的伺服器中。</code>
(3)在A用戶端部署sersync服務
<code>1、檢視伺服器核心是否支援inotify</code>
<code>ll </code><code>/proc/sys/fs/inotify</code>
<code>2、修改inotify預設參數(inotify預設核心參數值太小)</code>
<code>檢視系統預設參數值:</code>
<code>sysctl -a | </code><code>grep</code> <code>max_queued_events</code>
<code>結果是:fs.inotify.max_queued_events = 16384</code>
<code>sysctl -a | </code><code>grep</code> <code>max_user_watches</code>
<code>結果是:fs.inotify.max_user_watches = 8192</code>
<code>sysctl -a | </code><code>grep</code> <code>max_user_instances</code>
<code>結果是:fs.inotify.max_user_instances = 128</code>
<code>修改參數:</code>
<code>sysctl -w fs.inotify.max_queued_events=</code><code>"99999999"</code>
<code>sysctl -w fs.inotify.max_user_watches=</code><code>"99999999"</code>
<code>sysctl -w fs.inotify.max_user_instances=</code><code>"65535"</code>
<code>vi</code> <code>/etc/sysctl</code><code>.conf </code><code>#添加以下代碼</code>
<code>fs.inotify.max_queued_events=99999999</code>
<code>fs.inotify.max_user_watches=99999999</code>
<code>fs.inotify.max_user_instances=65535</code>
<code>:wq! </code><code>#儲存退出</code>
<code>3.下載下傳sersync</code>
<code>下載下傳位址:https:</code><code>//storage</code><code>.googleapis.com</code><code>/google-code-archive-downloads/v2/code</code><code>.google.com</code><code>/sersync/sersync2</code><code>.5.4_64bit_binary_stable_final.</code><code>tar</code><code>.gz</code>
<code>4.配置sersync</code>
<code>#上傳軟體至A伺服器上:</code>
<code> </code><code>sftp</code><code>> put D:/軟體/常用軟體包</code><code>/sersync2</code><code>.5.4_64bit_binary_stable_final.</code><code>tar</code><code>.gz</code>
<code>#解壓檔案到對應目錄:</code>
<code> </code><code>tar</code> <code>zxvf sersync2.5.4_64bit_binary_stable_final.</code><code>tar</code><code>.gz -C </code><code>/usr/local/</code>
<code>#進入對應目錄修改目錄名:</code>
<code> </code><code>cd</code> <code>/usr/local/</code>
<code> </code><code>mv</code> <code>GNU-Linux-x86 sersync</code>
<code>#複制配置檔案</code>
<code> </code><code>cd</code> <code>sersync/</code>
<code> </code><code>cp</code> <code>-a confxml.xml{,.`</code><code>date</code> <code>+%F`} </code>
<code> </code>
<code>#修改配置檔案部分</code>
<code> </code>
<code>#第1部分:設定本地監控的同步目錄、遠端伺服器、備份子產品(備份子產品在遠端伺服器/etc/rsyncd.conf定義)</code>
<code> </code><code><localpath </code><code>watch</code><code>=</code><code>"/data/"</code><code>></code>
<code> </code><code><remote ip=</code><code>"192.168.239.130"</code> <code>name=</code><code>"backup"</code><code>/></code>
<code> </code><code>#<!--<remote ip="192.168.8.39" name="tongbu"/>--></code>
<code> </code><code>#<!--<remote ip="192.168.8.40" name="tongbu"/>--></code>
<code> </code><code><</code><code>/localpath</code><code>></code>
<code>#第2部分:設定認證部分、伺服器端的認證使用者與密碼檔案存放位置(在遠端伺服器/etc/rsyncd.conf定義)</code>
<code> </code><code><</code><code>rsync</code><code>></code>
<code> </code><code><commonParams params=</code><code>"-artuz"</code><code>/></code>
<code> </code><code><auth start=</code><code>"true"</code> <code>users</code><code>=</code><code>"rsync_backup"</code> <code>passwordfile=</code><code>"/etc/rsync.password"</code><code>/></code>
<code> </code><code><userDefinedPort start=</code><code>"false"</code> <code>port=</code><code>"874"</code><code>/><!-- port=874 --></code>
<code> </code><code><timeout start=</code><code>"true"</code> <code>time</code><code>=</code><code>"100"</code><code>/><!-- timeout=100 --></code>
<code> </code><code><</code><code>ssh</code> <code>start=</code><code>"false"</code><code>/></code>
<code> </code><code><</code><code>/rsync</code><code>></code>
<code>類似于</code><code>rsync</code> <code>-avzP </code><code>/etc/hosts</code> <code>[email protected]::backup --password-</code><code>file</code><code>=</code><code>/etc/rsync</code><code>.password</code>
<code>#第3部分:設定同步失敗日志存放位置,當同步失敗時記錄下來,并且每60分鐘對失敗的log進行重新同步</code>
<code><failLog path=</code><code>"/tmp/rsync_fail_log.sh"</code> <code>timeToExecute=</code><code>"60"</code><code>/><!--default every 60mins execute once--></code>
<code> </code><code><</code><code>crontab</code> <code>start=</code><code>"true"</code> <code>schedule=</code><code>"600"</code><code>><!--600mins--></code>
修改完成後,完整的配置檔案如下:
<code>cat</code> <code>/usr/local/sersync/confxml</code><code>.xml</code>
<code><?xml version=</code><code>"1.0"</code> <code>encoding=</code><code>"ISO-8859-1"</code><code>?></code>
<code><</code><code>head</code> <code>version=</code><code>"2.5"</code><code>></code>
<code> </code><code><host hostip=</code><code>"localhost"</code> <code>port=</code><code>"8008"</code><code>><</code><code>/host</code><code>></code>
<code> </code><code><debug start=</code><code>"false"</code><code>/></code>
<code> </code><code><fileSystem xfs=</code><code>"false"</code><code>/></code>
<code> </code><code><filter start=</code><code>"false"</code><code>></code>
<code> </code><code><exclude expression=</code><code>"(.*)\.svn"</code><code>><</code><code>/exclude</code><code>></code>
<code> </code><code><exclude expression=</code><code>"(.*)\.gz"</code><code>><</code><code>/exclude</code><code>></code>
<code> </code><code><exclude expression=</code><code>"^info/*"</code><code>><</code><code>/exclude</code><code>></code>
<code> </code><code><exclude expression=</code><code>"^static/*"</code><code>><</code><code>/exclude</code><code>></code>
<code> </code><code><</code><code>/filter</code><code>></code>
<code> </code><code><inotify></code>
<code> </code><code><delete start=</code><code>"true"</code><code>/></code>
<code> </code><code><createFolder start=</code><code>"true"</code><code>/></code>
<code> </code><code><createFile start=</code><code>"false"</code><code>/></code>
<code> </code><code><closeWrite start=</code><code>"true"</code><code>/></code>
<code> </code><code><moveFrom start=</code><code>"true"</code><code>/></code>
<code> </code><code><moveTo start=</code><code>"true"</code><code>/></code>
<code> </code><code><attrib start=</code><code>"false"</code><code>/></code>
<code> </code><code><modify start=</code><code>"false"</code><code>/></code>
<code> </code><code><</code><code>/inotify</code><code>></code>
<code> </code><code><sersync></code>
<code> </code><code><localpath </code><code>watch</code><code>=</code><code>"/data/"</code><code>></code>
<code> </code><code><remote ip=</code><code>"192.168.239.130"</code> <code>name=</code><code>"backup"</code><code>/></code>
<code> </code><code><!--<remote ip=</code><code>"192.168.8.39"</code> <code>name=</code><code>"tongbu"</code><code>/>--></code>
<code> </code><code><!--<remote ip=</code><code>"192.168.8.40"</code> <code>name=</code><code>"tongbu"</code><code>/>--></code>
<code> </code><code><</code><code>/localpath</code><code>></code>
<code> </code><code><</code><code>rsync</code><code>></code>
<code> </code><code><commonParams params=</code><code>"-artuz"</code><code>/></code>
<code> </code><code><auth start=</code><code>"true"</code> <code>users</code><code>=</code><code>"rsync_backup"</code> <code>passwordfile=</code><code>"/etc/rsync.password"</code><code>/></code>
<code> </code><code><userDefinedPort start=</code><code>"false"</code> <code>port=</code><code>"874"</code><code>/><!-- port=874 --></code>
<code> </code><code><timeout start=</code><code>"false"</code> <code>time</code><code>=</code><code>"100"</code><code>/><!-- timeout=100 --></code>
<code> </code><code><</code><code>ssh</code> <code>start=</code><code>"false"</code><code>/></code>
<code> </code><code><</code><code>/rsync</code><code>></code>
<code> </code><code><failLog path=</code><code>"/tmp/rsync_fail_log.sh"</code> <code>timeToExecute=</code><code>"60"</code><code>/><!--default every 60mins execute once--></code>
<code> </code><code><crontabfilter start=</code><code>"false"</code><code>></code>
<code> </code><code><exclude expression=</code><code>"*.php"</code><code>><</code><code>/exclude</code><code>></code>
<code> </code><code><exclude expression=</code><code>"info/*"</code><code>><</code><code>/exclude</code><code>></code>
<code> </code><code><</code><code>/crontabfilter</code><code>></code>
<code> </code><code><</code><code>/crontab</code><code>></code>
<code> </code><code><plugin start=</code><code>"false"</code> <code>name=</code><code>"command"</code><code>/></code>
<code> </code><code><</code><code>/sersync</code><code>></code>
<code> </code><code><plugin name=</code><code>"command"</code><code>></code>
<code> </code><code><param prefix=</code><code>"/bin/sh"</code> <code>suffix=</code><code>""</code> <code>ignoreError=</code><code>"true"</code><code>/> <!--prefix </code><code>/opt/tongbu/mmm</code><code>.sh suffix--></code>
<code> </code><code><filter start=</code><code>"false"</code><code>></code>
<code> </code><code><include expression=</code><code>"(.*)\.php"</code><code>/></code>
<code> </code><code><include expression=</code><code>"(.*)\.sh"</code><code>/></code>
<code> </code><code><</code><code>/filter</code><code>></code>
<code> </code><code><</code><code>/plugin</code><code>></code>
<code> </code><code><plugin name=</code><code>"socket"</code><code>></code>
<code> </code><code><localpath </code><code>watch</code><code>=</code><code>"/opt/tongbu"</code><code>></code>
<code> </code><code><deshost ip=</code><code>"192.168.138.20"</code> <code>port=</code><code>"8009"</code><code>/></code>
<code> </code><code><plugin name=</code><code>"refreshCDN"</code><code>></code>
<code> </code><code><localpath </code><code>watch</code><code>=</code><code>"/data0/htdocs/cms.xoyo.com/site/"</code><code>></code>
<code> </code><code><cdninfo domainname=</code><code>"ccms.chinacache.com"</code> <code>port=</code><code>"80"</code> <code>username=</code><code>"xxxx"</code> <code>passwd</code><code>=</code><code>"xxxx"</code><code>/></code>
<code> </code><code><sendurl base=</code><code>"http://pic.xoyo.com/cms"</code><code>/></code>
<code> </code><code><regexurl regex=</code><code>"false"</code> <code>match=</code><code>"cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"</code><code>/></code>
<code><</code><code>/head</code><code>></code>
(4)設定sersync監控開機自動執行
<code>vi</code> <code>/etc/rc</code><code>.d</code><code>/rc</code><code>.</code><code>local</code> <code>#編輯,在最後添加一行</code>
<code>/usr/local/sersync/sersync2</code> <code>-d -r -o </code><code>/usr/local/sersync/confxml</code><code>.xml #設定開機自動運作腳本</code>
(5)添加腳本監控sersync是否正常運作
<code>vi</code> <code>/root/check_sersync</code><code>.sh </code><code>#編輯,添加以下代碼</code>
<code>#!/bin/bash</code>
<code>sersync=</code><code>"/usr/local/sersync/sersync2"</code>
<code>confxml=</code><code>"/usr/local/sersync/confxml.xml"</code>
<code>status=$(</code><code>ps</code> <code>aux |</code><code>grep</code> <code>'sersync2'</code><code>|</code><code>grep</code> <code>-</code><code>v</code> <code>'grep'</code><code>|</code><code>wc</code> <code>-l)</code>
<code>if</code> <code>[ $status -</code><code>eq</code> <code>0 ];</code>
<code>then</code>
<code>$sersync -d -r -o $confxml &</code>
<code>else</code>
<code>exit</code> <code>0;</code>
<code>fi</code>
<code>chmod</code> <code>+x </code><code>/root/check_sersync</code><code>.sh </code><code>#添加腳本執行權限</code>
<code>vi</code> <code>/etc/crontab</code> <code>#編輯,在最後添加下面一行</code>
<code>*</code><code>/5</code> <code>* * * * root </code><code>/root/check_sersync</code><code>.sh > </code><code>/dev/null</code> <code>2>&1 </code><code>#每隔5分鐘執行一次腳本</code>
<code>service crond reload </code><code>#重新加載服務</code>
(6)用戶端進行驗證,在同步的伺服器上進行檢視
<code>cd</code> <code>/data/</code>
<code>for</code> <code>i </code><code>in</code> <code>`</code><code>seq</code> <code>100`;</code><code>do</code> <code>mkdir</code> <code>$i;</code><code>done</code>
補充:sersync指令參數詳解
1.指令參數說明
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條路,要麼看源代碼,要麼自測求驗證)
2.sersync服務配置檔案參數詳解:
<code>1.xml配置檔案的注釋不用“</code><code>#”,而是<!-- 中間是注釋内容 --></code>
<code>2.Debug開啟開關:<debug start=</code><code>"false"</code><code>/> </code>
<code> </code><code>設定為</code><code>true</code><code>,表示開啟debug模式,會在sersync正在運作的控制台列印inotify時間與</code><code>rsync</code><code>同步指令;</code>
<code>3.XFS檔案系統開關:<fileSystem xfs=</code><code>"false"</code><code>/></code>
<code> </code><code>對于xfs檔案系統的使用者,需要将這個選項開啟,才能使用sersync正常工作;</code>
<code>4.filter檔案過濾功能</code>
<code> </code><code><exclude expression=</code><code>"(.*)\.svn"</code><code>><</code><code>/exclude</code><code>></code>
<code> </code><code><exclude expression=</code><code>"(.*)\.gz"</code><code>><</code><code>/exclude</code><code>></code>
<code> </code><code><exclude expression=</code><code>"^info/*"</code><code>><</code><code>/exclude</code><code>></code>
<code> </code><code><exclude expression=</code><code>"^static/*"</code><code>><</code><code>/exclude</code><code>></code>
<code> </code><code><</code><code>/filter</code><code>></code>
<code> </code><code>排除一些檔案,不需要</code>
<code> </code>
<code>5.inotify的狀态</code>
<code><inotify></code>
<code>對于大多數應用,可以嘗試把createFile(監控檔案事件選項)設定為</code><code>false</code><code>來提高性能,減少</code><code>rsync</code><code>通訊;</code>
<code>因為拷貝檔案到監控目錄會産生create事件與close_write事件,是以如果關閉create事件,隻監控檔案拷貝結束時的時間close_write,同樣可以實作檔案完整同步;</code>
<code>注意:強将creatFolder保持為</code><code>true</code><code>,如果将createFolder設為</code><code>false</code><code>,則不會對産生的目錄進行監控,該目錄下的子檔案與子目錄也不會被監控;是以除非特殊需要,請開啟; 預設情況下對建立檔案(目錄)事件與删除檔案(目錄)事件都進行監控,如果項目中不需要删除遠端目标伺服器的檔案(目錄),則可以将delete參數設定為</code><code>false</code><code>,則不對删除事件進行監控;</code>
<code></code>
參考:http://www.osyunwei.com/archives/7447.html
本文轉自 a8757906 51CTO部落格,原文連結:http://blog.51cto.com/nxyboy/1940413