1. 程式人生 > >配置 Rsync + inotify 實現文件服務器數據實時雙向同步

配置 Rsync + inotify 實現文件服務器數據實時雙向同步

同步數據 acl 不能 我們 del 原因 mon 系統事件 環境

Rsync 概述

Rsync 是一個開源的快速備份工具,可以在不同主機之間鏡像同步整個目錄樹,支持增量備份,保持鏈接和權限,且采用優化的同步算法,在傳輸錢執行壓縮,因此非常適用於異地備份、鏡像服務器等應用。
 
Rsync 的官方網站是 http://rsync.samba.org/ ,由 Wayne Davison 進行維護。作為一種最常見的文件備份工具, Rsync 往往是 Linux 和 UNIX 系統默認安裝的基本組件之一。
 

  • Rsync 的優點

    Rsync與傳統的cp、tar備份方式相比,具有安全性高、備份迅速、支持增量備份等優點,通過rsync可以解決對實時性要求不高的數據備份需求,例如定期的備份文件服務器數據到遠端服務器,對本地磁盤定期做數據鏡像等。

  • Rsync 的缺點

    隨著應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了很多不足,首先,rsync同步數據時,需要掃描所有文件後進行比對,進行差量傳輸。如果文件數量達到了百萬甚至千萬量級,掃描所有文件將是非常耗時的。而且正在發生變化的往往是其中很少的一部分,這是非常低效的方式。其次,rsync不能實時的去監測、同步數據,雖然它可以通過linux守護進程的方式進行觸發同步,但是兩次觸發動作一定會有時間差,這樣就導致了服務端和客戶端數據可能出現不一致,無法在應用故障時完全的恢復數據。基於以上原因,rsync+inotify組合出現了!

inotify 概述

inotify是一種強大的、細粒度的、異步的文件系統事件監控機制,Linux內核從2.6.13起,加入了inotify支持,通過Inotify可以監控文件系統中添加、刪除,修改、移動等各種細微事件,利用這個內核接口,第三方軟件就可以監控文件系統下文件的各種變化情況,而inotify-tools就是這樣的一個第三方軟件。
 
 
Rsync可以實現觸發式的文件同步,但是通過Crontab守護進程方式進行觸發,同步的數據和實際數據會有差異,而Inotify可以監控文件系統的各種變化,當文件有任何變動時,就觸發Rsync同步,這樣剛好解決了同步數據的實時性問題。

部署環境

主機 操作系統 IP地址 用於同步的目錄 主要軟件包
Server1 CentOS 7.4 x86_64 192.168.125.117 /test rsync-3.0.9-18.el7.x86_64、inotify-tools-v3.14-8.le7.x86_64
Server2 CentOS 7.4 x86_64 192.168.125.118 /test rsync-3.0.9-18.el7.x86_64、inotify-tools-v3.14-8.le7.x86_64

開始部署

在此我們部署服務使主機 Server1 的數據推向主機 Server2 ,而雙向同步即在此基礎上在主機 Server2 上部署服務使數據推向主機 Server1 。至此,我們只要在兩臺服務器的任意一臺更改數據都會同步到另外一臺,從而實現雙機同步。

數據從Server1上同步到Server2

  • 兩臺機器配置rsync服務(配置文件要修改為對方主機)
  • 安裝Rsync軟件包

    tar zxvf rsync-3.1.3.tar.gz -C /opt
    cd /opt/rsync_3.1.3
    ./configure
    make && make install
  • 修改rsync配置文件

    # vim /etc/rsyncd.conf
    ……省略部分信息……
    uid = nobody
    gid = nobody
    use chroot = yes                                  //禁錮在源目錄
    address = 192.168.125.117                  //監聽地址
    port 873                                                   //監聽端口
    log file = /var/log/rsyncd.log                    //日誌文件路徑
    pid file = /var/run/rsyncd.pid                    //進程ID文件路徑
    hosts allow = 192.168.125.0/24            //允許訪問的客戶機地址
     
    [wwwroot]                                              //共享模塊名稱    
    path = /web1/wwwroot                           //源目錄的實際地址
    comment = www.wzn.cn                 
    read only = no                                 //是否為只讀    
    dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2      //同步時 不再壓縮的文件類型
    auth users = web1user                           //授權賬戶
    secrets file = /etc/rsyncd_users.db       //存放賬戶信息的數據文件
    • 為備份賬戶創建數據文件、源目錄
      # vim /etc/rsyncd_users.db
      backuper:abc123
       
      # chmod 600 /etc/rsyncd_users.db
      # mkdir -p /web1/wwwroot
      # chmod 777 /web1/wwwroot
      # chown -R nobody:nobody /web1/wwwroot
  • 啟動rsync,並加入系統自啟動文件

    # rsync --daemon    #運行參數為--daemon
    # ps -ef | grep rsync
    # echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local
  • Rsync命令的基本用法

    • -a 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性,等於-rlptgoD。
    • -z 對備份的文件在傳輸時進行壓縮處理。
    • -H 保留硬鏈結。
    • -D 保持設備文件信息。
    • -A 保留ACL屬性信息
    • --delete 刪除那些目標位置有而原始位置沒有的文件。
    • --checksum 打開校驗開關,強制對文件傳輸進行校驗。
  • 安裝inotify-tools(需要gcc、gcc-c++軟件包支持)

    # tar zxvf inotify-tools-3.14.tar.gz -C /opt
    # cd /opt/inotify-tools-3.14
    # ./configure
    # make && make install
  • Inotify命令的基本用法

    • -m 表示持續監控
    • -r 表示遞歸整個目錄
    • -q 簡化輸出信息
    • inotifywait 可監控: modify 修改、 create 創建、move 移動、delete 刪除
  • 編寫shell腳本配置內容發布節點

    # vim /web/inotifyrsync.sh
     
    #!/bin/bash
    host1=192.168.125.117
    src=/web/wwwroot/
    dst1=web1
    user1=web1user
    /usr/local/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%T %w%f%e‘ -e close_write,delete,create,attrib $src | while read files
    do
        /usr/bin/rsync -vzrtopg --delete --progress --password-file= /etc/rsyncd_users.db $src $user1@$host1::$dst1 > /dev/null 2>&1
        echo "${files} was rsynced." >> /tmp/rsync.log 2>&1
    done
  • 為腳本指定可執行權限,放入後臺執行,並加入系統自啟動文件
chmod 755 /web/inotifyrsync.sh
/web/inotifyrsync.sh &
echo "/web/inotifyrsync.sh &" >> /etc/rc.local
  • 調整inotify內核參數

    # vim /etc/sysctl.conf
    fs.inotify.max_queued_events = 16384    監控事件隊列(16384)
    fs.inotify.max_user_instances = 1024    最多監控實例數(1024)
    fs.inotify.max_user_watches = 1048576   每個實例最多監控文件數(1048576)
  • 此時我們在Server1服務器上變更數據會在Server2上同步,此時我們使用同樣的方法使Server2的數據及時同步到Server1服務器,即可實現雙機同步。

配置 Rsync + inotify 實現文件服務器數據實時雙向同步