Rsync 是一個開源的快速備份工具,能夠在不一樣主機之間鏡像同步整個目錄樹,支持增量備份,保持連接和權限,且採用優化的同步算法,在傳輸錢執行壓縮,所以很是適用於異地備份、鏡像服務器等應用。
Rsync 的官方網站是 http://rsync.samba.org/ ,由 Wayne Davison 進行維護。做爲一種最多見的文件備份工具, Rsync 每每是 Linux 和 UNIX 系統默認安裝的基本組件之一。
linux
Rsync與傳統的cp、tar備份方式相比,具備安全性高、備份迅速、支持增量備份等優勢,經過rsync能夠解決對實時性要求不高的數據備份需求,例如按期的備份文件服務器數據到遠端服務器,對本地磁盤按期作數據鏡像等。c++
隨着應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了不少不足,首先,rsync同步數據時,須要掃描全部文件後進行比對,進行差量傳輸。若是文件數量達到了百萬甚至千萬量級,掃描全部文件將是很是耗時的。並且正在發生變化的每每是其中不多的一部分,這是很是低效的方式。其次,rsync不能實時的去監測、同步數據,雖然它能夠經過linux守護進程的方式進行觸發同步,可是兩次觸發動做必定會有時間差,這樣就致使了服務端和客戶端數據可能出現不一致,沒法在應用故障時徹底的恢復數據。基於以上緣由,rsync+inotify組合出現了!web
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
安裝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)