一、原理簡介(原理内容來自網絡)
1.rsync
與傳統的 cp、tar 備份方式相比,rsync 具有安全性高、備份迅速、支援增量備份等優點,通過 rsync 可以解決對實時性要求不高的資料備份需求,例如定期的備份檔案伺服器資料到遠端伺服器,對本地磁盤定期做資料鏡像等,随着應用系統規模的不斷擴大,對資料的安全性和可靠性也提出的更好的要求,rsync 在高端業務系統中也逐漸暴露出了很多不足,首先,rsync 同步資料時,需要掃描所有檔案後進行比對,進行差量傳輸。如果檔案數量達到了百萬甚至千萬量級,掃描所有檔案将是非常耗時的。而且正在發生變化的往往是其中很少的一部分,這是非常低效的方式。其次,rsync 不能實時的去監測、同步資料,雖然它可以通過 linux 守護程序的方式進行觸發同步,但是兩次觸發動作一定會有時間差,這樣就導緻了服務端和用戶端資料可能出現不一緻,無法在應用故障時完全的恢複資料。基于以上原因,rsync+inotify 組合出現了!
2.inotify
Inotify 是一種強大的、細粒度的、異步的檔案系統事件監控機制,linux 核心從 2.6.13 起,加入了 Inotify支援,通過 Inotify 可以監控檔案系統中添加、删除,修改、移動等各種細微事件,利用這個核心接口,第三方軟體就可以監控檔案系統下檔案的各種變化情況,而 inotify-tools 就是這樣的一個第三方軟體。 在上面章節中,我們講到,rsync 可以實作觸發式的檔案同步,但是通過 crontab 守護程序方式進行觸發,同步的資料和實際資料會有差異,而 inotify 可以監控檔案系統的各種變化,當檔案有任何變動時,就觸發rsync 同步,這樣剛好解決了同步資料的實時性問題。
注:
rsync inotify 需要逆向思考,當隻做rsync不實時同步時,我們一般是從rsync服務端向rsync用戶端同步資料。當需要添加inotify實作實時同步資料時,我們就需要從rsync用戶端向各rsync服務端同步資料,這樣rsync用戶端就變成了master,而rsync服務端就變成了slave。
原理:當web3的本地目錄,也就是需要同步的目錄發生變化時,比如有檔案改名、更新、删除、權限變化,此時就使用inotify指令查找這些變化,進行相應的輪詢工作
二、系統環境
作業系統
CentOS release 6.5 (Final)
rsync client
rsync server
三、拓撲圖
<a href="http://s3.51cto.com/wyfs02/M00/23/7E/wKiom1M4TP2i5i2xAAISvId5NTA396.jpg" target="_blank"></a>
四、配置過程
1、安裝Rsync服務端(FTP:192.168.1.30)
1
<code>#yum -y install xinetd rsync</code>
2、為rsync服務提供配置檔案
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<code>uid = nobody</code>
<code>gid = nobody</code>
<code>use chroot = no</code>
<code>max connections = 3</code>
<code>timeout = 800</code>
<code>pid </code><code>file</code> <code>= </code><code>/var/run/rsyncd</code><code>.pid</code>
<code>lockfile = </code><code>/var/run/rsyncd</code><code>.lock</code>
<code>log </code><code>file</code> <code>= </code><code>/var/log/rsyncd</code><code>.log</code>
<code>[</code><code>ftp</code><code>]</code>
<code>path = </code><code>/var/ftp</code>
<code>ignore errors = </code><code>yes</code>
<code>read</code> <code>only = no</code>
<code>write only = no</code>
<code>hosts allow = 192.168.1.200</code>
<code>hosts deny = *</code>
<code>list = </code><code>yes</code>
<code>uid = root</code>
<code>gid = root</code>
<code>auth </code><code>users</code> <code>= </code><code>ftp</code>
<code>secrets </code><code>file</code> <code>= </code><code>/etc/ftp</code><code>.</code><code>passwd</code>
3、建立同步的目錄
<code>#mkdir /</code><code>var</code><code>/ftp</code>
<code># cat /etc/ftp.passwd</code>
<code>ftp:</code><code>123</code>
<code># chmod </code><code>600</code> <code>/etc/ftp.passwd</code>
<code># ll /etc/ftp.passwd</code>
<code>-rw------- </code><code>1</code> <code>root root </code><code>8</code> <code>Mar </code><code>23</code> <code>15</code><code>:</code><code>47</code> <code>/etc/ftp.passwd</code>
4、添加啟動腳本
<a href="http://s3.51cto.com/wyfs02/M01/23/7E/wKiom1M4Vf_y5r4eAALWq6eBQgU128.jpg" target="_blank"></a>
5、查啟xinetd守護程序
<a href="http://s3.51cto.com/wyfs02/M00/23/7F/wKioL1M4Vnrj_GXYAAEn-GtPzu0465.jpg" target="_blank"></a>
7、配置Rsync服務端(WEB:192.168.1.200)
(1)、安裝并編輯配置檔案
21
22
23
<code>#yum install -y rsync xinetd</code>
<code>#vim /etc/rsyncd.conf</code>
<code>#Global Settings</code>
<code>[web]</code>
<code>path = </code><code>/var/www</code>
<code>hosts allow = 192.168.1.100</code>
<code>auth </code><code>users</code> <code>= web</code>
<code>secrets </code><code>file</code> <code>= </code><code>/etc/web</code><code>.</code><code>passwd</code>
8、建立目錄、密碼檔案及權限
<code>#mkdir /var/www</code>
<code>#echo "web:web" >/etc/web.passwd</code>
<code>#chmod 600 /etc/web.passwd</code>
<code># ll /etc/web.passwd</code>
<code>-rw------- 1 root root 8 Mar 21 22:54 </code><code>/etc/web</code><code>.</code><code>passwd</code>
五、配置rsync用戶端(192.168.1.100)
1、設定 rsync 用戶端的密碼檔案,用戶端隻需要設定 rsync 同步的密碼即可,不用設定使用者名
<code>#echo "web" > /etc/web.passwd</code>
<code>#echo "123" > /etc/ftp.passwd</code>
<code>chomd 600 </code><code>/etc/web</code><code>.</code><code>passwd</code>
<code>chmod</code> <code>600 </code><code>/etc/ftp</code><code>.</code><code>passwd</code>
2、安裝inotify-tools
<code>#yum install -y inotify*</code>
3、在192.168.1.100上測試下能否同步檔案
1)第1條是是從rsync用戶端192.168.1.200上傳檔案到rsync服務端192.168.1.100,這裡必須要指定密碼檔案
<a href="http://s3.51cto.com/wyfs02/M00/23/85/wKiom1M5eUegpSMwAADv64OuQiw663.jpg" target="_blank"></a>
2)第2條是從rsync服務端(192.168.1.100)下載下傳檔案到rsync用戶端(192.168.1.200)
<a href="http://s3.51cto.com/wyfs02/M00/23/85/wKiom1M5f-3RtXkQAAEApR4ib5g422.jpg" target="_blank"></a>
3)以上兩條說明了,rsync服務端和用戶端是可用的;經測試,另一台rsync服務端也可用,不再貼圖了。接下來的任務就是編寫服務腳本了,能夠讓rsync用戶端自動監測目錄的變動情況,并自動同步到rsync服務端,完全實作自動化。
六、編寫rsync腳本,實作資料實時同步
1、在rsync用戶端(192.168.1.200)編寫rsync腳本
<code>#vim /etc/init.d/rsyncd</code>
<code>#!/bin/bash</code>
<code>src=</code><code>/var/web/</code>
<code>des1=web</code>
<code>des2=</code><code>ftp</code>
<code>host1=192.168.1.100</code>
<code>host2=192.168.1.30</code>
<code>user1=web</code>
<code>user2=</code><code>ftp</code>
<code>/usr/bin/inotifywait</code> <code>-mrq --timefmt </code><code>'%d/%m/%y %H:%M'</code> <code>--</code><code>format</code> <code>'%T %w %f'</code> <code>-e modify,delete,create,attrib $src | </code><code>while</code> <code>read</code> <code>file</code> <code>DATE TIME DIR;</code>
<code>do</code>
<code>/usr/bin/rsync</code> <code>-vzrtopg --delete --progress $src $user1@$host1::$des1 --password-</code><code>file</code><code>=</code><code>/etc/web</code><code>.</code><code>passwd</code>
<code>/usr/bin/rsync</code> <code>-vzrtopg --delete --progress $src $user2@$host2::$des2 --password-</code><code>file</code><code>=</code><code>/etc/ftp</code><code>.</code><code>passwd</code>
<code>echo</code> <code>"${files} was rsynced"</code> <code>>> </code><code>/var/log/rsync</code><code>.log 2>&1</code>
<code>done</code>
2、把腳本加入到開機自動啟動檔案
<code>#chmod +x /etc/init.d/rsyncd</code>
<code>#echo "/etc/init.d/rsyncd">>/etc/rc.d/rc.local</code>
3、檢視結果:
<a href="http://s3.51cto.com/wyfs02/M00/23/86/wKioL1M5hVLSrEuCAADpJ3rrlHo392.jpg" target="_blank"></a>
由于兩端正确資訊一緻,是以不多截圖了
===================================完=======================================
本文轉自 jinlinger 51CTO部落格,原文連結:http://blog.51cto.com/essun/1387715,如需轉載請自行聯系原作者