溫馨提示×

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

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

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

發(fā)布時(shí)間:2020-07-10 00:52:12 來(lái)源:網(wǎng)絡(luò) 閱讀:463 作者:何小帥 欄目:系統(tǒng)運(yùn)維

1 背景

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

在生產(chǎn)環(huán)境,有時(shí)會(huì)需要兩臺(tái)主機(jī)的特定目錄實(shí)現(xiàn)實(shí)時(shí)同步。比如,將NFS共享目錄的數(shù)據(jù)文件,自動(dòng)實(shí)時(shí)同步到備份的服務(wù)器特定目錄中

2 實(shí)時(shí)同步技術(shù)簡(jiǎn)介

2.1 實(shí)現(xiàn)實(shí)時(shí)同步的方法

inotify + rsync 方式實(shí)現(xiàn)數(shù)據(jù)同步
sersync :金山公司周洋在 inotify 軟件基礎(chǔ)上進(jìn)行開發(fā)的,功能更加強(qiáng)大

2.2 工作原理

1.需要利用監(jiān)控服務(wù)(inotify),監(jiān)控同步數(shù)據(jù)服務(wù)器目錄中信息的變化
2.發(fā)現(xiàn)目錄中的數(shù)據(jù)產(chǎn)生變化,就利用rsync服務(wù)推送到備份服務(wù)器上

2.3 inotify

異步的文件系統(tǒng)事件監(jiān)控機(jī)制,利用事件驅(qū)動(dòng)機(jī)制,而無(wú)須通過(guò)諸如cron等的輪詢機(jī)制來(lái)獲取事件,linux內(nèi)核從2.6.13起支持 inotify,通過(guò)inotify可以監(jiān)控文件系統(tǒng)中添加、刪除,修改、移動(dòng)等各種事件

[root@CentOS7-02 ~]#grep -i inotify /boot/config-3.10.0-1062.el7.x86_64 
CONFIG_INOTIFY_USER=y

2.4 實(shí)現(xiàn)inotify的軟件

inotify-tools
sersync
lrsyncd

2.5 inotify+rsync使用方式

inotify 對(duì)同步數(shù)據(jù)目錄信息的監(jiān)控
rsync 完成對(duì)數(shù)據(jù)的同步
利用腳本進(jìn)行結(jié)合

3 實(shí)現(xiàn)inotify

3.1 前提條件,內(nèi)核版本不能小于2.6.13,執(zhí)行下面命令查看內(nèi)核是否支持inotify

# 列出下面的文件,說(shuō)明服務(wù)器內(nèi)核支持inotify
[root@CentOS7-02 ~]#ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Dec 20 19:42 max_queued_events
-rw-r--r-- 1 root root 0 Dec 20 19:42 max_user_instances
-rw-r--r-- 1 root root 0 Dec 20 19:42 max_user_watches

# inotify內(nèi)核參數(shù)說(shuō)明:
max_queued_events:inotify事件隊(duì)列最大長(zhǎng)度,如值太小會(huì)出現(xiàn) Event Queue Overflow 錯(cuò)誤,默認(rèn)值:16384
max_user_instances:每個(gè)用戶創(chuàng)建inotify實(shí)例最大值,默認(rèn)值:128
max_user_watches:可以監(jiān)視的文件數(shù)量(單進(jìn)程),默認(rèn)值:8192

#上面的參數(shù)可以通過(guò)修改/etc/sysctl.conf文件來(lái)調(diào)整大小,如下所示
[root@CentOS7-02 ~]#vim /etc/sysctl.conf
fs.inotify.max_queued_events=66666
fs.inotify.max_user_watches=100000

[root@CentOS7-02 ~]#sysctl -p
fs.inotify.max_queued_events = 66666
fs.inotify.max_user_watches = 100000

[root@CentOS7-02 ~]#cat /proc/sys/fs/inotify/*
66666
128
100000

3.2 inotify-tools工具

# 參考文檔:https://github.com/rvoicilas/inotify-tools/wiki
# 安裝(基于epel源)
[root@CentOS7-02 ~]#yum -y install inotify-tools

3.2.1 inotify-tools包主要工具

inotifywait: 在被監(jiān)控的文件或目錄上等待特定文件系統(tǒng)事件(open ,close,delete等)發(fā)生,常用于實(shí)時(shí)同步的目錄監(jiān)控
inotifywatch:收集被監(jiān)控的文件系統(tǒng)使用的統(tǒng)計(jì)數(shù)據(jù),指文件系統(tǒng)事件發(fā)生的次數(shù)統(tǒng)計(jì)
3.2.1.1 inotifywait 命令常見選項(xiàng)
-m,--monitor 始終保持事件監(jiān)聽
-d, --daemon 以守護(hù)進(jìn)程方式執(zhí)行,和-m相似,配合-o使用
-r, --recursive 遞歸監(jiān)控目錄數(shù)據(jù)信息變化
-q, --quiet 輸出少量事件信息
--exclude 指定排除文件或目錄,使用擴(kuò)展的正則表達(dá)式匹配的模式實(shí)現(xiàn)
--excludei 和exclude相似,不區(qū)分大小寫
-o, --outfile 打印事件到文件中,相當(dāng)于標(biāo)準(zhǔn)正確輸出,注意:使用絕對(duì)路徑
-s, --syslogOutput 發(fā)送錯(cuò)誤到syslog相當(dāng)于標(biāo)準(zhǔn)錯(cuò)誤輸出
--timefmt 指定時(shí)間輸出格式
--format 指定的輸出格式;即實(shí)際監(jiān)控輸出內(nèi)容
-e 指定監(jiān)聽指定的事件,如果省略,表示所有事件都進(jìn)行監(jiān)聽
3.2.1.2 inotifywait的--timefmt時(shí)間格式
%Y 年份信息,包含世紀(jì)信息
%y 年份信息,不包括世紀(jì)信息
%m 顯示月份,范圍 01-12
%d 每月的第幾天,范圍是 01-31
%H 小時(shí)信息,使用 24小時(shí)制,范圍 00-23
%M 分鐘,范圍 00-59
范例
--timefmt "%Y-%m-%d %H:%M"
3.2.1.3 inotifywait的--format格式定義
%T 輸出時(shí)間格式中定義的時(shí)間格式信息,通過(guò) --timefmt option 語(yǔ)法格式指定時(shí)間信息
%w 事件出現(xiàn)時(shí),監(jiān)控文件或目錄的名稱信息
%f 事件出現(xiàn)時(shí),將顯示監(jiān)控目錄下觸發(fā)事件的文件或目錄信息,否則為空
%e 顯示發(fā)生的事件信息,不同的事件默認(rèn)用逗號(hào)分隔
%Xe 顯示發(fā)生的事件信息,不同的事件指定用X進(jìn)行分隔
范例
--format "%T %w%f event: %;e"
--format '%T %w %f'
3.2.1.4 inotifywait -e選項(xiàng)指定的事件類型
create 文件或目錄創(chuàng)建
delete 文件或目錄被刪除
modify 文件或目錄內(nèi)容被寫入
attrib 文件或目錄屬性改變
close_write 文件或目錄關(guān)閉,在寫入模式打開之后關(guān)閉的
close_nowrite 文件或目錄關(guān)閉,在只讀模式打開之后關(guān)閉的
close 文件或目錄關(guān)閉,不管讀或是寫模式
open 文件或目錄被打開
moved_to 文件或目錄被移動(dòng)到監(jiān)控的目錄中
moved_from 文件或目錄從監(jiān)控的目錄中被移動(dòng)
move 文件或目錄不管移動(dòng)到或是移出監(jiān)控目錄都觸發(fā)事件
access 文件或目錄內(nèi)容被讀取
delete_self 文件或目錄被刪除,目錄本身被刪除
unmount 取消掛載
范例
-e create,delete,moved_to,close_write, attrib
3.2.1.5 inotify使用范例
#監(jiān)控一次性事件
inotifywait /data

#持續(xù)前臺(tái)監(jiān)控
inotifywait -mrq /data

#持續(xù)后臺(tái)監(jiān)控,并記錄日志
inotifywait -o /root/inotify.log -drq /data --timefmt "%Y-%m-%d %H:%M" --format "%T %w%f event: %e"

#持續(xù)前臺(tái)監(jiān)控特定事件
inotifywait -mrq /data --timefmt "%F %H:%M" --format "%T %w%f event: %;e" -e
create,delete,moved_to,close_write,attrib

4 rsync

rsync 常用于做為 linux系統(tǒng)下的數(shù)據(jù)鏡像備份工具,實(shí)現(xiàn)實(shí)現(xiàn)遠(yuǎn)程同步,支持本地復(fù)制,或者與其他SSH、rsync主機(jī)同步數(shù)據(jù),支持增量備份,配合任務(wù)計(jì)劃,rsync能實(shí)現(xiàn)定時(shí)或間隔同步,配合inotify或sersync,可以實(shí)現(xiàn)觸發(fā)式的實(shí)時(shí)數(shù)據(jù)同步
官方網(wǎng)站: http://rsync.samba.org/
軟件包:rsync,rsync-daemon(CentOS 8)
服務(wù)文件:/usr/lib/systemd/system/rsyncd.service
配置文件:/etc/rsyncd.conf
端口:873/tcp

4.1 rsync命令

4.1.1 命令格式

#Local:
rsync [OPTION...] SRC... [DEST]

#Access via remote shell:
Pull:
rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push:
rsync [OPTION...] SRC... [USER@]HOST:DEST

#Access via rsync daemon:
Pull:
rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push:
rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

4.1.2 工作方式

1. 本地文件系統(tǒng)上實(shí)現(xiàn)同步。命令行語(yǔ)法格式為上述"Local"段的格式。
2. 本地主機(jī)使用遠(yuǎn)程shell和遠(yuǎn)程主機(jī)通信。命令行語(yǔ)法格式為上述"Access via remote shell"段的格式。
3. 本地主機(jī)通過(guò)網(wǎng)絡(luò)套接字連接遠(yuǎn)程主機(jī)上的rsync daemon。命令行語(yǔ)法格式為上述"Access via rsync daemon"段的格式。

前兩者的本質(zhì)是通過(guò)本地或遠(yuǎn)程shell,而第3種方式則是讓遠(yuǎn)程主機(jī)上運(yùn)行rsyncd服務(wù),使其監(jiān)聽在一個(gè)端口上,等待客戶端的連接。

4.1.3 常見選項(xiàng)

-v 顯示rsync過(guò)程中詳細(xì)信息。可以使用"-vvvv"獲取更詳細(xì)信息。
-P 顯示文件傳輸?shù)倪M(jìn)度信息。(實(shí)際上"-P"="--partial --progress",其中的"--progress"才是顯示進(jìn)度信息的)。
-n --dry-run 僅測(cè)試傳輸,而不實(shí)際傳輸。常和"-vvvv"配合使用來(lái)查看rsync是如何工作的。
-a --archive 歸檔模式,表示遞歸傳輸并保持文件屬性。等同于"-rtopgDl"。
-r --recursive 遞歸到目錄中去。
-t --times 保持mtime屬性。強(qiáng)烈建議任何時(shí)候都加上"-t",否則目標(biāo)文件mtime會(huì)設(shè)置為系統(tǒng)時(shí)間,導(dǎo)致下次更新檢查出mtime不同從而導(dǎo)致增量傳輸無(wú)效。
-o --owner 保持owner屬性(屬主)。
-g --group 保持group屬性(屬組)。
-p --perms 保持perms屬性(權(quán)限,不包括特殊權(quán)限)。
-D 是"--device --specials"選項(xiàng)的組合,即也拷貝設(shè)備文件和特殊文件。
-l --links 如果文件是軟鏈接文件,則拷貝軟鏈接本身而非軟鏈接所指向的對(duì)象
-z 傳輸時(shí)進(jìn)行壓縮提高效率
-R --relative 使用相對(duì)路徑。意味著將命令行中指定的全路徑而非路徑最尾部的文件名發(fā)送給服務(wù)端,包括它們的屬性。
--size-only 默認(rèn)算法是檢查文件大小和mtime不同的文件,使用此選項(xiàng)將只檢查文件大小。
-u --update 僅在源mtime比目標(biāo)已存在文件的mtime新時(shí)才拷貝。注意,該選項(xiàng)是接收端判斷的,不會(huì)影響刪除行為
-d --dirs 以不遞歸的方式拷貝目錄本身。默認(rèn)遞歸時(shí),如果源為"dir1/file1",則不會(huì)拷貝dir1目錄,使用該選項(xiàng)將拷貝dir1但不拷貝file1。
--max-size 限制rsync傳輸?shù)淖畲笪募笮 ?梢允褂脝挝缓缶Y,還可以是一個(gè)小數(shù)值(例如:"--max-size=1.5m")
--min-size 限制rsync傳輸?shù)淖钚∥募笮 _@可以用于禁止傳輸小文件或那些垃圾文件。
--exclude 指定排除規(guī)則來(lái)排除不需要傳輸?shù)奈募?/td>
--delete 以SRC為主,對(duì)DEST進(jìn)行同步。多則刪之,少則補(bǔ)之。注意"--delete"是在接收端執(zhí)行的,所以它是在exclude/include規(guī)則生效之后才執(zhí)行的。
-b --backup 對(duì)目標(biāo)上已存在的文件做一個(gè)備份,備份的文件名后默認(rèn)使用"~"做后綴。
--backup-dir 指定備份文件的保存路徑。不指定時(shí)默認(rèn)和待備份文件保存在同一目錄下。
-e 指定所要使用的遠(yuǎn)程shell程序,默認(rèn)為ssh。
--port 連接daemon時(shí)使用的端口號(hào),默認(rèn)為873端口。
--password-file daemon模式時(shí)的密碼文件,可以從中讀取密碼實(shí)現(xiàn)非交互式。注意,這不是遠(yuǎn)程shell認(rèn)證的密碼,而是rsync模塊認(rèn)證的密碼。
-W --whole-file rsync將不再使用增量傳輸,而是全量傳輸。在網(wǎng)絡(luò)帶寬高于磁盤帶寬時(shí),該選項(xiàng)比增量傳輸更高效。
--existing 要求只更新目標(biāo)端已存在的文件,目標(biāo)端還不存在的文件不傳輸。注意,使用相對(duì)路徑時(shí)如果上層目錄不存在也不會(huì)傳輸。
--ignore-existing 要求只更新目標(biāo)端不存在的文件。和"--existing"結(jié)合使用有特殊功能
--remove-source-files 要求刪除源端已經(jīng)成功傳輸?shù)奈募?/td>

4.2 以獨(dú)立的方式運(yùn)行rsync

###### 服務(wù)器端操作 ######

# 創(chuàng)建rsync服務(wù)器的配置文件
vi /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no
hosts allow = 192.168.7.0/24
[backup]
path = /backup/
comment = backup
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pass

# 準(zhǔn)備目錄
mkdir /backup

# 生成驗(yàn)證文件
echo "rsyncuser:123.com" > /etc/rsync.pass
chmod 600 /etc/rsync.pass

# 啟動(dòng)rsync服務(wù)
rsync --daemon #可加入/etc/rc.d/rc.local實(shí)現(xiàn)開機(jī)啟動(dòng)
systemctl start rsyncd #CentOS 7 以上版本

###### 客戶端操作 ######

# 配置密碼文件
echo "123.com" > /etc/rsync.pass
chmod 600 /etc/rsync.pass #此為必要項(xiàng)

# 測(cè)試數(shù)據(jù)同步
rsync -avz --delete --password-file=/etc/rsync.pass /data/ rsyncuser@rsync服務(wù)器IP::backup

5 編寫inotify_rsync.sh腳本實(shí)現(xiàn)實(shí)時(shí)同步

# 在客戶端執(zhí)行該腳本
#!/bin/bash
SRC='/data/'
DEST='rsyncuser@rsync服務(wù)器IP::backup'
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} | while read DATE TIME DIR FILE ; do
    FILEPATH=${DIR}${FILE}
    rsync -az --delete --password-file=/etc/rsync.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >>  /var/log/changelist.log
done
向AI問(wèn)一下細(xì)節(jié)

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

AI