rsync+inotify實時同步

愛吃丶辣包發表於2020-10-26

rsync同步簡介

一款快速增量備份工具

  • Remote Sync,遠端同步
  • 支援本地複製,或者與其他SSH、rsync主機同步
  • 官方網站: http://rsync.samba.org

配置rsync備份源

rsync同步源

  • 指備份操作的遠端伺服器,也稱為備份源
    在這裡插入圖片描述

基本思路

  • 建立rsyncd.conf配置檔案、獨立的賬號檔案
  • 啟用rsync的–daemon模式

應用示例

  • 使用者backuper,允許下行同步
  • 操作的目錄為/var/www/html/

配置檔案rsyncd.conf

  • 需手動建立,語法類似於Samba配置
  • 認證配置auth users、secrets file,不加則為匿名

rsync賬號檔案

  • 採用“使用者名稱:密碼”的記錄格式,每行一個使用者記錄
  • 獨立的賬號資料,不依賴於系統賬號

啟用rsync服務

  • 通過–daemon獨自提供服務(執行kill $(cat /var/run/rsyncd.pid)關閉rsync服務)

使用rsync備份工具

rsync命令基本用法

  • rsync 選項 原始位置 目標位置
    常用選項
    -a:歸檔模式,遞迴併保留物件屬性,等同於-rlptgoD
    -v:顯示同步過程的詳細(verbose)資訊
    -z:在傳輸檔案時進行壓縮(compress)
    -H:保留硬連線檔案
    -A:保留ACL屬性資訊
    –delete:刪除目標位置有而原始位置沒有的檔案
    –checksum:根據物件的校驗和來決定是否跳過檔案

配置源的兩種表示方法

格式1:使用者名稱@主機地址::共享模組名
格式2:rsync://使用者名稱@主機地址/共享模組名

[root@localhost ~]# rsync -avz
backuper@20.0.0.36::wwwroot /root
[root@localhost ~]# rsync -avz
rsync://backuper@20.0.0.36/wwwroot /root

rsync同步操作示例

  • 下行rsync源:wwwroot共享 -> /myweb
[root@localhost ~]# mkdir /myweb
[root@localhost ~]# rsync -avzH --delete
backuper@20.0.0.36::wwwroot /myweb

rsync指令碼的互動處理

rsync源的免互動處理

  • 使用 --password-file= 密碼檔案
rsync -az --delete --password-file=/etc/server.pass backuper@192.168.100.22::wwwroot /opt/

rsync實時同步

定期同步的不足

  • 執行備份的時間固定,延遲明顯、實時性差
  • 當同步源長期不變化時,密集的定期任務是不必要的

實時同步的優點

  • —旦同步源出現變化,立即啟動備份
  • 只要同步源無變化,則不執行備份

關於inotify

Linux核心的inotify機制

  • 從版本2.6.13開始提供
  • 可以監控檔案系統的變動情況,並做出通知響應
  • 輔助軟體: inotify-tools
    在這裡插入圖片描述

rsync+inotify實時同步

調整inotify核心引數

[root@localhost ~]# vi /etc/sysctl.conf
· max_queue_events:監控事件佇列大小
· max_user_instances:最多監控例項數
· max_user watches:每個例項最多監控檔案數(監控數應大於監控目標的總檔案)

[root@localhost ~]# sysctl -p

安裝inotify-tools輔助工具

  • inotifywait:用於持續監控,實時輸出結果
  • inotifywatch:用於短期監控,任務完成後再出結果
[root@localhost ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html
-m, 持續進行監控
-r,遞迴監控所有子物件
-q,簡化輸出資訊
-e,  指定要監控哪些事件型別

通過inotifywait觸發rsync同步操作

  • 使用while、read持續獲取監控結果
  • 根據結果可以作進—步判斷,決定執行何種操作
[root@localhost ~]# vi /opt/inotify_rsync.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync-azH --delete --password-file=/etc/server.pass /var/www/html"
rput@192.168.4.200:/var/www/html"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
 if [ $(pgrep rsync | wc -l) -le 0 ] ; then
  $RSYNC_CMD
 fi
done

相關文章