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

Rsync 概述

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

  • Rsync 的優勢

    Rsync與傳統的cp、tar備份方式相比,具備安全性高、備份迅速、支持增量備份等優勢,經過rsync能夠解決對實時性要求不高的數據備份需求,例如按期的備份文件服務器數據到遠端服務器,對本地磁盤按期作數據鏡像等。c++

  • Rsync 的缺點

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

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_6四、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_6四、inotify-tools-v3.14-8.le7.x86_64

開始部署

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

數據從Server1上同步到Server2

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

    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,並加入系統自啓動文件bash

    # 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服務器,便可實現雙機同步。
相關文章
相關標籤/搜索