rsync + inotify 實現主機間數據實時同步的原理

1、rsync實現兩臺服務器數據同步的原理:    node

   Rsync 是基於rsync算法校驗源(SRC)與目標(DEST)之間的差別實現數據同步的。也就是說,當使用rsync工具同步數據時候,只複製源(SRC)發生改變的文件,到目標(DEST),這相似於增量備份。因此rsync同步數據的速度是很快的。可是rsync的傳輸性能有點差,在海量小文件須要同步時,表現不好勁。由於rsync是基於文件同步的(不是塊級別的),在傳輸以前還要進行校驗。mysql

   Rsync的工做模式有多中,使用rsync的服務模式來構建:主/從服務器的數據同步。此時rsync工做爲守護進程監聽在:TCP/873 能接收客戶端的數據同步請求。web

客戶端發出的數據同步請求方式有兩種:算法

一、  從遠程rsync服務器拉取數據到本地sql

Pull:
    rsync [OPTION...] [USER@]HOST::SRC... [DEST]
    rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

例:
bash

  從遠程rsync服務器拉取數據(rsync導出的存儲空間中的全部文件鏡像到本地)到本地的/web目錄服務器

[root@node1 web]# rsync -aprtogzl192.168.60.99::web/   /web
 [root@node1web]# rsync -arogtpz rsync://192.168.60.99/web/  /web

二、往遠程服務器推送數據   併發

Push:
    rsync [OPTION...] SRC... [USER@]HOST::DEST
    rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

例:tcp

   往遠程rsyn服務器導出的存儲空間(web)推送數據(文件fstab)ide

 [root@node1/]# rsync /etc/fstab 192.168.60.9::web

 使用rsync協議向遠程rsync服務器導出的存儲空間(web)推送數據(鏡像目錄/etc)

 [root@node1/]# rsync -a /etc rsync://192.168.60.99/web


2、那麼如何實現:實現兩臺服務器的數據同步呢?

要點:只要當數據改變時,rsync客戶端往rsync服務器推送數據或從主服務器拉取數據,就能夠實現兩臺服務器數據同步了。

一、選擇rsync客戶端的工做模式:

由於:rsync客戶端向服務端發出的數據同步請求命令的方式有兩種(推送數據/拉取數據):那麼,Rsync客戶端是從rsync服務器拉取數據(鏡像數據)仍是rsync客戶端推送(上傳)數據,這要視,同步數據源放在rsync服務器端仍是放在rsync客戶端?

說明:本實驗的同步數據源存放在rsync客戶端192.168.60.40所在文件系統的:/web目錄中,因此

使用「推送模式」。

二、選擇觸發rsyc客戶端從rsync服務器端拉取數據或推送數據的方式?

(1)、把rsync客戶端發出的數據同步請求命令作成周期性任務計劃,每隔一段時間同步一次數據。  無論有沒有數據變化都發出一次數據同步請求命令。
(2)、使用內核提供的inotify機制,當數據發生改變時(刪除、修改等)就觸發rsync客戶端發出數據  同步請求。

說明:

    第1種方式,不能保證兩臺服務器的數據是實時同步的,由於數據發生改變與rsync客戶端發出同步請求命令不能聯運起來。若是,咱們的數據更新頻度很快的話,每每會形成某臺服務器的數據落後不少另外一臺服務器的。而第2種解決方案,只要數據發生改變就會發生數據同步請求,它是實時的。

Rsync + inotify 機制實現的兩臺服務器數據同步以下圖如示:

wKioL1QJZHnyIfNPAAKLyZ_b22g260.jpg

3、在192.168.60.99主機搭建rsync服務器

Rsync工做於服務模式,要爲其提供配置文件,配置文件以下:

[root@stu13 /]# cat /etc/rsyncd.conf
#
#
uid = nobody   
gid = nobody
use chroot = no
max connections = 10             # 最大併發鏈接數
strict modes = yes               # 當啓用基於口令認證客戶端時,是否檢查口令文件的權限
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log   # 日誌文件的輸出路徑

[web]                            # rsync服務器輸出的存儲空間叫啥名
path = /web                      # 定義rsync服務器輸出的存儲空間的位置
ignore errors  =yes              # 在數據傳輸中,出現錯誤是否忽略繼續傳輸數據
read only = no                   # 容許客戶端上傳數據(往rsync服務器推送數據)
write only = no                  # 容許客戶端下載數據(從rsync服務器拉取數據)

hosts allow = 192.168.60.0/24    # 容許訪問rsync服務器的客戶端地址
hosts deny = *                   # 只容許hostsallow指令定義的客戶端訪問,其它的都不容許

list = false                     # 當客戶端請求服務器輸出的存儲空間列表時,是否列出來。
uid = root
gid = root


4、在192.168.60.40安裝inotifywatch工具;

要使用inotifywatch工具定義inotify監控的對象和監控事件。Inotify工做在內核空間。

Inotifywatch會把inotify監控到的事件輸出到標準輸出來。

inotify-tools-3.14.tar.gz

安裝步驟:

[root@node1 admin]# tar -xf  inotify-tools-3.14.tar.gz
[root@node1 admin]#cd inotify-tools-3.14
[root@node1 inotify-tools-3.14]#./configure --prefix=/usr/local/inotify-tools
[root@node1 inotify-tools-3.14]#Make && make install

5、在客戶端192.168.60.40設置inotify 與 rsync聯動;

聯動原理:

    能夠經過管道,把innotify監控到的事件送到while循環,由read讀取到有監控事件發生,就執行while循環體內的rsync同步數據請求命令。這樣就實現了inotify與rsync的聯運。代碼以下:

[root@node1 ~]# cat inotify.sh
#/bin/bash
# rsync服務器
rsyncServer=192.168.60.99
# 初監控的文件系統(也就是同步數據源)
src=/web/
# 遠程rsync服務器導出的存儲空間
dst=web
# 一開始就進行數據同步
rsync -azrtopg --delete $src $rsyncServer::$dst

/usr/local/inotify-tools/bin/inotifywait -mrq  -e create,move,delete,modify  $src | while read files;do
   # 監測的事件爲:create,move,delete,modify
   rsync -azrtopg --delete $src $rsyncServer::$dst
done

6、測試;

一、啓用服務

  說明:這裏選擇rsync由超級守護進行xinetd管理。因此,要啓用xinetd服務。

啓動 xinetd服務

[root@stu13 web]# service xinetd start
Starting xinetd:                                           [  OK  ]

開啓rsync服務

[root@stu13 web]# chkconfig rsync  on

二、在rsync服務端運行inotify.sh腳本

[root@node1 ~]# ./inotify.sh &
[1] 6237


說明:在後臺運行。

注意:rsync服務器監聽的端口爲:TCP/873

[root@stu13 web]# netstat -anpt | grep rsync
tcp        0      0 192.168.60.99:873           192.168.60.40:37795         ESTABLISHED 14681/rsync

三、查看rsync服務器192.168.60.99輸出的存儲空間的數據文件

[root@stu13 web]# ll
total 0

四、在rsync客戶端192.168.60.40,複製一些文件到被inotify監控的目錄/web中

[root@node1 web]# cp -r /var/log/* ./

五、查看rsync服務器輸出的存儲空間/web是否有對應的文件

[root@stu13 web]# ls
anaconda.ifcfg.log    btmp           dracut.log        messages-20140817  sa                 spooler-20140824
anaconda.log          ConsoleKit     gdm               messages-20140824  samba              tallylog
anaconda.program.log  cron           httpd             mysqld.log         secure             wpa_supplicant.log
anaconda.storage.log  cron-20140817  lastlog           ntpstats           secure-20140817    wtmp
anaconda.syslog       cron-20140824  maillog           pm-powersave.log   secure-20140824    Xorg.0.log
anaconda.yum.log      cups           maillog-20140817  ppp                spice-vdagent.log  yum.log
audit                 dmesg          maillog-20140824  prelink            spooler
boot.log              dmesg.old      messages          rhsm               spooler-20140817


OK!!!

相關文章
相關標籤/搜索