1. 程式人生 > >centos7 Rsync+sersync實現資料實時同步

centos7 Rsync+sersync實現資料實時同步

一、為什麼要用rsync+sersync架構?

1、sersync是基於inotify開發的,類似於inotify-tools的工具

2、sersync可以記錄下被監聽目錄中發生變化的(包括增加、刪除、修改)具體某一個檔案或者某一個目錄的名字,然後使用rsync同步的時候,只同步發生變化的檔案或者目錄

二、rsync+inotify-tools與rsync+sersync架構的區別?

1、rsync+inotify-tools

 a、inotify只能記錄下被監聽的目錄發生了變化(增,刪,改)並沒有把具體是哪個檔案或者哪個目錄發生了變化記錄下來;

 b、rsync在同步的時候,並不知道具體是哪個檔案或目錄發生了變化,每次都是對整個目錄進行同步,當資料量很大時,整個目錄同步非常耗時(rsync要對整個目錄遍歷查詢對比檔案),因此效率很低

2、rsync+sersync

 a、sersync可以記錄被監聽目錄中發生變化的(增,刪,改)具體某個檔案或目錄的名字;

 b、rsync在同步時,只同步發生變化的檔案或目錄(每次發生變化的資料相對整個同步目錄資料來說很小,rsync在遍歷查詢對比檔案時,速度很快),因此效率很高。

同步過程:

1.  在同步伺服器上開啟sersync服務,sersync負責監控配置路徑中的檔案系統事件變化;

2.  呼叫rsync命令把更新的檔案同步到目標伺服器;

3.  需要在主伺服器配置sersync,在同步目標伺服器配置rsync server(注意:是rsync服務)

同步過程和原理:

1.  使用者實時的往sersync伺服器上寫入更新檔案資料;

2.  此時需要在同步主伺服器上配置sersync服務;

3.  在另一臺伺服器開啟rsync守護程序服務,以同步拉取來自sersync伺服器上的資料;

通過rsync的守護程序服務後可以發現,實際上sersync就是監控本地的資料寫入或更新事件;然後,在呼叫rsync客戶端的命令,將寫入或更新事件對應的檔案通過rsync推送到目標伺服器

一臺裝sersync一臺裝rsync服務  對151網站根目錄的/var/www/html目錄備份到145的/www  (所以145上只安裝rsync就可以了,這個問題繞了好長時間哈哈)

Sersync伺服器(資料來源,源機器):192.168.1.151
Rsync伺服器(備份端,目標機器):192.168.1.145

在145上安裝
 [[email protected] ~]# yum -y install xinetd rsync
 [[email protected] ~]# rsync --daemon
 [[email protected] ~]# netstat -antup | grep 873

tcp        0      0:::873                      :::*                        LISTEN      2349/xinetd

[[email protected] ~]# mkdir /www                     #建立備份目錄

常用的命令 –avz  --exclude=filname,需要過濾的檔案

-a, --archive archive mode 許可權儲存模式,相當於 -rlptgoD 引數,存檔,遞迴,保持屬性等

-z, --compress 壓縮模式, 當資料在傳送到目的端進行檔案壓縮.

--delete, 刪除那些目標位置有的檔案而備份源沒有的檔案

--password-file=FILE ,從 FILE 中得到密碼

使用rsync備份資料

對151網站根目錄的/var/www/html目錄備份到145的/www

在151機器上安裝

[[email protected] ~]# yum -y  rsync install 

[[email protected] ~]# rsync -avz /www/ [email protected]:/www/    這是用root使用者直接同步需要輸入密碼 

如果有埠    rsync -e 'ssh -p 22' -avl /www/www/ [email protected]:/www/www/

非系統使用者備份資料

使用系統配置檔案   vim /etc/rsyncd.conf   來備份資料,建立備份賬戶,最後把rsync以deamon方式執行

145 rsyncd.conf配置檔案

uid=root
gid=root
address=192.168.1.145
port=873
hosts allow=192.168.0.0/24
use chroot=yes
max connections=5
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
[wwwroot]
path=/www/
comment=used for web-data root
read only=false
list=yes
auth users=rsyncuser
secrets file =/etc/rsync.passwd

注意注意  引數後面的空格最好都去掉

解釋

uid=root
gid=root
address=192.168.1.145                 #監聽IP
port=873                              #監聽埠
hosts allow=192.168.0.0/24            #允許同步客戶端的IP地址,或者用*表示所有 192.168.1.0/24或192.168.1.0/255.255.255.0
use chroot = yes                       #是否囚牢,鎖定家目錄,
max connections =5                     #最大連線數
pid file =/var/run/rsyncd.pid          #程序PID,自動生成
lock file =/var/run/rsync.lock         #指max connectios引數的鎖檔案
log file =/var/log/rsyncd.log          #日誌檔案位置
[wwwroot]                              #共享模組名稱
path =/www/                      #路徑
comment = used for web-data root    #描述
read only = false                                 #設定服務端檔案讀寫許可權
list = yes                                         #是否允許檢視模組資訊
auth users = rsyncuser                        #備份的使用者,和系統使用者無關

secrets file =/etc/rsync.passwd        #存放使用者的密碼檔案,格式是  使用者名稱:密碼

exclude = .svn/ .git/  retime/      #不同步的檔案

dont compress  #用來指定那些不進行壓縮處理再傳輸的檔案,預設值是 *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2  *.tbz
                            因為這些檔案已經經過壓縮咯,預設不用修改。

編輯密碼 [[email protected]  ~]# vim /etc/rsync.passwd  rsyncuser:132456

給許可權     [[email protected]  ~]# chmod 600  /etc/rsync.passwd

啟動服務測試

啟動rsync與xinetd服務
[[email protected]  ~]# systemctl start xinetd  #啟動xinetd服務
[[email protected]  ~]# systemctl enable xinetd  #將xinetd服務加入開機項
[[email protected]  ~]# rsync --daemon --config=/etc/rsyncd.conf  #載入配置檔案rsyncd.conf啟動rsync服務
[[email protected]  ~]# netstat -antup | grep :873
tcp        0      0:::873                      :::*                        LISTEN      45089/xinetd

rsync語法:   rsync 選項 使用者名稱@備份源伺服器IP::共享模組名 目標目錄

[[email protected] ~]# rsync -avz  /www/ [email protected]::wwwroot
[[email protected] ~]# vim /etc/rsync.passwd 
123456 
[[email protected] ~]# chmod 600  /etc/rsync.passwd 
[[email protected] ~]#rsync -avz --delete  /www/ [email protected]::wwwroot --password-file=/etc/rsync.passwd  
這樣做個定時就可以實現定時備份了
[[email protected] ~]# vim autobackup.sh
#!/bin/bash
rsync -avz /www/ [email protected]::wwwroot --password-file=/opt/passfile 
[[email protected] ~]# chmod +x autobackup.sh
[[email protected]~]# sh autobackup.sh

rsyncd+sersync 時時同步

1、下載sersync   在151上安裝下面操作都是在151上 (  從151上往145上同步 所以在151安裝

在google code下載sersync的可執行檔案版本,裡面有配置檔案與可執行檔案

wget https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz(有時下載失敗,所有要本地留存才行)

上傳到伺服器  /usr/local/ 目錄下

tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz     解壓後他的檔名是 GNU-Linux-x86 

mv GNU-Linux-x86 sersync    名字改成serync 裡面機兩個檔案一個是二進位制檔案 一個是配置檔案

2、配置sersync

 修改24--28行
<sersync>
        <localpath watch="/www/">    #本地同步目錄
            <remote ip="192.168.0.64" name="wwwroot"/>   #rsync模組名稱
修改31--34行,認證部分【rsync密碼認證】
<rsync>
            <commonParams params="-artuz"/>
            <auth start="true" users="rsyncuser" passwordfile="/etc/rsync.passwd"/>
            <userDefinedPort start="false" port="874"/><!-- port=874 -->
            <timeout start="false" time="100"/><!-- timeout=100 -->
            <ssh start="false"/>

儲存退出

3、配置sersync開啟sersync守護程序同步資料

/usr/local/sersync/sersync2  -d -r -o  /usr/local/sersync/confxml.xml

測試  在151上新增檔案   看145上有沒有變化 可動態檢視 watch ls -l

4、設定sersync監控開機自動執行
vi /etc/rc.d/rc.local  #編輯,在最後新增一行

/usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/confxml.xml  #設定開機自動執行指令碼

5、新增指令碼監控sersync是否正常執行

vi  /usr/local/sersync/check_sersync.sh  #編輯,新增以下程式碼
#!/bin/sh
sersync="/usr/local/sersync/sersync2"
confxml="/usr/local/sersync/confxml.xml"
status=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)
if [ $status -eq 0 ];
then
$sersync -d -r -o $confxml &
else
exit 0;
fi
  chmod +x /usr/local/sersync/check_sersync.sh  #新增指令碼執行許可權  

把這個指令碼加到任務計劃,定期執行檢測

補充: 多例項情況

 1、配置多個confxml.xml檔案(比如:www、bbs、blog....等等)

 2、根據不同的需求同步對應的例項檔案

/usr/local/sersync/sersync2  -d -o /usr/local/sersync/www_confxml.xml

/usr/local/sersync/sersync2  -d -o /usr/local/sersync/bbs_confxml.xml 

修改配置之後需要重啟

systemctl restart xinetd  重啟 xinetd

systemctl restart rsyncd 重啟 rsyncd

///////////************篩選 rsync 的傳輸目標*****************************/

篩選 rsync 的傳輸目標
使用 --exclude/--include 選項
可以使用 ––exclude 選項排除源目錄中要傳輸的檔案;同樣地,也可以使用 ––include 選項指定要傳輸的檔案。
例如:下面的 rsync 命令將 192.168.0.101 主機上的 /www 目錄(不包含 /www/logs 和 /www/conf子目錄)複製到本地的 /backup/www/ 。
# rsync -vzrtopg --delete --exclude "logs/" --exclude "conf/" --progress [email protected]:/www/ /backup/www/
又如:下面的 rsync 命令僅複製目錄結構而忽略掉目錄中的檔案。
# rsync -av --include '*/' --exclude '*' \
[email protected]:/www/ /backup/www-tree/
選項 ––include 和 ––exclude 都不能使用間隔符。例如:
--exclude "logs/" --exclude "conf/"
不能寫成 --exclude "logs/ conf/"
使用 --exclude-from/--include-from 選項
當 include/exclude 的規則較複雜時,可以將規則寫入規則檔案。使用規則檔案可以靈活地選擇傳輸哪些檔案(include)以及忽略哪些檔案(exclude)。
若檔案/目錄在剔除列表中,則忽略傳輸
若檔案/目錄在包含列表中,則傳輸之
若檔案/目錄未被提及,也傳輸之
在 rsync 的命令列中使用 ––exclude-from=FILE 或 ––include-from=FILE 讀取規則檔案。
規則檔案 FILE 的書寫約定:
每行書寫一條規則 RULE
以 # 或 ; 開始的行為註釋行
包含(include)和排除(exclude)規則的語法如下:
include PATTERN 或簡寫為 + PATTERN
exclude PATTERN 或簡寫為 - PATTERN
PATTERN 的書寫規則如下:
以 / 開頭:匹配被傳輸的根路徑上的檔案或目錄
以 / 結尾:匹配目錄而非普通檔案、連結檔案或裝置檔案
使用萬用字元
*:匹配非空目錄或檔案(遇到 / 截止)
**:匹配任何路徑(包含 / )
?:匹配除了 / 的任意單個字元
[:匹配字符集中的任意一個字元,如 [a-z] 或 [[:alpha:]]
可以使用轉義字元 \ 將上述萬用字元還原為字元本身含義
下面給出幾個使用規則的例子:
例1:
# 不傳輸所有後綴為 .o 的檔案
- *.o
# 不傳輸傳輸根目錄下名為 foo 的檔案或目錄
- /foo
# 不傳輸名為 foo 的目錄
- foo/
# 不傳輸 /foo 目錄下的名為 bar 的檔案或目錄
- /foo/bar
例2:
# 傳輸所有目錄和C語言原始檔並禁止傳輸其他檔案
+ */
+ *.c
- *
例3:
# 僅傳輸 foo 目錄和其下的 bar.c 檔案
+ foo/
+ foo/bar.c
- *
將規則寫入規則檔案之後,如何在命令列上使用它呢?下面給出一個例子:
首先將下面的規則存入名為 www-rsync-rules 的檔案
# 不傳輸 logs 目錄
- logs/
# 不傳輸字尾為 .tmp 的檔案
- *.tmp
# 傳輸 Apache 虛擬主機文件目錄(/*/ 匹配域名)
+ /srv/www/
+ /srv/www/*/
+ /srv/www/*/htdocs/
+ /srv/www/*/htdocs/**
# 傳輸每個使用者的 public_html 目錄(/*/ 匹配使用者名稱)
+ /home/
+ /home/*/
+ /home/*/public_html/
+ /home/*/public_html/**
# 禁止傳輸其他
- *
然後即可使用類似如下的 rsync 命令:
rsync -av --delete --exclude-from=www-rsync-rules / remotehost:/dest/dir

/***************************************************/

有什麼不懂的可以留言一塊討論