天天看點

rsync+inotify搭建實時同步系統

rsync簡介

   rsync是Linux和UNIX系統下的檔案同步和資料傳輸工具,它采用了“rsync”算法使一個客戶機和遠端檔案伺服器之間的檔案同步,它不同于cp和wget指令完整複制的局限性,它支援增量備份,是以檔案傳輸效率高,因而同步時間很短,具體特性如下:

   1、可以鏡像儲存整個目錄樹和檔案系統

   2、可以增量同步資料。檔案傳輸效率高。

   3、可以保持原有檔案的權限、時間等屬性。

   4、加密傳輸資料,保證資料的安全性。

   5、可以使用rcp、ssh等方式來傳輸檔案。

搭建遠端容災備份系統

   Web伺服器為了保證資料安全,每天淩晨2點将資料備份到遠端容災伺服器上,由于資料量比較大,每年隻能進行增量備份,僅備份當天新增資料,系統環境如下:

作業系統

RHEL5.8

核心版本

2.6.18-308.el5

web伺服器位址

192.168.1.104

遠端容災伺服器位址

192.168.1.110

Web端配置

主配置檔案/etc/rsyncd.conf

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<code>uid = nobody</code>

<code>gid = nobody</code>

<code>use chroot = no</code>

<code>max connections = 10</code>

<code>strict modes = </code><code>yes</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/run/rsync</code><code>.lock</code>

<code>log </code><code>file</code> <code>= </code><code>/var/log/rsyncd</code><code>.log</code>

<code>[ixdba]</code>

<code>path = </code><code>/webdata</code>

<code>commnet = ixdba </code><code>file</code>

<code>ignore errors</code>

<code>read</code> <code>only = no</code>

<code>write only = no</code>

<code>hosts allow = *</code>

<code>hosts deny = 192.168.1.200</code>

<code>list = </code><code>false</code>

<code>uid = root</code>

<code>gid = root</code>

<code>auth </code><code>users</code> <code>= backup</code>

<code>secrets </code><code>file</code> <code>= </code><code>/etc/server</code><code>.pass</code>

密碼檔案chmod 600 /etc/server.pass 

<code>backup:ixdba123</code>

啟動rsync守護程序

<code>/usr/local/bin/rsync</code> <code>--daemon</code>

遠端容災端配置

密碼檔案chmod 600 /etc/server.pass

<code>ixdba123</code>

添加計劃任務crontab -e

<code>1 3 * * *  </code><code>/usr/local/bin/rsync</code> <code>-vzrtopg --delete --progress --exclude </code><code>"*access*"</code> <code>--exclude </code><code>"debug*"</code> <code>[email protected]::ixdba </code><code>/ixdba</code><code>.</code><code>dir</code> <code>--password-</code><code>file</code><code>=</code><code>/etc/server</code><code>.pass</code>

分析不足

此時一個遠端容災系統已經搭建完成,但這并非是一個完整意義上的容災方案,由于rsync需要通過觸發才能将伺服器端資料同步,是以兩次觸發同步的時間間隔内,伺服器和用戶端的資料可能不一緻,如果在這個時間間隔内,網站系統出現問題,資料必然丢失,Linux 2.6.13以後的核心提供了inotify檔案系統監控機制,用過rsync與inotify的組合,完全可以實作rsync伺服器端和用戶端的實時資料同步。

rsync+inotify實作資料的實時備份

   inotify是一種強大的、細粒度的、異步的檔案系統時間監控機制,Linux核心從2.6.13版本起,加入了對inotify的支援。通過inotify可以監控檔案系統中添加、删除、修改、移動等各種細微事件,利用這個核心接口,第三方軟體可以監控檔案系統下檔案的各種變化情況,inotify-tools軟體正是基于這種需求實作的一個第三方軟體。

   内容分發伺服器實時同步資料對2個Web伺服器上,inotify是用來監控檔案系統變化的工具,是以必須安裝在内容釋出節點上,内容釋出節點(Server)充當了rsync用戶端的角色,2個Web節點充當了rsync伺服器端的角色,整個資料同步過程就是一個從用戶端向伺服器端發送資料的過程,與前面案例中的邏輯結構剛好相反,系統環境如下:

     節點名稱

     核心版本

       IP位址

網頁資料存放路徑

Web1

/web1/wwwroot

Web2

192.168.1.160

/web2/wwwroot

Server

/web/wwwroot

Web1端配置

<code>[web1]</code>

<code>path = </code><code>/web1/wwwroot</code>

<code>commnet = web1 </code><code>file</code>

<code>hosts allow = 192.168.1.104</code>

<code>hosts deny = *</code>

<code>auth </code><code>users</code> <code>= web1user</code>

<code>web1user:ixdba123</code>

啟動rsync守護程序并添加開機自動啟動

<code>echo</code> <code>"/usr/local/bin/rsync"</code> <code>&gt;&gt;</code><code>/etc/rc</code><code>.</code><code>local</code>

<code>/usr/local/bin/rsync--daemon</code>

Web2端配置

<code>[web2]</code>

<code>path = </code><code>/web2/wwwroot</code>

<code>commnet = web2 </code><code>file</code>

<code>auth </code><code>users</code> <code>= web2user</code>

<code>web2user:ixdba123</code>

Server端配置

安裝inotify-tools

<code>tar</code> <code>xf </code><code>rsync</code><code>-3.0.7.</code><code>tar</code><code>.gz</code>

<code>cd</code> <code>rsync</code><code>-3.0.7</code>

<code>.</code><code>/configure</code>

<code>make</code> <code>&amp;&amp; </code><code>make</code> <code>install</code>

監控目錄變化并同步Web節點腳本

<code>#!/bin/sh</code>

<code>host1=192.168.1.110</code>

<code>host2=192.168.1.160</code>

<code>dir</code><code>=</code><code>/web/wwwroot/</code>

<code>dst1=web1</code>

<code>dst2=web2</code>

<code>usr1=web1user</code>

<code>usr2=web2user</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 close_write,delete,create,attrib $</code><code>dir</code> <code>\</code>

<code>| </code><code>while</code> <code>read</code> <code>files</code>

<code>        </code><code>do</code>

<code>        </code><code>/usr/bin/rsync</code> <code>-vzrtopg --delete --progress --password-</code><code>file</code><code>=</code><code>/etc/server</code><code>.pass $</code><code>dir</code> <code>$usr1@$host1::$dst1</code>

<code>        </code><code>/usr/bin/rsync</code> <code>-vzrtopg --delete --progress --password-</code><code>file</code><code>=</code><code>/etc/server</code><code>.pass $</code><code>dir</code> <code>$usr2@$host2::$dst2</code>

<code>        </code><code>echo</code> <code>"${files} was rsynced"</code> <code>&gt;&gt; </code><code>/tmp/rsync</code><code>.log 2&gt;&amp;1</code>

<code>        </code><code>done</code>

指定權限并放入背景運作

<code>chmod</code> <code>755 </code><code>/web/wwwroot/inotifyrsync</code><code>.sh</code>

<code>/web/wwwroot/inotifyrsync</code><code>.sh &amp;</code>

為此腳本添加開機自動啟動

<code>echo</code> <code>"/web/wwwroot/inotifyrsync.sh &amp;"</code> <code>&gt;&gt; </code><code>/etc/rc</code><code>.</code><code>local</code>

測試結果

Server端(rsync用戶端)建立測試檔案,如圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201308/213932523.png"></a>

Web1端檢視,如圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201308/214125433.png"></a>

Web2端檢視,如圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201308/214223457.png"></a>

本文轉自 ftmoonfans  51CTO部落格,原文連結:http://blog.51cto.com/soulboy/1281704

上一篇: Find指令
下一篇: Sed