1 背景
在生產環境,有時會須要兩臺主機的特定目錄實現實時同步。好比,將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