天天看點

Rsync+Inotify實作資料實時同步

1、環境及相關軟體介紹

作業系統:ubuntu12.04_x64

源伺服器(推送):192.168.18.10

目标伺服器(備份):192.168.18.20

rsync:

  rsync是unix系統下的資料鏡像備份工具,是一款快速增量備份工具(遠端同步),支援本地複制,或者與其他ssh(安全傳輸)、rsync主機同步。

rsync有以下常用的參數:

    -v,--verbose 顯示同步過程的詳細資訊

    -a,--archive 歸檔模式,表示以遞歸方傳輸檔案,并保持所有檔案屬性,等同于-rlptgod

    -r,--recursive 對子目錄以遞歸模式處理

    -z,--compress 對備份的檔案在傳輸時進行壓縮處理

    -l,--links 保留軟連接配接

    -h,--hard-links 保留硬連結

    --delete 删除那些dst中src沒有的檔案(源伺服器删除檔案,目标伺服器也同時删除)

    --progress 顯示備份過程,等同于-p

    --port=port 指定rsync服務端口

    --exclude=file 排除一個目錄或檔案(排除多個目錄時,可以寫多個--exclude)

    --exclude-from=file  排除多個目錄或檔案,file裡面寫多個要排除的目錄

inotify:

 inotify是一個linux特性,它監控檔案系統操作,比如讀取、寫入和建立,當檔案系統有變化時,則會觸發inotify。inotify提供inotify-tools工具,這個工具包含兩個功能,一個是inotifywait,用來監控檔案系統變化的事件,另一個是inotifywatch,用來統計檔案系統通路的次數。我們這次使用inotifywait結合rsync實作實時同步功能。

inotifywait有以下常用參數:

-m,--monitor 一直保持監聽事件

-r,--recursive 遞歸監控目錄

-q,--quiet 隻列印觸發的事件

-e,--event 指定監視時間

--timefmt 指定時間格式,用于-format選型中的%t格式

--format 指定輸出格式。

%w 表示發生事件的目錄

%f 表示發生事件的檔案

%e 表示發生的事件

%t 使用由—timefmt定義的時間格式

inotifywait常用監視事件:

access 檔案或目錄讀取

modify 檔案或目錄更改

attrib 檔案或目錄屬性更改

move  檔案或目錄移動

create 檔案或目錄建立

delete 檔案或目錄删除

2、目标伺服器安裝與配置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<code># sudo apt-get install rsync    #ubuntu系統預設已安裝</code>

<code># sudo cp/usr/share/doc/rsync/examples/rsyncd.conf /etc/</code>

<code># sudo vi /etc/rsyncd.conf</code>

<code># 以下是全局配置</code>

<code>log </code><code>file</code> <code>= </code><code>/var/log/rsyncd</code><code>.log</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/lock/rsyncd</code>

<code>#以下是子產品選項配置</code>

<code>[home]     </code><code>#子產品名,在源伺服器指定這個名字</code>

<code>   </code><code>comment = </code><code>sync</code> <code>rsync</code><code>/home</code>      <code>#描述資訊</code>

<code>   </code><code>path = </code><code>/home/rsync</code>      <code>#備份目錄</code>

<code>   </code><code>use chroot=no           </code><code>#不使用chroot,不用root權限</code>

<code>   </code><code>read</code> <code>only = no          </code><code>#設定本地備份目錄為讀寫權限</code>

<code>   </code><code>uid=root          </code>

<code>   </code><code>gid=root</code>

<code>   </code><code>max connections=10       </code><code>#用戶端最大連接配接數</code>

<code>   </code><code>auth </code><code>users</code> <code>= </code><code>rsync</code>      <code>#指定資料同步使用者</code>

<code>   </code><code>secrets </code><code>file</code> <code>= </code><code>/etc/rsyncd</code><code>.pass          </code><code>#指定資料同步使用者資訊檔案</code>

<code>   </code><code>hosts allow=192.168.18.0</code><code>/24</code>     <code>#允許連接配接的用戶端</code>

<code>   </code><code>ignore errors = </code><code>yes</code>     <code>#忽略出現i/o錯誤</code>

<code>   </code><code>timeout = 600</code>

 #建立認證檔案

<code># sudo vi /etc/rsyncd.pass</code>

<code>rsync</code><code>:123456      </code><code>#格式是使用者名:密碼</code>

<code># sudo chmod 600 /etc/rsyncd.pass      #屬主要有權限讀這個檔案,否則會報沒權限</code>

<code># sudo /etc/init.d/rsync start     #如果啟動報如下錯誤,則根據提示打開/etc/default/rsync檔案,将rsync_enable=false該為rsync_enable=true,再重新開機即可。</code>

<code>* </code><code>rsync</code> <code>daemon not enabled </code><code>in</code><code>/etc/default/rsync</code><code>, not starting...</code>

<code>#,檢視是否啟動,有rsync監聽端口說明正常:</code>

<code># sudo netstat -antp |grep rsync</code>

<code>tcp        0     0 0.0.0.0:873            0.0.0.0:*               listen      29605</code><code>/rsync</code>

部落格位址:http://lizhenliang.blog.51cto.com

3、源伺服器安裝與配置

<code># sudo apt-get install rsync inodify-tools</code>

<code>#rsync不用配置,因為我們隻使用rsync指令,緊接着建立認證檔案</code>

<code>123456     </code><code>#隻寫密碼</code>

<code># sudo chmod 600/etc/rsyncd.pass</code>

 #此時基本配置完成,測試下是否能推送吧!

<code># rsync -avzp --password-file=/etc/rsyncd.pass --delete /home/rsync [email protected]::home   #home即是目标伺服器上rsync裡面的子產品名</code>

<code>sending incremental </code><code>file</code> <code>list</code>

<code>rsync</code><code>/a</code>

<code>           </code><code>0 100%    0.00kb</code><code>/s</code>   <code>0:00:00 (xfer</code><code>#1, to-check=5/7)</code>

<code>sent 354 bytes  received 126 bytes  960.00 bytes</code><code>/sec</code>

<code>total size is 0  speedup is 0.00</code>

 #出現以上資訊說明同步正常,接下來,就該編寫shell腳本,使用inotifywait做實時監控源目錄,加個while循環判斷源目錄是否有觸發,如果有變化則執行rsync同步,并記錄日志:

<code># vi inotify_rsync.sh</code>

<code>#!/bin/bash</code>

<code>src=</code><code>'/home/rsync'</code>

<code>dst=</code><code>'[email protected]::home'</code>

<code>/usr/bin/inotifywait</code> <code>-mrq --timefmt </code><code>'%y-%m-%d %h:%m'</code> <code>--</code><code>format</code> <code>'%t %w %f %e'</code> <code>-e create,delete,move,modify $src|</code><code>while</code> <code>read</code> <code>files</code>

<code>do</code>

<code>    </code><code>rsync</code> <code>-avzp --password-</code><code>file</code><code>=</code><code>/etc/rsyncd</code><code>.pass --delete $src $dst</code>

<code>    </code><code>echo</code> <code>"$files was rsynced."</code><code>&gt;&gt; </code><code>/tmp/rsync</code><code>.log</code>

<code>done</code>

4、測試實時同步

 #先列印形式檢視腳本執行情況

<code># bash -x inotify_rsync.sh </code>

<code>+ src=</code><code>/home/rsync/</code>        <code>#目錄結尾一定要加個/,否則會再目标伺服器再建立個目錄</code>

<code>+dst=</code><code>rsync</code><code>@192.168.18.213::home</code>

<code>+ </code><code>read</code> <code>files</code>

<code>+ </code><code>/usr/bin/inotifywait</code> <code>-mrq --timefmt </code><code>'%y-%m-%d %h:%m'</code> <code>--</code><code>format</code> <code>'%t %w%f %e'</code> <code>-e create,delete,move,modify,attrib </code><code>/home/loongtao</code>

<code>+ </code><code>rsync</code> <code>-avzp --password-</code><code>file</code><code>=</code><code>/etc/rsyncd</code><code>.pass --delete </code><code>/home/rsync</code> <code>rsync</code><code>@@192.168.18.213::home</code>

<code>rsync</code><code>/</code>

<code>rsync</code><code>/test</code><code>.txt</code>

<code>           </code><code>0 100%    0.00kb</code><code>/s</code>   <code>0:00:00 (xfer</code><code>#1, to-check=2/11)</code>

<code> </code> 

<code>sent 349 bytes  received 32 bytes  762.00 bytes</code><code>/sec</code>

<code>total size is 9380  speedup is 24.62</code>

<code>+ </code><code>echo</code> <code>'15-04-24 13:33/home/rsync/test.txt create was rsynced.'</code>

<code>+ </code><code>rsync</code> <code>-avzp--password-</code><code>file</code><code>=</code><code>/etc/rsyncd</code><code>.pass --delete </code><code>/home/rsync</code> <code>rsync</code><code>@192.168.18.213::home</code>

<code>sent 310 bytes  received 10 bytes  640.00 bytes</code><code>/sec</code>

<code>total size is 9380  speedup is 29.31</code>

<code>+ </code><code>echo</code> <code>'15-04-24 13:33/home/rsync/test.txt attrib was rsynced.'</code>

#可以看到以上資訊,無任何報錯,說明已經推送成功。

然後,把腳本放到背景運作:

<code># chmod +x inotify_rsync.sh</code>

<code># ./inotify_rsync.sh &amp;</code>

#此時當源伺服器/home/rsync目錄檔案有更新,則會同步到目标伺服器/home/rsync目錄

繼續閱讀