天天看點

基于rsync+inotify實作資料實時同步傳輸

前言

與傳統的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 &amp;&amp; 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