溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

rsync+inotify實(shí)時(shí)同步環(huán)境部署

發(fā)布時(shí)間:2020-06-05 12:34:46 來源:網(wǎng)絡(luò) 閱讀:2282 作者:摯愛linux 欄目:系統(tǒng)運(yùn)維

rsync+inotify實(shí)時(shí)同步環(huán)境部署

隨著應(yīng)用系統(tǒng)規(guī)模的不斷擴(kuò)大,對(duì)數(shù)據(jù)的安全性和可靠性也提出的更好的要求,rsync在高端業(yè)務(wù)系統(tǒng)中也逐漸暴露出了很多不足。
首先,rsync在同步數(shù)據(jù)時(shí),需要掃描所有文件后進(jìn)行比對(duì),進(jìn)行差量傳輸。如果文件數(shù)量達(dá)到了百萬甚至千萬量級(jí),掃描所有文件將是非常耗時(shí)的,并且正在發(fā)生變化的往往是其中很少的一部分,這是非常低效的方式。
其次,rsync不能實(shí)時(shí)的去監(jiān)測、同步數(shù)據(jù),雖然它可以通過linux守護(hù)進(jìn)程的方式進(jìn)行觸發(fā)同步,但是兩次觸發(fā)動(dòng)作一定會(huì)有時(shí)間差,這樣就導(dǎo)致了服務(wù)端和客戶端數(shù)據(jù)可能出現(xiàn)不一致,無法在應(yīng)用故障時(shí)完全的恢復(fù)數(shù)據(jù)。

基于以上兩種情況,可以使用rsync+inotify的組合來解決,可以實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)同步。

inotify是一種強(qiáng)大的、細(xì)粒度的、異步的文件系統(tǒng)事件控制機(jī)制。linux內(nèi)核從2.6.13起,加入了inotify支持,通過inotify可以監(jiān)控文件系統(tǒng)中添加、刪除、修改、移動(dòng)等各種事件,利用這個(gè)內(nèi)核接口,第三方軟件就可以監(jiān)控文件系統(tǒng)下文件的各種變化情況,而inotify-tools正是實(shí)施監(jiān)控的軟件。
在使用rsync首次全量同步后,結(jié)合inotify對(duì)源目錄進(jìn)行實(shí)時(shí)監(jiān)控,只有有文件變動(dòng)或新文件產(chǎn)生,就會(huì)立刻同步到目標(biāo)目錄下,非常高效使用!

需求說明:

分別將

192.168.1.1的/Data/fangfull_upload和/Data/erp_upload
192.168.1.2的/Data/xqsj_upload/和/Data/fa`n`ghu_upload_src
192.168.1.3的/Data/Static_img/webroot/ssapp-prod和/usr/local/nginx/html/ssapp.prod

實(shí)時(shí)同步到
192.168.1.5的/home/backup/image-back目錄下對(duì)應(yīng)的fangfull_upload、erp_upload、xqsj_upload、fanghu_upload_src、ssapp-prod和ssapp.prod目錄。

這樣的話:
(1)192.168.1.1、192.168.1.2、192.168.1.3這三臺(tái)服務(wù)器是源服務(wù)器,作為rsync的客戶端,部署rsync+inotify。
(2)192.168.1.5是目標(biāo)服務(wù)器,作為rsync的服務(wù)端。只需要安裝配置rsync即可,不需要安裝inotify。

一.在目標(biāo)服務(wù)器192.168.1.5上部署rsync服務(wù)端。

1)關(guān)閉selinux
vim /etc/selinux/config
SELINUX=disabled
setenforce 0
2)防火墻上允許以上三臺(tái)源服務(wù)器訪問它的22端口和873端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.1" port protocol="tcp" port="22" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.1" port protocol="tcp" port="873" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.2" port protocol="tcp" port="22" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.2" port protocol="tcp" port="873" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.3" port protocol="tcp" port="22" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.3" port protocol="tcp" port="873" accept"

systemctl restart firewalld
3)安裝部署rsync服務(wù)
yum install rsync xinetd
vim /etc/xinetd.d/rsync
.....
disable = no               #由默認(rèn)的yes改為no,設(shè)置開機(jī)啟動(dòng)rsync
啟動(dòng)xineted服務(wù)

/etc/init.d/xinetd start

創(chuàng)建/etc/rsyncd.conf文件,并配置同步策略。添加如下代碼:
 vim /etc/rsyncd.conf
 log file = /var/log/rsyncd.log          #日志文件位置,啟動(dòng)rsync后自動(dòng)產(chǎn)生這個(gè)文件,無需提前創(chuàng)建
pidfile = /var/run/rsyncd.pid           #pid文件的存放位置
lock file = /var/run/rsync.lock        #支持max connections參數(shù)的鎖文件
secrets file = /etc/rsync.pass         #用戶認(rèn)證配置文件,里面保存用戶名稱和密碼,后面會(huì)創(chuàng)建這個(gè)文件
motd file = /etc/rsyncd.Motd          #rsync啟動(dòng)時(shí)歡迎信息頁面文件位置(自己創(chuàng)建這個(gè)文件,內(nèi)容隨便自定義)

[fangfull_upload]                            #自定義名稱
path = /home/backup/image-back/fangfull_upload           #rsync服務(wù)端數(shù)據(jù)目錄路徑,即同步到目標(biāo)目錄后的存放路徑
comment = fangfull_upload                                             #模塊名稱與[fangfull_upload]自定義名稱相同
uid = nobody                                 #設(shè)置rsync運(yùn)行的uid權(quán)限。這個(gè)要保證同步到目標(biāo)目錄后的權(quán)限和源目錄一致,即都是nobody!
gid = nobody                                #設(shè)置rsync運(yùn)行的gid權(quán)限。
port=873                                    #默認(rèn)的rsync端口
use chroot = no                          #默認(rèn)為true,修改為no或false,增加對(duì)目錄文件軟連接的備份
read only = no                            #設(shè)置rsync服務(wù)端文件為讀寫權(quán)限
list = no                                      #不顯示rsync服務(wù)端資源列表
max connections = 200              #最大連接數(shù)
timeout = 600                           #設(shè)置超時(shí)時(shí)間
auth users = RSYNC_USER          #執(zhí)行數(shù)據(jù)同步的用戶名,需要后面手動(dòng)設(shè)置??梢栽O(shè)置多個(gè),用英文狀態(tài)下逗號(hào)隔開
hosts allow = 192.168.1.1        #允許進(jìn)行數(shù)據(jù)同步的客戶端IP地址,可以設(shè)置多個(gè),用英文狀態(tài)下逗號(hào)隔開
hosts deny = 192.168.1.194       #禁止數(shù)據(jù)同步的客戶端IP地址,可以設(shè)置多個(gè),用英文狀態(tài)下逗號(hào)隔開(如果沒有禁止,就不用設(shè)置這一行)

[erp_upload]
path = /home/backup/image-back/erp_upload
comment = erp_upload
uid = nobody
gid = nobody
port=873
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
auth users = RSYNC_USER
hosts allow = 192.168.1.1

[xqsj_upload]
path = /home/backup/image-back/xqsj_upload
comment = xqsj_upload
uid = nobody
gid = nobody
port=873
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
auth users = RSYNC_USER
hosts allow = 192.168.1.2

[fanghu_upload_src]
path = /home/backup/image-back/fanghu_upload_src
comment = fanghu_upload_src
uid = nobody
gid = nobody
port=873
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
auth users = RSYNC_USER
hosts allow = 192.168.1.2

[ssapp-prod]
path = /home/backup/image-back/ssapp-prod
comment = ssapp-prod
uid = nginx
gid = nginx
port=873
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
auth users = RSYNC_USER
hosts allow = 192.168.1.3

[ssapp.prod]
path = /home/backup/image-back/ssapp.prod
comment = ssapp.prod
uid = nginx
gid = nginx
port=873
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
auth users = RSYNC_USER
hosts allow = 192.168.1.3
創(chuàng)建用戶認(rèn)證文件 (多個(gè)模塊用的是這同一個(gè)認(rèn)證文件)
vim /etc/rsync.pass
xiaoshengyu:123456@rsync
設(shè)置文件權(quán)限,即rsyncd.conf和rsync.pass認(rèn)證文件都是600權(quán)限!
chmod 600 /etc/rsyncd.conf
chmod 600 /etc/rsync.pass
重啟rsync服務(wù)
/etc/init.d/xinetd restart
lsof -i:873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xinetd 22041 root 5u IPv6 3336440 0t0 TCP *:rsync (LISTEN)
4)最后,創(chuàng)建rsync同步過來后的目標(biāo)目錄
cd /home/backup/image-back/
mkdir fangfull_upload erp_upload xqsj_upload fanghu_upload_src ssapp-prod ssapp.prod

第二部分:在源服務(wù)器192.168.1.1、192.168.1.2、192.168.1.3部署rsync客戶端和inotify監(jiān)控。

1)三臺(tái)機(jī)器同樣操作
關(guān)閉selinux,做為客戶端的rsync可以不用在iptables里開放873端口
vim /etc/selinux/config
SELINUX=disabled
setenforce 0
2)三臺(tái)機(jī)器同樣操作
安裝rsync
yum install rsync xinetd
vim /etc/xinetd.d/rsync
.....
disable = no                     #由默認(rèn)的yes改為no,設(shè)置開機(jī)啟動(dòng)rsync
啟動(dòng)rsync服務(wù)
/etc/init.d/xinetd start
lsof -i:873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xinetd 22041 root 5u IPv6 3336440 0t0 TCP *:rsync (LISTEN)
創(chuàng)建同步的密碼文件,這個(gè)文件名可以跟服務(wù)端的認(rèn)證文件不一樣,但是里面的密碼必須一致!用于rsync同步命令中。不過,最好兩邊的文件設(shè)置成一樣,便于管理
vim /etc/rsync.pass
123456@rsync
設(shè)置rsync.pass密碼文件為600權(quán)限

chmod 600 /etc/rsync.pass

3)三臺(tái)機(jī)器同樣操作
查看服務(wù)器內(nèi)核是否支持inotify,出現(xiàn)下面的內(nèi)容,說明服務(wù)器內(nèi)核支持inotify
 ll /proc/sys/fs/inotify
 max_queued_events
 max_user_instances
 max_user_watches
下面開始安裝inotify-tools
yum install make gcc gcc-c++                          #安裝編譯工具
cd /usr/local/src
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify
make && make install
設(shè)置系統(tǒng)環(huán)境變量
vim /etc/profile
 export PATH=$PATH:/usr/local/inotify/bin
 source /etc/profile
添加庫文件
vim /etc/ld.so.conf
/usr/local/inotify/lib
 ldconfig
修改inotify默認(rèn)參數(shù)(inotify默認(rèn)內(nèi)核參數(shù)值太小)

查看系統(tǒng)默認(rèn)參數(shù)值

sysctl -a | grep max_queued_events
fs.inotify.max_queued_events = 16384
sysctl -a | grep max_user_watches
fs.inotify.max_user_watches = 8192
sysctl -a | grep max_user_instances
fs.inotify.max_user_instances = 128
修改參數(shù):
sysctl -w fs.inotify.max_queued_events="99999999"
sysctl -w fs.inotify.max_user_watches="99999999"
sysctl -w fs.inotify.max_user_instances="65535
"
參數(shù)說明:

max_queued_events:
inotify隊(duì)列最大長度,如果值太小,會(huì)出現(xiàn)" Event Queue Overflow "錯(cuò)誤,導(dǎo)致監(jiān)控文件不準(zhǔn)確
max_user_watches:
要同步的文件包含多少目錄,可以用:find /Data/xqsj_upload -type d | wc -l 統(tǒng)計(jì)這些源目錄下的目錄數(shù),必須保證max_user_watches值大于統(tǒng)計(jì)結(jié)果(這里/Data/xqsj_upload為同步的源文件目錄)
max_user_instances:
每個(gè)用戶創(chuàng)建inotify實(shí)例最大值

4)接著執(zhí)行同步操作:
分別在三臺(tái)源服務(wù)器上執(zhí)行rsync首次全量同步的操作(加--delete參數(shù),保持目標(biāo)目錄和源目錄下文件絕對(duì)一致)

在192.168.1.1服務(wù)器上
第一次全量同步:

rsync -avH --port=873 --progress --delete /Data/fangfull_upload/ RSYNC_USER@192.168.1.5::fangfull_upload --password-file=/etc/rsync.pass
rsync -avH --port=873 --progress --delete /Data/erp_upload/ RSYNC_USER@192.168.1.5::erp_upload --password-file=/etc/rsync.pass
待第一次rsync全量同步完成后,就進(jìn)行rsync+inotify實(shí)時(shí)同步腳本操作。

實(shí)時(shí)同步腳本里添加的是--delete-before參數(shù),而不是--delete參數(shù)(第一次全量同步時(shí)rsync用的參數(shù)),二者區(qū)別:
--delete參數(shù):表示rsync同步前,強(qiáng)制刪除目標(biāo)目錄中的所有文件,然后再執(zhí)行同步操作。
--delete-before參數(shù):表示rsync同步前,會(huì)先對(duì)目標(biāo)目錄進(jìn)行一次掃描檢索,刪除目標(biāo)目錄中對(duì)比源目錄的多余文件,然后再執(zhí)行同步操作。顯然比--delete參數(shù)安全些。

cd /home/rsync/
cat rsync_fangfull_upload_inotify.sh
#!/bin/bash
SRCDIR=/Data/fangfull_upload/
USER=RSYNC_USER
IP=192.168.1.5
DESTDIR=fangfull_upload
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $SRCDIR | while read file
do
/usr/bin/rsync -avH --port=873 --progress --delete-before $SRCDIR $USER@$IP::$DESTDIR --password-file=/etc/rsync.pass
echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1
done
cat rsync_erp_upload_inotify.sh
#!/bin/bash
SRCDIR=/Data/erp_upload/
USER=RSYNC_USER
IP=192.168.1.5
DESTDIR=erp_upload
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $SRCDIR | while read file
do
/usr/bin/rsync -avH --port=873 --progress --delete-before $SRCDIR $USER@$IP::$DESTDIR --password-file=/etc/rsync.pass
echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1
done
然后啟動(dòng)同步腳本,放在后臺(tái)執(zhí)行!
nohup sh rsync_fangfull_upload_inotify.sh &
nohup sh rsync_erp_upload_inotify.sh &
檢查下是否腳本啟動(dòng)成功了

ps -ef|grep inotify
root 11390 1 0 13:41 ? 00:00:00 sh rsync_erp_upload_inotify.sh
root 11392 11390 0 13:41 ? 00:00:00 sh rsync_erp_upload_inotify.sh
root 11397 1 0 13:41 ? 00:00:00 sh rsync_fangfull_upload_inotify.sh
root 11399 11397 0 13:41 ? 00:00:00 sh rsync_fangfull_upload_inotify.sh
root 21842 11702 0 17:22 pts/0 00:00:00 grep --color=auto inotify

最后進(jìn)行測試:

比如在源目錄/Data/fangfull_upload中創(chuàng)建一個(gè)文件或目錄,會(huì)自動(dòng)實(shí)時(shí)同步到目標(biāo)機(jī)器192.168.1.5的目標(biāo)目錄/home/backup/image-back/fangfull_upload中。


在192.168.1.2服務(wù)器上

第一次全量同步:

rsync -avH --port=873 --progress --delete /Data/xqsj_upload/ RSYNC_USER@192.168.1.5::xqsj_upload --password-file=/etc/rsync.pass
rsync -avH --port=873 --progress --delete /Data/fanghu_upload_src/ RSYNC_USER@192.168.1.5::fanghu_upload_src --password-file=/etc/rsync.pass

rsync+inotify實(shí)時(shí)同步:

cd /home/rsync/
cat rsync_xqsj_upload_inotify.sh
#!/bin/bash
SRCDIR=/Data/xqsj_upload/
USER=RSYNC_USER
IP=192.168.1.5
DESTDIR=xqsj_upload
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $SRCDIR | while read file
do
/usr/bin/rsync -avH --port=873 --progress --delete-before $SRCDIR $USER@$IP::$DESTDIR --password-file=/etc/rsync.pass
echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1
done
cat rsync_fanghu_upload_src_inotify.sh
#!/bin/bash
SRCDIR=/Data/fanghu_upload_src/
USER=RSYNC_USER
IP=192.168.1.5
DESTDIR=fanghu_upload_src
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $SRCDIR | while read file
do
/usr/bin/rsync -avH --port=873 --progress --delete-before $SRCDIR $USER@$IP::$DESTDIR --password-file=/etc/rsync.pass
echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1
done
然后啟動(dòng)同步腳本,放在后臺(tái)執(zhí)行!
nohup sh rsync_xqsj_upload_inotify.sh &
nohup rsync_fanghu_upload_src_inotify.sh &
最后進(jìn)行測試:

比如在源目錄/Data/xqsj_upload中創(chuàng)建一個(gè)文件或目錄,會(huì)自動(dòng)實(shí)時(shí)同步到目標(biāo)機(jī)器192.168.1.5的目標(biāo)目錄/home/backup/image-back/xqsj_upload中。


在192.168.1.3服務(wù)器上

第一次全量同步:

rsync -avH --port=873 --progress --delete /Data/Static_img/webroot/ssapp-prod/ RSYNC_USER@192.168.1.5::ssapp-prod --password-file=/etc/rsync.pass
rsync -avH --port=873 --progress --delete /usr/local/nginx/html/ssapp.prod/ RSYNC_USER@192.168.1.5::ssapp.prod --password-file=/etc/rsync.pass
rsync+inotify實(shí)時(shí)同步:
cd /home/rsync/
cat rsync_ssapp-prod_inotify.sh
#!/bin/bash
SRCDIR=/Data/Static_img/webroot/ssapp-prod/
USER=RSYNC_USER
IP=192.168.1.5
DESTDIR=ssapp-prod
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $SRCDIR | while read file
do
/usr/bin/rsync -avH --port=873 --progress --delete-before $SRCDIR $USER@$IP::$DESTDIR --password-file=/etc/rsync.pass
echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1
done
cat rsync_ssapp.prod_inotify.sh
#!/bin/bash
SRCDIR=/usr/local/nginx/html/ssapp.prod/
USER=RSYNC_USER
IP=192.168.1.5
DESTDIR=ssapp.prod
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $SRCDIR | while read file
do
/usr/bin/rsync -avH --port=873 --progress --delete-before $SRCDIR $USER@$IP::$DESTDIR --password-file=/etc/rsync.pass
echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1
done
然后啟動(dòng)同步腳本,放在后臺(tái)執(zhí)行!
nohup sh rsync_ssapp-prod_inotify.sh &
nohup rsync_ssapp.prod_inotify.sh &
最后進(jìn)行測試:

比如在源目錄/Data/Static_img/webroot/ssapp-prod中創(chuàng)建一個(gè)文件或目錄,會(huì)自動(dòng)實(shí)時(shí)同步到目標(biāo)機(jī)器192.168.1.5的目標(biāo)目錄/home/backup/image-back/ssapp-prod中。

如果在同步過程中,發(fā)現(xiàn)中途報(bào)錯(cuò)!重復(fù)執(zhí)行同步命令一直是報(bào)這個(gè)錯(cuò)誤:
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at
main.c(1505)

最后發(fā)現(xiàn)原因:
是因?yàn)樵谕降臅r(shí)候,源目錄下有軟鏈接文件!
rsync同步軟鏈接文件,應(yīng)該加參數(shù)-l

所以,最好在使用rsync同步命令的時(shí)候,后面跟-avpgolr參數(shù)組合(將上面的-avH改成-avpgolr)

-a:遞歸
-v:打印詳細(xì)過程
-p:保持文件屬性
-g:文件所屬組不變
-o:文件所屬者不變
-l:軟連接屬性
-r:同步目錄時(shí)的參數(shù)
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI