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 機制實現的兩臺服務器數據同步以下圖如示:
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!!!