天天看點

rsync+inotify 實作資料實時同步

一、原理簡介(原理内容來自網絡)

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" &gt;/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" &gt; /etc/web.passwd</code>

<code>#echo "123" &gt; /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>&gt;&gt; </code><code>/var/log/rsync</code><code>.log 2&gt;&amp;1</code>

<code>done</code>

 2、把腳本加入到開機自動啟動檔案

<code>#chmod +x /etc/init.d/rsyncd</code>

<code>#echo "/etc/init.d/rsyncd"&gt;&gt;/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,如需轉載請自行聯系原作者

繼續閱讀