rsync+inotify實時同步

1 背景

rsync+inotify實時同步

在生產環境,有時會須要兩臺主機的特定目錄實現實時同步。好比,將NFS共享目錄的數據文件,自動實時同步到備份的服務器特定目錄中

2 實時同步技術簡介

2.1 實現實時同步的方法

inotify + rsync 方式實現數據同步
sersync :金山公司周洋在 inotify 軟件基礎上進行開發的,功能更增強大

2.2 工做原理

1.須要利用監控服務(inotify),監控同步數據服務器目錄中信息的變化
2.發現目錄中的數據產生變化,就利用rsync服務推送到備份服務器上

2.3 inotify

異步的文件系統事件監控機制,利用事件驅動機制,而無須經過諸如cron等的輪詢機制來獲取事件,linux內核從2.6.13起支持 inotify,經過inotify能夠監控文件系統中添加、刪除,修改、移動等各類事件

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

2.4 實現inotify的軟件

inotify-tools
sersync
lrsyncd

2.5 inotify+rsync使用方式

inotify 對同步數據目錄信息的監控
rsync 完成對數據的同步
利用腳本進行結合

3 實現inotify

3.1 前提條件,內核版本不能小於2.6.13,執行下面命令查看內核是否支持inotify

# 列出下面的文件,說明服務器內核支持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內核參數說明:
max_queued_events:inotify事件隊列最大長度,如值過小會出現 Event Queue Overflow 錯誤,默認值:16384
max_user_instances:每一個用戶建立inotify實例最大值,默認值:128
max_user_watches:能夠監視的文件數量(單進程),默認值:8192

#上面的參數能夠經過修改/etc/sysctl.conf文件來調整大小,以下所示
[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: 在被監控的文件或目錄上等待特定文件系統事件(open ,close,delete等)發生,經常使用於實時同步的目錄監控
inotifywatch:收集被監控的文件系統使用的統計數據,指文件系統事件發生的次數統計

3.2.1.1 inotifywait 命令常見選項

-m,--monitor 始終保持事件監聽
-d, --daemon 以守護進程方式執行,和-m類似,配合-o使用
-r, --recursive 遞歸監控目錄數據信息變化
-q, --quiet 輸出少許事件信息
--exclude 指定排除文件或目錄,使用擴展的正則表達式匹配的模式實現
--excludei 和exclude類似,不區分大小寫
-o, --outfile 打印事件到文件中,至關於標準正確輸出,注意:使用絕對路徑
-s, --syslogOutput 發送錯誤到syslog至關於標準錯誤輸出
--timefmt 指定時間輸出格式
--format 指定的輸出格式;即實際監控輸出內容
-e 指定監聽指定的事件,若是省略,表示全部事件都進行監聽

3.2.1.2 inotifywait的--timefmt時間格式

%Y 年份信息,包含世紀信息
%y 年份信息,不包括世紀信息
%m 顯示月份,範圍 01-12
%d 每個月的第幾天,範圍是 01-31
%H 小時信息,使用 24小時制,範圍 00-23
%M 分鐘,範圍 00-59

範例

--timefmt "%Y-%m-%d %H:%M"

3.2.1.3 inotifywait的--format格式定義

%T 輸出時間格式中定義的時間格式信息,經過 --timefmt option 語法格式指定時間信息
%w 事件出現時,監控文件或目錄的名稱信息
%f 事件出現時,將顯示監控目錄下觸發事件的文件或目錄信息,不然爲空
%e 顯示發生的事件信息,不一樣的事件默認用逗號分隔
%Xe 顯示發生的事件信息,不一樣的事件指定用X進行分隔

範例

--format "%T %w%f event: %;e"
--format '%T %w %f'

3.2.1.4 inotifywait -e選項指定的事件類型

create 文件或目錄建立
delete 文件或目錄被刪除
modify 文件或目錄內容被寫入
attrib 文件或目錄屬性改變
close_write 文件或目錄關閉,在寫入模式打開以後關閉的
close_nowrite 文件或目錄關閉,在只讀模式打開以後關閉的
close 文件或目錄關閉,無論讀或是寫模式
open 文件或目錄被打開
moved_to 文件或目錄被移動到監控的目錄中
moved_from 文件或目錄從監控的目錄中被移動
move 文件或目錄無論移動到或是移出監控目錄都觸發事件
access 文件或目錄內容被讀取
delete_self 文件或目錄被刪除,目錄自己被刪除
unmount 取消掛載

範例

-e create,delete,moved_to,close_write, attrib

3.2.1.5 inotify使用範例

#監控一次性事件
inotifywait /data

#持續前臺監控
inotifywait -mrq /data

#持續後臺監控,並記錄日誌
inotifywait -o /root/inotify.log -drq /data --timefmt "%Y-%m-%d %H:%M" --format "%T %w%f event: %e"

#持續前臺監控特定事件
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系統下的數據鏡像備份工具,實現實現遠程同步,支持本地複製,或者與其餘SSH、rsync主機同步數據,支持增量備份,配合任務計劃,rsync能實現定時或間隔同步,配合inotify或sersync,能夠實現觸發式的實時數據同步
官方網站: http://rsync.samba.org/
軟件包:rsync,rsync-daemon(CentOS 8)
服務文件:/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. 本地文件系統上實現同步。命令行語法格式爲上述"Local"段的格式。
2. 本地主機使用遠程shell和遠程主機通訊。命令行語法格式爲上述"Access via remote shell"段的格式。
3. 本地主機經過網絡套接字鏈接遠程主機上的rsync daemon。命令行語法格式爲上述"Access via rsync daemon"段的格式。

前二者的本質是經過本地或遠程shell,而第3種方式則是讓遠程主機上運行rsyncd服務,使其監聽在一個端口上,等待客戶端的鏈接。

4.1.3 常見選項

-v 顯示rsync過程當中詳細信息。可使用"-vvvv"獲取更詳細信息。
-P 顯示文件傳輸的進度信息。(實際上"-P"="--partial --progress",其中的"--progress"纔是顯示進度信息的)。
-n --dry-run 僅測試傳輸,而不實際傳輸。常和"-vvvv"配合使用來查看rsync是如何工做的。
-a --archive 歸檔模式,表示遞歸傳輸並保持文件屬性。等同於"-rtopgDl"。
-r --recursive 遞歸到目錄中去。
-t --times 保持mtime屬性。強烈建議任什麼時候候都加上"-t",不然目標文件mtime會設置爲系統時間,致使下次更新檢查出mtime不一樣從而致使增量傳輸無效。
-o --owner 保持owner屬性(屬主)。
-g --group 保持group屬性(屬組)。
-p --perms 保持perms屬性(權限,不包括特殊權限)。
-D 是"--device --specials"選項的組合,即也拷貝設備文件和特殊文件。
-l --links 若是文件是軟連接文件,則拷貝軟連接自己而非軟連接所指向的對象
-z 傳輸時進行壓縮提升效率
-R --relative 使用相對路徑。意味着將命令行中指定的全路徑而非路徑最尾部的文件名發送給服務端,包括它們的屬性。
--size-only 默認算法是檢查文件大小和mtime不一樣的文件,使用此選項將只檢查文件大小。
-u --update 僅在源mtime比目標已存在文件的mtime新時才拷貝。注意,該選項是接收端判斷的,不會影響刪除行爲
-d --dirs 以不遞歸的方式拷貝目錄自己。默認遞歸時,若是源爲"dir1/file1",則不會拷貝dir1目錄,使用該選項將拷貝dir1但不拷貝file1。
--max-size 限制rsync傳輸的最大文件大小。可使用單位後綴,還能夠是一個小數值(例如:"--max-size=1.5m")
--min-size 限制rsync傳輸的最小文件大小。這能夠用於禁止傳輸小文件或那些垃圾文件。
--exclude 指定排除規則來排除不須要傳輸的文件。
--delete 以SRC爲主,對DEST進行同步。多則刪之,少則補之。注意"--delete"是在接收端執行的,因此它是在exclude/include規則生效以後才執行的。
-b --backup 對目標上已存在的文件作一個備份,備份的文件名後默認使用"~"作後綴。
--backup-dir 指定備份文件的保存路徑。不指定時默認和待備份文件保存在同一目錄下。
-e 指定所要使用的遠程shell程序,默認爲ssh。
--port 鏈接daemon時使用的端口號,默認爲873端口。
--password-file daemon模式時的密碼文件,能夠從中讀取密碼實現非交互式。注意,這不是遠程shell認證的密碼,而是rsync模塊認證的密碼。
-W --whole-file rsync將再也不使用增量傳輸,而是全量傳輸。在網絡帶寬高於磁盤帶寬時,該選項比增量傳輸更高效。
--existing 要求只更新目標端已存在的文件,目標端還不存在的文件不傳輸。注意,使用相對路徑時若是上層目錄不存在也不會傳輸。
--ignore-existing 要求只更新目標端不存在的文件。和"--existing"結合使用有特殊功能
--remove-source-files 要求刪除源端已經成功傳輸的文件

4.2 以獨立的方式運行rsync

###### 服務器端操做 ######

# 建立rsync服務器的配置文件
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

# 準備目錄
mkdir /backup

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

# 啓動rsync服務
rsync --daemon #可加入/etc/rc.d/rc.local實現開機啓動
systemctl start rsyncd #CentOS 7 以上版本

###### 客戶端操做 ######

# 配置密碼文件
echo "123.com" > /etc/rsync.pass
chmod 600 /etc/rsync.pass #此爲必要項

# 測試數據同步
rsync -avz --delete --password-file=/etc/rsync.pass /data/ rsyncuser@rsync服務器IP::backup

5 編寫inotify_rsync.sh腳本實現實時同步

# 在客戶端執行該腳本
#!/bin/bash
SRC='/data/'
DEST='rsyncuser@rsync服務器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
相關文章
相關標籤/搜索