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>>> </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 &</code>
#此時當源伺服器/home/rsync目錄檔案有更新,則會同步到目标伺服器/home/rsync目錄