配置 Rsync + inotify 實現文件服務器數據實時雙向同步
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 實現文件服務器數據實時雙向同步