rsync+inotify實現數據實時同步

數據的實時同步

  • 在生產環境,有時會需要兩臺主機的特定目錄實現實時同步。比如,將NFS共享目錄的數據文件,自動
    實時同步到備份的服務器特定目錄中。
  • 注:服務端工作在數據主機上的,客戶端工作在備份主機上

實時同步技術介紹

內核支持

  • 實現實時同步的方法
    • inotify+rsync 方式實現數據同步
    • sersync :金山公司周洋在 inotify 軟件基礎上進行開發的,功能更加強大
  • 工作原理:
    • 要利用監控服務(inotify),監控同步數據服務器目錄中信息的變化
    • 發現目錄中數據產生變化,就利用rsync服務推送到備份服務器上
  • inotify:
    • 異步的文件系統事件監控機制,利用事件驅動機制,而無須通過諸如cron等的輪詢機制來獲取事件,
    • linux內核從2.6.13起支持 inotify,通過inotify可以監控文件系統中添加、刪除,修改、移動等各種事件
  • 實現inotify軟件:
    • inotify-tools,sersync,lrsyncd
  • inotify+rsync使用方式
    • inotify 對同步數據目錄信息的監控
    • rsync 完成對數據的同步
    • 利用腳本進行結合

實現inotify

  • linux支持inotify的內核最小版本位2.6.13,參考man 7 inotify
ls -l /proc/sys/fs/inotify #列出下面的文件,說明服務器內核支持inotify
-rw-r--r-- 1 root root 0 Dec 7 10:10 max_queued_events
-rw-r--r-- 1 root root 0 Dec 7 10:10 max_user_instances
-rw-r--r-- 1 root root 0 Dec 6 05:54 max_user_watches
  • inotify內核參數說明:
    • max_queued_events:inotify事件隊列最大長度,如值太小會出現 Event Queue Overflow 錯誤,默認值:16384
    • max_user_instances:每個用戶創建inotify實例最大值,默認值:128
    • max_user_watches:可以監視的文件數量(單進程),默認值:8192

inotify-tools工具

inotify-tools參考文檔:https://github.com/rvoicilas/inotify-tools/wiki

  • 安裝inotify-tools:基於epel源
yum install inotify-tools
  • intotify-tools包主要工具:

    • inotifywait: 在被監控的文件或目錄上等待特定文件系統事件(open close delete等)發生,常用於實時同步的目錄監控
    • inotifywatch:收集被監控的文件系統使用的統計數據,指文件系統事件發生的次數統計
  • inotifywait 命令常見選項

    • -m, --monitor 始終保持事件監聽
    • -d, --daemon 以守護進程方式執行,和-m相似,配合-o使用
    • -r, --recursive 遞歸監控目錄數據信息變化
    • -q, --quiet 輸出少量事件信息
    • –exclude 指定排除文件或目錄,使用擴展的正則表達式匹配的模式實現
    • –excludei 和exclude相似,不區分大小寫
    • -o, --outfile 打印事件到文件中,相當於標準正確輸出
    • -s, --syslogOutput 發送錯誤到syslog相當於標準錯誤輸出
    • –timefmt 指定時間輸出格式
    • –format 指定的輸出格式;即實際監控輸出內容
    • -e 指定監聽指定的事件,如果省略,表示所有事件都進行監聽
  • inotifywait 的–timefmt 時間格式
    參考 man 3 strftime

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

範例:

--timefmt "%Y-%m-%d %H:%M"
  • inotifywait 的 --format 格式定義
    • %T 輸出時間格式中定義的時間格式信息,通過 --timefmt option 語法格式指定時間信息
    • %w 事件出現時,監控文件或目錄的名稱信息
    • %f 事件出現時,將顯示監控目錄下觸發事件的文件或目錄信息,否則爲空
    • %e 顯示發生的事件信息,不同的事件默認用逗號分隔
    • %Xe顯示發生的事件信息,不同的事件指定用X進行分隔

範例:

--format "%T %w%f event: %;e"
--format '%T %w %f'
  • 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

範例:使用inotifywait

#監控一次性事件
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

rsync

rsync 常用於做爲 linux系統下的數據鏡像備份工具,實現實現遠程同步,支持本地複製,或者與其他
SSH、rsync主機同步數據,支持增量備份,配合任務計劃,rsync能實現定時或間隔同步,配合inotify或sersync,可以實現觸發式的實時數據同步

官方站點:https://www.samba.org/ftp/rsync/rsync.html

  • 軟件包:rsync,rsync-daemon(CentOS 8)
  • 服務文件:/usr/lib/systemd/system/rsyncd.service
  • 配置文件:/etc/rsyncd.conf
  • 端口:873/tcp

rsync命令

  • rsync格式
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
  • rsync有三種工作方式:

      1. 本地文件系統上實現同步。命令行語法格式爲上述"Local"段的格式。
      1. 本地主機使用遠程shell和遠程主機通信。命令行語法格式爲上述"Access via remote shell"段的格式。
      1. 本地主機通過網絡套接字連接遠程主機上的rsync daemon。命令行語法格式爲上述"Access viarsync daemon"段的格式。
  • 前兩者的本質是通過本地或遠程shell,而第3種方式則是讓遠程主機上運行rsyncd服務,使其監聽在一個端口上,等待客戶端的連接。

常見選項:

-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:要求刪除源端已經成功傳輸的文件

以獨立方式運行rsync

範例:

192.168.26.17   服務器端
192.168.26.27   客戶端

//配置清華epel源
yum -y install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm

//下載安裝rsync服務器端
yum -y install rsync (rsync-daemon)

//安裝inotify服務
yum -y install inotify-tools

//啓動服務
systemctl start rsyncd.service

//數據存儲的主機上創建rsync服務器的配置文件
vi /etc/rsyncd.conf

//配置文件內容
uid = root
gid = root
use chroot = no
max connections = 0   #最大連接數,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.26.0/24   #設置訪問權限
[backup]   #開啓backup設置
path = /data/A_source   #需要備份目錄路徑
comment = backup
read only = no   #關閉只讀
auth users = bokebi   #同步時使用的用戶賬號
secrets file = /etc/rsync.pass   #密碼存放文件路徑

//服務器端需要備份的目錄
mkdir /data/A_source

//服務器端創建用戶驗證文件
echo "bokebi:111111" > /etc/rsync.pass

//給用戶驗證文件修改權限,避免普通用戶修改刪除問價
chmod 600 /etc/rsync.pass

//重啓服務
systemctl restart rsyncd.service

//可將實時備份加入開機啓動
rsync --daemon #可加入/etc/rc.d/rc.local實現開機啓動
systemctl start rsyncd #CentOS 7以上版本
-------------------------------------------------------------
//客戶端配置密碼文件
echo "111111" > /etc/rsync.pass

//修改文件權限
chmod 600 /etc/rsync.pass #此爲必要項

//客戶端測試同步數據
rsync -avz --delete --password-file=/etc/rsync.pass /data/B_backup \
[email protected]::backup

創建inotify_rsync.sh腳本

#!/bin/bash
SRC='/data/A_source/'   #有/表示只複製目錄下文件,無/標識將整個複製至目標主機
DEST='[email protected]::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
  • 把腳本加入開開機啓動,並且後臺運行
vim /etc/rc.local
nohup sh /root/inotify_rsync.sh &
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章