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
/***************************************************/
有什麼不懂的可以留言一塊討論