前言
與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支援增量備份等優點,通過rsync可以解決對實時性要求不高的資料備份需求,但随着檔案數量的增大和實時同步的要求,rsync已不能滿足需求,随之rsync+inotify便應運而生。本文将講解rsync的基礎知識和如何基于rsync+inotify實作資料實時同步傳輸。
rsync相關介紹
rsync(remote sync)是一款快速增量備份工具(遠端同步),支援本地複制,或者與其他SSH(安全傳輸)、rsync主機同步。
特點
①可以鏡像儲存整個目錄樹或檔案系統
②較高的資料傳輸效率
③可以借助于ssh實作安全資料傳輸
④支援匿名傳輸
工作模式
①shell模式,也稱作本地模式
②遠端shell模式,可以利用ssh協定承載其遠端傳輸過程
③清單模式,僅列出源中的内容,-nv
④服務模式,此時rsync工作為守護程序,能接收用戶端的資料同步請求
指令選項
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<code>-n: 同步測試,不執行真正的同步過程;</code>
<code>-</code><code>v</code><code>: 詳細輸出模式</code>
<code>-q: 靜默模式</code>
<code>-c: checksum,開啟校驗功能</code>
<code>-r: 遞歸複制</code>
<code>-a: 歸檔,保留檔案的原有屬性;</code>
<code>-p: 保留檔案的權限;</code>
<code>-t: 保留檔案的時間戳;</code>
<code>-l: 保留符号連結</code>
<code>-g: 保留屬組</code>
<code>-o: 保留屬主</code>
<code>-D:保留裝置檔案</code>
<code>-e </code><code>ssh</code><code>: 使用</code><code>ssh</code><code>作為傳輸承載;</code>
<code>-z: 壓縮後傳輸;</code>
<code>--progress: 顯示進度條</code>
<code>--stats: 顯示如何執行壓縮和傳輸</code>
<code>注意:</code><code>rsync</code><code>指令中,如果源路徑是目錄,且給複制路徑時末尾有/,則會複制目錄中的内容,而非目錄本身;如果末尾沒有/,則會同步目錄本身及目錄中的所有檔案;目标路徑末尾是否有/無關緊要;</code>
<code>如:</code><code>rsync</code> <code>-r </code><code>/var/log/</code> <code>/tmp</code> <code>#複制/var/log目錄下的所有檔案,不包括log本身</code>
<code> </code><code>rsync</code> <code>-r </code><code>/var/log</code> <code>/tmp</code> <code>#複制/var/log整個目錄</code>
rsync同步資料的時候,需要完整掃描檔案,比對變化的檔案,如果檔案數量過于龐大,這樣掃描是非常耗時的,而且rsync雖然可以通過crontab實作定期同步,但是也達不到實時同步的要求,要想解決這一弊端,就需要inotify了
資料實時同步實作
inotify相關介紹
可用于定義監控指定的目錄下的所有檔案,一旦有檔案的中繼資料發生改變,就通知rsync進行資料同步,以此實作實時同步
部署過程
我們通過一個執行個體來看一下rsync+inotify是如何實作資料同步的
案例要求
web伺服器1:172.16.10.100(主伺服器)
web伺服器2:172.16.10.212(輔伺服器)
兩台web伺服器,要求在主伺服器上更新資料,輔伺服器要自動更新資料
rsync角色說明:因為inotify是監控在rsync的用戶端,而且是主動同步,是以在此應用場景中主伺服器為rsync用戶端,輔伺服器為rsync伺服器端
rsync伺服器端配置
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<code>[root@scholar ~]</code><code># yum install xinetd -y #安裝守護程序,rsync系統自帶,如果沒有安裝即可</code>
<code>[root@scholar ~]</code><code># vim /etc/xinetd.d/rsync</code>
<code> </code><code>#修改此項</code>
<code> </code><code>disable = no </code><code>#啟用rsync</code>
<code>[root@scholar ~]</code><code># vim /etc/rsyncd.conf #為rsync建立配置檔案,預設沒有此檔案</code>
<code># Global Settings</code>
<code>uid = nobody </code><code>#運作rsync使用者</code>
<code>gid = nobody </code><code>#運作rsync組</code>
<code>use chroot = no </code><code>#關閉chroot</code>
<code>max connections = 10 </code><code>#最大并發連接配接數</code>
<code>strict modes = </code><code>yes</code> <code>#開啟嚴格模式</code>
<code>pid </code><code>file</code> <code>= </code><code>/var/run/rsyncd</code><code>.pid </code><code>#pid檔案位置</code>
<code>log </code><code>file</code> <code>= </code><code>/var/log/rsyncd</code><code>.log </code><code>#日志檔案位置</code>
<code># Directory to be synced</code>
<code>[web] </code><code>#檔案共享名</code>
<code>path = </code><code>/web</code> <code>#共享檔案路徑</code>
<code>ignore errors = </code><code>yes</code> <code>#忽略錯誤</code>
<code>read</code> <code>only = no </code><code>#不允許讀</code>
<code>write only = no </code><code>#不允許寫</code>
<code>hosts allow = 172.16.0.0</code><code>/16</code> <code>#白名單</code>
<code>hosts deny = * </code><code>#黑名單</code>
<code>list = </code><code>false</code> <code>#不允許列出檔案</code>
<code>uid = root </code><code>#共享已root使用者運作,可覆寫全局配置</code>
<code>gid = root </code><code>#共享已root組運作,可覆寫全局配置</code>
<code>auth </code><code>users</code> <code>= scholar </code><code>#使用者認證</code>
<code>secrets </code><code>file</code> <code>= </code><code>/etc/rsync</code><code>.</code><code>passwd</code> <code>#認證檔案</code>
<code>[root@scholar ~]</code><code># vim /etc/rsync.passwd #建立認證檔案</code>
<code>#格式:username:password,此檔案不能允許其它使用者有通路權限,且密碼不能超過8個字元</code>
<code>scholar:scholar</code>
<code>[root@scholar ~]</code><code># chmod 600 /etc/rsync.passwd #設定權限</code>
啟動服務,設定開機自啟,檢視監聽端口
<a href="http://s3.51cto.com/wyfs02/M00/6C/07/wKiom1U936bxeqjyAAB89RSJ0Gc120.jpg" target="_blank"></a>
rsync用戶端配置
建立認證檔案,隻需密碼即可
<a href="http://s3.51cto.com/wyfs02/M00/6C/03/wKioL1U95iDiItirAABzsOuPt0w948.jpg" target="_blank"></a>
測試資料同步的方法
<code>Access via </code><code>rsync</code> <code>daemon:</code>
<code> </code><code>Pull: </code><code>rsync</code> <code>[OPTION...] [USER@]HOST::SRC... [DEST]</code>
<code> </code><code>如:</code><code>rsync</code> <code>--password-</code><code>file</code><code>=</code><code>/etc/rsync</code><code>.</code><code>passwd</code> <code>[email protected]::web </code><code>/web</code>
<code> </code><code>rsync</code> <code>[OPTION...] </code><code>rsync</code><code>:</code><code>//</code><code>[USER@]HOST[:PORT]</code><code>/SRC</code><code>... [DEST]</code>
<code> </code><code>如:</code><code>rsync</code> <code>--password-</code><code>file</code><code>=</code><code>/etc/rsync</code><code>.</code><code>passwd</code> <code>rsync</code><code>:</code><code>//scholar</code><code>@172.16.10.212</code><code>/web</code> <code>/web</code>
<code> </code><code>Push: </code><code>rsync</code> <code>[OPTION...] SRC... [USER@]HOST::DEST</code>
<code> </code><code>如:</code><code>rsync</code> <code>--password-</code><code>file</code><code>=</code><code>/etc/rsync</code><code>.</code><code>passwd</code> <code>/web</code> <code>[email protected]::web</code>
<code> </code><code>rsync</code> <code>[OPTION...] SRC... </code><code>rsync</code><code>:</code><code>//</code><code>[USER@]HOST[:PORT]</code><code>/DEST</code>
<code> </code><code>如:</code><code>rsync</code> <code>--password-</code><code>file</code><code>=</code><code>/etc/rsync</code><code>.</code><code>passwd</code> <code>/web</code> <code>rsync</code><code>:</code><code>//scholar</code><code>@172.16.10.212</code><code>/web</code>
安裝inotify-tools
<code>[root@scholar ~]</code><code># tar xf inotify-tools-3.14.tar.gz </code>
<code>[root@scholar ~]</code><code># cd inotify-tools-3.14</code>
<code>[root@scholar inotify-tools-3.14]</code><code># ./configure</code>
<code>[root@scholar inotify-tools-3.14]</code><code># make && make install</code>
建立rsync腳本
<code>[root@scholar ~]</code><code># vim /usr/local/bin/rsyncd</code>
<code>#!/bin/bash</code>
<code>SRC=</code><code>/web/</code>
<code>DEST=web</code>
<code>HOST=172.16.10.212</code>
<code>/usr/local/bin/inotifywait</code> <code>-mrq --timefmt </code><code>'%d/%m/%y %H:%M'</code> <code>--</code><code>format</code> <code>'%T %w%f%e'</code> <code>-e </code>
<code>modify,delete,create,attrib $SRC | </code><code>while</code> <code>read</code> <code>files;</code>
<code>do</code>
<code> </code><code>rsync</code> <code>-vzrtopg --delete --progress --password-</code><code>file</code><code>=</code><code>/etc/rsync</code><code>.</code><code>passwd</code> <code>$SRC </code>
<code> </code><code>scholar@$HOST::$DEST</code>
<code>done</code>
<code>#inotifywait參數詳解:</code>
<code>#-m,表示始終保持事件監聽狀态</code>
<code>#-r,表示遞歸查詢目錄</code>
<code>#-q,表示列印出監控事件</code>
<code>#-e,指定要監控的事件,包括modify、delete、create、attrib等</code>
<code>#--timefmt:指定時間的輸出格式</code>
<code>#--format:指定變化檔案的詳細資訊</code>
設定開機自動運作
測試同步
我們在主伺服器上增加一個站點,站點已做好我們直接複制進去
我們去輔伺服器上看一下,資料有沒有同步過來
<a href="http://s3.51cto.com/wyfs02/M00/6C/08/wKioL1U-FgTiOEQGAAJsKvu4t2Q984.jpg" target="_blank"></a>
同步成功,至此基于rsync + inotify實作資料實時同步配置完成
The end
好了,rsync + inotify就講到這裡了,如果要實作多台從伺服器同步,多設幾個rsync伺服器端就好了,相應的主伺服器inotify的腳本也需要略加修改,過程并不麻煩,實驗過程中遇到問題可留言。以上僅為個人學習整理,如有錯漏,大神勿噴~~~
本文轉自 北城書生 51CTO部落格,原文連結:http://blog.51cto.com/scholar/1639713