全網實時熱備inotify+rsync


title: 全網實時熱備inotify+rsync
tags: 備份,inotify,rsync


全網實時熱備inotify+rsync

1 爲什麼需要inotify?

全網實時熱備inotify+rsync
當全網部署了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

  1. 下載源碼包文件:inotify-tools-3.14.tar.gz
  2. 解壓縮,並安裝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的相關命令和參數介紹

  1. inotify 有兩個工具,一個是inotifywait,這個的作用是在被監視的文件或目錄上等待特定文件系統事件(open,close.delete等)的發生,執行後處於阻塞狀態。另一個工具是inotifywatch,它的作用是在收集被監視文件系統使用度統計數據,指文件系統事件發生次數的統計。我們此次用來監控文件系統事件的發生是使用inotifywait工具。
  2. 常用參數有:
-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

  1. 創建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
  2. 創建密碼文件,並設置相關權限,用來和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
    這裏需要注意密碼文件必須和配置文件裏的相對應
  3. 創建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
  4. 啓動rsync daemon
    [root@backup ~]# rsync --daemon
  5. 在對應的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
  6. 在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有一定的限制。其中:

  1. max_user_watches:設置inotifywaite或者inotifywatch命令可以監控的文件數量(單進程),可以設置爲50000000。
    [root@backup inotify]# echo "50000000" > /proc/sys/fs/inotify/max_user_watches
  2. 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
  3. 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章