通过rsync搭建一个远程备份系统(二)
Rsync+inotify實(shí)時(shí)備份數(shù)據(jù)
rsync在同步數(shù)據(jù)的時(shí)候,需要掃描所有文件后進(jìn)行對比,然后進(jìn)行差量傳輸,如果文件達(dá)到了百萬或者千萬級別以上是,掃描文件的時(shí)間也很長,而如果只有少量的文件變更了,那么此時(shí)rsync是非常低效的。所以此時(shí)需要一個(gè)實(shí)時(shí)監(jiān)控文件變化的軟件結(jié)合rsync來做實(shí)時(shí)數(shù)據(jù)備份。
what's inotify
inotify是一個(gè)強(qiáng)大的,細(xì)粒度的,異步的文件系統(tǒng)事件監(jiān)控機(jī)制,linux內(nèi)核從2.6.13開始加了這個(gè)功能,可以通過監(jiān)控文件系統(tǒng)添加,刪除,修改移動等事件,利用這個(gè)接口,第三方軟件可以監(jiān)控文件系統(tǒng)添加,刪除,修改移動等事,inotify-tools就是這樣的一個(gè)第三方軟件。
install it
安全前首先確認(rèn)內(nèi)核大于2.6.13以上,以下重新編譯內(nèi)核加入inotify的支持,具體方法請自查。
[root@salt ~]# uname -r 2.6.32-504.el6.x86_64 [root@salt ~]# ll /proc/sys/fs/inotify/ total 0 -rw-r--r-- 1 root root 0 Nov 4 02:53 max_queued_events -rw-r--r-- 1 root root 0 Nov 4 02:53 max_user_instances -rw-r--r-- 1 root root 0 Nov 4 02:53 max_user_watches如果 ll 后顯示有三個(gè),那么說明支持inotify了。
既然系統(tǒng)支持,那么接下來安裝它 。
官網(wǎng)地址是:https://github.com/rvoicilas/inotify-tools
我這里的下載地址是:https://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
安裝好inotify-tools,會生成inotifywait 或者 inotifywatch 兩個(gè)指令,
- inotifywait用于等待文件或者文件集上的特定事件,可以監(jiān)控任何文件和目錄設(shè)置,并且可以遞歸地監(jiān)控整個(gè)目錄樹
- inotifywatch用于收集被監(jiān)控的文件系統(tǒng)統(tǒng)計(jì)數(shù)據(jù),包括整個(gè)inotify時(shí)間發(fā)生多少次等信息。
inotify 相關(guān)參數(shù)
inotify定義了一些接口參數(shù),用來限制inotify消耗kernel memory的大小。由于這些參數(shù)都是內(nèi)存參數(shù),因此根據(jù)實(shí)際情況調(diào)節(jié)其大小,下面介紹下這些參數(shù):
- /proc/sys/fs/inotify/max_queued_events 表示調(diào)用了inotify_init時(shí)分配到inotify_instance中可排隊(duì)的event數(shù)最大值,超過這值就會被丟棄,但會出發(fā)IN_Q_QVRFLOW事件
- /proc/sys/fs/inotify/max_user_instances 表示每一個(gè)real_user ID可創(chuàng)建的inotify instances數(shù)量上限。
- /proc/sys/fs/inotify/max_user_watches 表示每個(gè)inotify 實(shí)例相關(guān)聯(lián)的watchs上限,也就是inotify實(shí)例監(jiān)控最大文件的數(shù)量,如果文件數(shù)量巨大,這個(gè)值也需要調(diào)高。如我們修改成8百萬
inotifywait 相關(guān)參數(shù)
inotifywait是一個(gè)監(jiān)控等待事件,可以配合shell腳本來使用它,下面說下常用的幾個(gè)參數(shù):
- -m (--monitor) 表示處于一直保持時(shí)間監(jiān)聽的狀態(tài)
- -r (--recursive) 表示遞歸查詢目錄
- -d (--daemon) 守護(hù)進(jìn)程運(yùn)行
- -q (--quiet) 表示打印出監(jiān)控事件
- -c (--event) 通過此參數(shù)可以指定要監(jiān)控的事件,常見的事件有modify,delete,create和attrib等等
man inotifywait可以查詢到更多的參數(shù)
公司應(yīng)用案例:rsync+inotify搭建實(shí)時(shí)同步系統(tǒng)
網(wǎng)站架構(gòu)簡單概要
這是一個(gè)應(yīng)用商店業(yè)務(wù),前端haproxy負(fù)載均衡,中間nginx作為web服務(wù)節(jié)點(diǎn),網(wǎng)站數(shù)據(jù)訪問都到后端存儲節(jié)點(diǎn),后端存儲節(jié)點(diǎn)與公司app發(fā)布節(jié)點(diǎn)通過rsync+inotify進(jìn)行同步,此時(shí)你也許會問了,為什么不直接把APP放在后端存儲節(jié)點(diǎn)了呢,我們當(dāng)時(shí)是這樣考慮:
- 存儲節(jié)點(diǎn)是有多臺服務(wù)器,如果要上傳app的話,就得上傳很多臺服務(wù)器,我們通過inotify+rsync就可以上傳到發(fā)布機(jī)上,自己自動同步到多臺后端存儲服務(wù)器了,這樣就實(shí)現(xiàn)了上傳到一臺,同步到多臺的效果。
- 服務(wù)器都在阿里云,發(fā)布機(jī)在內(nèi)網(wǎng),公司需要訪問的話,直接訪問內(nèi)部發(fā)布機(jī)即可,避免訪問阿里云的服務(wù)器,占用它的帶寬資源。
所以下面就通過inotify+rsync來實(shí)現(xiàn)app文件的自動同步了
環(huán)境介紹:
以下為實(shí)驗(yàn)環(huán)境,但是其生產(chǎn)情況和這類似。只不過是服務(wù)器數(shù)量多了幾臺罷了。
- 192.168.141.3 發(fā)布機(jī) 安裝inotify+rsync
- 192.168.141.4 存儲節(jié)點(diǎn) rsync服務(wù)端模式
我們在剛才的操作中,已經(jīng)在192.168.141.3上的發(fā)布機(jī)安裝好了rsync+inotify的,192.168.141.4上把rsync配置成服務(wù)器模式,發(fā)布機(jī)配制成客戶端模式,這樣發(fā)布機(jī)上一有東西都自動同步到存儲節(jié)點(diǎn)。
在存儲節(jié)點(diǎn)(192.168.141.4)上配置rsync
[root@localhost ~]# useradd store # 往store家目錄下同步數(shù)據(jù) [root@localhost ~]# cat /etc/rsyncd.conf uid = nobody gid = nobody use chroot = no max connections = 10 strict modes = yes pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log [appstore] path = /home/store comment = app file ignore errors read only = no write only = no hosts allow = * list = false uid = root gid = root auth users = store secrets file = /etc/server.pass [root@localhost ~]# cat /etc/server.pass store:123..aa [root@localhost ~]# chmod 600 /etc/server.pass [root@localhost ~]# ll /etc/server.pass -rw-------. 1 root root 14 Nov 5 01:42 /etc/server.pass # 千萬不要忘記600權(quán)限在發(fā)布機(jī)(192.168.141.3)上的配置
確保inotify安裝正確后,我們首先手動測試下看rsync能不能夠正常傳輸東西
[root@localhost ~]# rsync -vzrtopg --delete --progress /home/store store@192.168.141.4::appstore Password: sending incremental file list store/ store/.bash_logout18 100% 0.00kB/s 0:00:00 (xfer#1, to-check=7/9) ....一堆東西顯然,上面的狀態(tài)說明rsync正常工作的,接下來寫一個(gè)腳本,實(shí)現(xiàn)rsync+inotify結(jié)合工作
[root@localhost ~]# cat syncapp.sh #!/bin/bash node1="192.168.141.4" # 如果有多個(gè)服務(wù)端,可以node2=xx,node3=xxx,總之自由發(fā)揮吧 src=/home/store/ # 確保目錄存在 dst=appstore user=store /usr/local/inotifytools/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib $src \ | while read file dorsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user@$node1::$dstecho "${file} was rsynced" >> /var/log/rsyncd.log 2&>1 done腳本相關(guān)參數(shù)如下:
- --timefmt 指定時(shí)間的輸出格式
- --format 指定變化文件的詳細(xì)信息
- -e close_write,delete,create,attrib 需要注意的這個(gè)close_write,表示等文件寫完以后在觸發(fā)rsync同步,
- -e modify,delete,create,attrib
測試是否正常工作
我們在發(fā)布機(jī)下的/home/store上放一個(gè)東西,或者新建一個(gè)目錄,刪除一個(gè)東西,如果存儲節(jié)點(diǎn)能夠自動同步過去,那么就正常了。。。。
轉(zhuǎn)載于:https://www.cnblogs.com/liaojiafa/p/6033520.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的通过rsync搭建一个远程备份系统(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat源码阅读之Server和Se
- 下一篇: 机器人视觉系统笔记