title: 全網實時熱備inotify+rsync
tags: 備份,inotify,rsync
全網實時熱備inotify+rsync
1 爲什麼需要inotify?
當全網部署了NFS存儲後,如果提供NFS服務的設備宕機或者故障了,那麼我們的與之相連的NFS客戶端都會受到影響,嚴重可能會導致數據丟失,因此,爲了防止單點故障,我們要給提供NFS服務的主機的數據目錄做一個實時同步,這樣NFS服務器宕機或者其他故障後,我們能很輕易的把備份節點設置爲NFS的共享目錄,讓那些NFS客戶端重新掛載NFS共享盤,這樣可以儘量減少損失,提高服務滿意度。
inotify是可以監控文件系統操作,比如讀取、寫入和創建。Inotify 反應靈敏,用法非常簡單,使用起來也十分高效, 而rsync可以直接推送文件到遠程daemon目錄,而且支持增量備份。因此我們可以通過使用inotify監控到文件系統有創建,刪除,修改後觸發rsync進行同步推送到備份服務器裏。於是如圖所示,我們在備份服務器裏搭建一個rsync daemon,並創建/backup用來專門與NFS存儲的數據目錄作爲實時同步的遠端目錄,而在對應的NFS存儲中安裝inotify,用來對/data目錄進行動態監控,一旦發現/data目錄有創建,刪除,修改後立刻觸發rsync進行同步推送到備份服務器的/backup裏,從而保證兩端的數據一致性,增強NFS存儲的安全性。
2 安裝inotify
- 下載源碼包文件:inotify-tools-3.14.tar.gz
-
解壓縮,並安裝inotify,因爲inotify是一個源碼包文件,所以安裝的時候注意,先要編譯,通過--prefix=PATH指定編譯安裝的路徑,然後在進行make和make install。安裝完成後,因爲源碼安裝是帶程序的版本號的,最好做一個軟鏈接把版本號去掉,這樣在後續使用中會方便很多。另外安裝後,在安裝目錄中會生成4個目錄,bin (inotify的執行命令)、 include (inotify所需的頭文件) 、lib (動態鏈接文件)、 share (幫助文檔)。安裝過程如下:
[root@server ~]# tar zxf inotify-tools-3.14.tar.gz [root@server ~]# ls -l |grep "inotify-tools-3.14" drwxrwxrwx. 5 1000 1000 4096 Mar 14 2010 inotify-tools-3.14 -rw-r--r--. 1 root root 358772 May 19 17:52 inotify-tools-3.14.tar.gz [root@server ~]# cd inotify-tools-3.14 [root@server inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-tools-3.14/ [root@server inotify-tools-3.14]# make && make install [root@server inotify-tools-3.14]# ln -s /usr/local/inotify-tools-3.14 /usr/local/inotify-tools [root@server inotify-tools-3.14]# cd /usr/local/inotify-tools && ls bin include lib share
3 inotify的相關命令和參數介紹
- inotify 有兩個工具,一個是inotifywait,這個的作用是在被監視的文件或目錄上等待特定文件系統事件(open,close.delete等)的發生,執行後處於阻塞狀態。另一個工具是inotifywatch,它的作用是在收集被監視文件系統使用度統計數據,指文件系統事件發生次數的統計。我們此次用來監控文件系統事件的發生是使用inotifywait工具。
- 常用參數有:
-m :始終監控
-q:安靜,不輸出其他東西
-r:遞歸
-e:文件系統事件,文件系統事件常用參數有create,delete,close_write
具體可以查詢幫助:[root@server bin]# ./inotifywait -help
常用語法:[root@server data]# /usr/local/inotify-tools/bin/inotifywait -mrq --format %w%f -e create,close_write,delete /data
3 . 對inotify進行測試,看看是否滿足需求
[root@server data]# /usr/local/inotify-tools/bin/inotifywait -mrq --format %w%f -e create,close_write,delete /data
因爲inotify開啓後是時刻監控着/data目錄,切處於阻塞狀態,因此我們要麼讓它在後臺運行,要麼重新開一個窗口,因爲我們需要清晰的看到監控的事件,因此重新再打開一個窗口。
Last login: Sun May 20 20:06:00 2018 from 192.168.50.50
[root@server ~]#
[root@server ~]# cd /data
[root@server data]# ls
a aaa bb cc dd file nnn
[root@server data]#
[root@server data]#
[root@server data]# rm -rf *
[root@server data]# ls
[root@server data]#
[root@server data]# /usr/local/inotify-tools/bin/inotifywait -mrq --format %w%f -e create,close_write,delete /data
/data/a
/data/aaa
/data/bb
/data/cc
/data/dd
/data/file
/data/nnn
由此我們可以看到了,inotify確實監控到了這些事件的發生,因此我們可以利用read這個變化來觸發調用rsync進行推送數據。
4 在備份服務器上部署rsync daemon
- 創建rsync的配置文件,並將相關參數寫入配置文件,如下所示
[root@backup ~]# touch /etc/rsyncd.conf [root@backup ~]# cat /etc/rsyncd.conf #rsyncd-conf start uid = rsync gid = rsync use chroot = no max connections = 2000 timeout = 600 pid file= /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log ignore = errors read only = false list = false hosts allow = 192.168.50.0/24 hosts deny = 0.0.0.0/32 auth users = rsync-backup secrets file = /etc/rsync.password ##################################### [backup] comment = backup path = /backup
- 創建密碼文件,並設置相關權限,用來和rsync客戶端匹配密碼的。
[root@backup ~]# touch /etc/rsync.password [root@backup ~]# echo "rsync-backup:root" >/etc/rsync.password [root@backup ~]# cat /etc/rsync.password rsync-backup:root [root@backup ~]# chmod 600 /etc/rsync.password [root@backup ~]# ls -l /etc/rsync.password -rw-------. 1 root root 18 May 21 06:23 /etc/rsync.password 這裏需要注意密碼文件必須和配置文件裏的相對應
- 創建rsync用戶,設置爲不需要登錄,組也是rsync,需要注意的是這個用戶要和配置文件裏的uid=用戶對應,而auth users = rsync-backup是個虛擬的用戶可以不用管,這可以在一定程度上提高安全性,因爲rsync的用戶名不一定需要使用rsync,只要與配置文件裏的uid=XX,對應上就好了。
[root@backup ~]# useradd -g rsync -M -s /sbin/nologin rsync [root@backup ~]# grep rsync /etc/passwd rsync:x:506:506::/home/rsync:/sbin/nologin
- 啓動rsync daemon
[root@backup ~]# rsync --daemon
- 在對應的NFS服務器上也創建密碼文件,用於來和服務端匹配密碼如下:
[root@server data]# echo "root" > /etc/rsync.password [root@server data]# chmod 600 /etc/rsync.password [root@server data]# ls -l /etc/rsync.password -rw-------. 1 root root 5 May 14 20:44 /etc/rsync.password
- 在NFS服務器上推送文件看看是否能成功推送
[root@server data]# echo "hello" >file1 [root@server data]# rsync file1 [email protected]::backup/ --password-file=/etc/rsync.password 在備份服務器查看是否推送成功 [root@backup ~]# cat /backup/file1 hello [root@backup /]# cd /backup &&ls backup file1 [root@backup backup]#
5 我們可以在NFS服務端部署腳本,讓腳本監控到事件發生後調用rsync進行推送
[root@server scripts]# cat inotify.sh #!/bin/bash inotify=/usr/local/inotify-tools/bin/inotifywait $inotify -mrq --format '%w%f' -e create,close_write,delete /data | while read file do cd / && rsync -az /data --delete [email protected]::backup/ \ --password-file=/etc/rsync.password done
6 進行對server和backup進行測試
server端創建文件: [root@server data]# rm -rf * [root@server data]# touch a [root@server data]# rm -rf * [root@server data]# for n in `seq 1000` ;do touch file$n; done [root@server data]# ls |wc -l 1000 backup端查看是否推送過來: [root@backup backup]# cd data [root@backup data]# ls a [root@backup data]# [root@backup data]# [root@backup data]# ls [root@backup data]# [root@backup data]# ls |wc -l 1000
7 將inotify腳本設置爲開機啓動,這樣兩臺服務器就可以永久實現實時同步
[root@backup data]# echo "sh /service/scripts/inotify.sh & " >>/etc/rc.local
8 inotify對應的優化參數:
在/proc/sys/fs/inotify目錄下的max_queued_events 、max_user_instances、max_user_watches對inotify有一定的限制。其中:
- max_user_watches:設置inotifywaite或者inotifywatch命令可以監控的文件數量(單進程),可以設置爲50000000。
[root@backup inotify]# echo "50000000" > /proc/sys/fs/inotify/max_user_watches
- max_user_instances:設置每個用戶可以運行inotifywaite或者inotifywatch命令的進程數,默認是128,可以設置爲50000000。
[root@backup inotify]# echo "50000000" > /proc/sys/fs/inotify/max_user_instances [root@backup inotify]# cat max_user_instances 50000000
- max_queued_events:設置inotify實例事件(event)隊列可容納事件的數量,默認是327679,可以設置爲50000000。
[root@backup inotify]# cat max_queued_events 327679 [root@backup inotify]# echo "50000000" > /proc/sys/fs/inotify/max_queued_events [root@backup inotify]# cat max_queued_events 50000000