經過rsync+inotify實現數據實時備份

  • rsync的優勢與不足

與傳統的cp,scp,tar,備份方式相比,rsync具備安全性高備份迅速支持增量備份的優勢,能夠知足對實時性要求不高的需求,例如按期備份文件服務器數據到遠端服務器,可是,當數據量很是大的時候,單獨使用rsync就突顯出有些不足,rsync在同步數據時,須要掃描全部文件後進行對比,而後進行差量傳輸,掃描全部文件是很是耗時的操做,最後只同步了不多的內容,rsync不能實時監測,同步數據。linux

 

  • inotify的做用

inotify是一種強大的異步的文件系統事件監控機制。經過inotify能夠監控文件系統中添加,刪除,修改,移動等各類事件,利用inotify,第三方軟件能夠監控文件系統下文件的各類變化狀況。在linux中的安裝包名是inotify-toolsvim

 

  • 安裝查看系統環境

inotify-tools須要2.6.13以上的內核支持,查看內核版本和系統對inotify的支持centos

[root@localhost ~]#uname -r
3.10.0-693.el7.x86_64
[root@localhost ~]#ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Apr  6 00:10 max_queued_events
-rw-r--r-- 1 root root 0 Apr  6 00:10 max_user_instances
-rw-r--r-- 1 root root 0 Apr  6 00:10 max_user_watches

 

  • 安裝inotify
[root@localhost ~]#yum install inotify-tools -y
[root@localhost ~]#inotifywa
inotifywait   inotifywatch

 

安裝完inotify後,會生成inotifywait和inotifywatch兩個指令,inotifywait用於等待文件或者文件集上的一個特定的事件,能夠監放任何文件和目錄的設置,而且能夠遞歸地監控整個目錄樹;安全

inotifywatch用於收集被監控的文件系通通計數據,包括每一個inotify事件發生多少次等信息。bash

 

  • inotify相關係統參數

inotify定義了一些系統參數用來限制inotify消耗內存的大小,參數設置文件在/proc/sys/fs/inotify下服務器

 

  • max_queued_events值:表示調用inotify_init時分配到instances中可排隊的event數的最大值,超出這個值的事件被丟棄
  • max_user_instances值:表示每個real user ID 能夠建立的inotify instatnces數量的上限
  • max_user_watches值:表示每一個inotify實例能夠監控的最大目錄數量

 

  • inotifywait相關參數

            -m:–monitor,表示始終保持事件監聽狀態app

            -r:–recursive,表示遞歸查詢目錄異步

            -q:–quiet,表示打印出監控事件測試

            -e:–event,經過這個參數能夠指定要監控的事件,常見的事件有modify,delete,create,和attrib等ui

            –timefmt:指定時間的輸出格式

            –format:指定變化文件的詳細信息

 

 在上一篇介紹rsync使用的文章基礎上,基於原來的系統環境,實現rysnc+inotify的實時同步

【當rsync結合inotify時,原來的server端就變成了客戶端了,當server端的文件更新就會向遠程主機同步傳輸數據此時遠程的客戶端就成了server,,,有點繞】

 

 

生產服務器主機A的地址:192.168.214.190  :centos7.4  (rsync+inotify) 本地客戶端

備份數據主機B的地址:192.168.214.187     :centos6.9    (rsync)            遠程節點服務端

 

結合工做時,遠程的服務節點須要將rsync以守護進程的方式啓動,並將rsync加入到自啓動文件中

#以守護進程方式啓動
[root@yufu ~]# /usr/bin/rsync --daemon --config=/etc/rsync.d/rsyncd.conf
#加入開機自啓動
[root@yufu ~]# echo '/usr/bin/rsync --daemon --config=/etc/rsync.d/rsyncd.conf' >> /etc/rc.local

 

生產服務器只需安裝好rsync+inotify,並定義inotifywait監控及同步腳本就行了,(除了在/etc/rsync.d/下添加同步用戶的密碼文件外,定義密碼文件後在同步過程當中不須要再客戶端輸入密碼,在腳本中要指定這個文件位置)

echo  fsz… >> /etc/rsync.d/server.pass

在生產服務器主機A的地址:192.168.214.190  :centos7.4  (rsync+inotify)上編寫腳本實現自動同步

 

#/bin/bash
###
##
#
backupdir=/databak
srcdir=/data
bakmod=bak
#備份的用戶,不是真正的系統用戶
user=feng
host1=192.168.214.187

/usr/bin/inotifywait -mrq --timefmt '%F %T' --format '%T %w%f%e' -e modify,delete,create,attrib $srcdir | while read files
        do
                /usr/bin/rsync -vzrtopg --delete --progress  $srcdir $user@$host1::$bakmod --password-file=/etc/rsync.d/server.pass >> /tmp/rsync.log 2>&1
                echo "${files} was rsynced" >> /var/log/rsync.log 2>&1
        done

 

對於腳本內容參數作簡單理解:

backupdir=/databak :遠程服務器存放備份文件的目錄
srcdir=/data :本地要備份的數據目錄
bakmod=bak  遠程服務器定義的rsyncd.conf中的模塊名稱
user=feng :執行備份的用戶,該用戶是rsyncd.conf中「auth users」指定的用戶
host1=192.168.214.187 :遠程主機地址

這個腳本的做用就是同inotify監控文件目錄的變化,進而觸發rsync進行同步操做

給腳本添加執行權限

[root@localhost data]#chmod 755 inotifyrsync.sh

指令方式測試同步

#遠程上傳
[root@localhost data]#rsync -zvrtopg --progress /data feng@192.168.214.187::bak --password-file=/etc/rsync.d/server.pass 
sending incremental file list
data/
data/.inotifyrsync.sh.swp
       12288 100%    0.00kB/s    0:00:00 (xfer#1, to-check=7/9)
data/\
         473 100%   65.99kB/s    0:00:00 (xfer#2, to-check=6/9)
data/access.log
    21328307 100%   42.91MB/s    0:00:00 (xfer#3, to-check=5/9)
data/epel-release-latest-7.noarch.rpm
       15080 100%   30.49kB/s    0:00:00 (xfer#4, to-check=4/9)
data/fengsuzhou.txt
           0 100%    0.00kB/s    0:00:00 (xfer#5, to-check=3/9)
data/gudaoyufu.txt
           0 100%    0.00kB/s    0:00:00 (xfer#6, to-check=2/9)
data/inotifyrsync.sh
         476 100%    0.96kB/s    0:00:00 (xfer#7, to-check=1/9)
data/lost+found/

sent 1232415 bytes  received 149 bytes  821709.33 bytes/sec
total size is 21356624  speedup is 17.33
 

測試下載

 

#遠程下載
[root@localhost data]#rsync -vzrtopg --progress  feng@192.168.214.187::bak /opt/app/ --password-file=/etc/rsync.d/server.pass 
receiving incremental file list
./
.inotifyrsync.sh.swp
       12288 100%   11.72MB/s    0:00:00 (xfer#1, to-check=9/11)
data/
data/.inotifyrsync.sh.swp
       12288 100%   11.72MB/s    0:00:00 (xfer#2, to-check=7/11)
data/\
         473 100%  461.91kB/s    0:00:00 (xfer#3, to-check=6/11)
data/access.log
    21328307 100%   44.90MB/s    0:00:00 (xfer#4, to-check=5/11)
data/epel-release-latest-7.noarch.rpm
       15080 100%   32.51kB/s    0:00:00 (xfer#5, to-check=4/11)
data/fengsuzhou.txt
           0 100%    0.00kB/s    0:00:00 (xfer#6, to-check=3/11)
data/gudaoyufu.txt
           0 100%    0.00kB/s    0:00:00 (xfer#7, to-check=2/11)
data/inotifyrsync.sh
         476 100%    1.02kB/s    0:00:00 (xfer#8, to-check=1/11)
data/lost+found/

sent 216 bytes  received 1233016 bytes  822154.67 bytes/sec
total size is 21368912  speedup is 17.33

將腳本放入後臺執行

[root@localhost data]#sh /data/inotifyrsync.sh  &
[1] 2096

再作最後的總結:被搞得夠暈的

客戶端:(須要備份數據的那臺服務器)

生產服務器只需安裝好rsync+inotify

在/etc/rsync.d/下添加同步用戶的密碼文件,在腳本中要指定這個文件位置

編寫inotifywait監控及同步腳本

 

服務端:(同步數據,存放備份數據的那臺服務器)

只需安裝rsync,定義配置文件

配置文件中定義 模塊名稱,備份數據的用戶,及數據存放的路徑

定義備份用戶的密碼文件:username:password 格式

必須以守護進程的方式啓動

最後再貼上rsync的 rsyncd.conf 配置文件(須要手動編寫)

vim /etc/rsync.d/rsyncd.conf

log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock

[bak]
path=/databak
uid = root
gid = root
ignore = errors
read only = no
write only = no
host allow = *
max connections = 5
host deny = 192.168.22.21
list = false
auth users = feng
secrets file = /etc/rsync.d/server.pass

 


 

同步測試

 

在客戶端上的備份源目錄中建立文件

[root@localhost data]#ls
\                                 file12.txt  file18.txt  file4.txt  gudaoyufu.txt
access.log                        file13.txt  file19.txt  file5.txt  inotifyrsync.sh
epel-release-latest-7.noarch.rpm  file14.txt  file1.txt   file6.txt  lost+found
fengsuzhou.txt                    file15.txt  file20.txt  file7.txt  zhuhui.txt
file10.txt                        file16.txt  file2.txt   file8.txt
file11.txt                        file17.txt  file3.txt   file9.txt

在服務端存放備份的目錄查看新同步的文件

[root@yufu data]# ls
\                                 file12.txt  file18.txt  file4.txt  gudaoyufu.txt
access.log                        file13.txt  file19.txt  file5.txt  inotifyrsync.sh
epel-release-latest-7.noarch.rpm  file14.txt  file1.txt   file6.txt  lost+found
fengsuzhou.txt                    file15.txt  file20.txt  file7.txt  zhuhui.txt
file10.txt                        file16.txt  file2.txt   file8.txt
file11.txt                        file17.txt  file3.txt   file9.txt11111
相關文章
相關標籤/搜索