inotify介紹及rsync + inotify 實時同步備份

1、前言

rsync (remote sync)是一款非常好的數據同步工具,能夠通過對比同步雙方的數據變動,實現增量同步,還可以通過LAN/WAN實現遠程多臺主機間文件的同步,還能結合crond任務計劃來執行自動備份,又可以結合ssh實現遠程數據備份的安全,種種特性使他看起來相當優秀。但如果需備份數據十分龐大時,它的不足之處就顯現出來了,比如每次執行同步操作時,rsync都會掃描全部數據進而計算出增量部分,而后再同步增量數據,這將會十分耗時,使其變得低效;并且受限于crond計劃任務最小時間間隔為一分鐘,會導致同步源端和目的段數據不一致,這在高可用環境中是不被允許的。這個時候我們就可以構建rsync+Inotify架構來解決此應用瓶頸。

備注:關于rsync的使用請查閱http://windchasereric.blog.51cto.com/5419433/1711313

2、inotify介紹

Inotify 是一個Linux特性,是一種強大的、細粒度的、異步的文件系統監控機制,linux內核從2.6.13起便加入了Inotify支持,通過Inotify可以監控文件系統中添加、修改、移動等各種細微事件,利用這個內核接口,第三方軟件就可以監控文件系統下文件的各種變化情況,而Inotify-tools就是這樣的一個第三方軟件。Inotify反應靈敏,用法簡單,并且比使用Crontab輪詢高效很多。

2.1、inotify常見監控事件

  • IN_ACCESS :文件被訪問

  • IN_MODIFY : 文件被修改

  • IN_ATTRIB : 文件屬性被修改

  • IN_CLOSE_WRITE : 以可寫方式打開的文件被關閉

  • IN_CLOSE_NOWRITE : 以不可寫方式打開的文件被關閉

  • IN_OPEN : 文件被打開

  • IN_MOVED_FROM : 文件被移出監控的目錄

  • IN_MOVED_TO : 文件被移入監控著的目錄

  • IN_CREATE : 在監控的目錄中新建文件或子目錄

  • IN_DELETE : 文件或目錄被刪除

  • IN_DELETE_SELF : 自刪除,即一個可執行文件在執行時刪除自己

  • IN_MOVE_SELF : 自移動,即一個可執行文件在執行時移動自己

2.2、inotify相關的內核參數

[root@RServer ~]# ll /proc/sys/fs/inotify/
-rw-r--r-- 1 root root 0 Jun 13 17:49 max_queued_events
-rw-r--r-- 1 root root 0 Jun 13 17:49 max_user_instances
-rw-r--r-- 1 root root 0 Jun 13 17:49 max_user_watches
  • /proc/sys/fs/inotify/max_queued_events 
    該參數值是調用inotify_init時分配給實例的event隊列最大值,超出該值的event被丟棄,并觸發IN_Q_OVERFLOW事件。默認值:16384 
    注意,該參數定義的是events隊列長度,若文件龐大且變化頻繁需調整該值以適應監控。

  • proc/sys/fs/inotify/max_user_instances 
    該參數值定義了用戶創建inotify實例的上限。默認值:128

  • /proc/sys/fs/inotify/max_user_watches 
    該參數定義了每個inotify示例可監控的最大目錄數,如果監控文件龐大需調大該值。默認值:8192 
    參數調整示例: 
    可使用重定向方式修改 
    echo 10000000 > /proc/sys/fs/inotify/max_user_watches

2.3、inotify-tools介紹

Inotify-tools工具安裝后提供了兩個命令

  • /usr/bin/inotifywait:監控文件系統變化

  • /usr/bin/inotifywatch:用來統計文件系統訪問的次數

2.3.1、Inotifywait用法

inotifywait  [-hcmrq] [-e <event> ] [-t <seconds> ] [--format <fmt> ] [--timefmt<fmt> ] <file> [ ... ]
?   -h,–help     //輸出幫助信息
?   @          //排除不需要監視的文件,可以是相對路徑,也可以是絕對路徑
?   –fromfile    //從文件讀取需要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭
?   -m,–monitor   //接收到一個事情而不退出,無限期地執行。默認行為是接收到一個事情后立即退出
?   -d,–daemon    //跟–monitor一樣,除了是在后臺運行,需要指定 –outfile把事情輸出到一個文件。也意味著使用了–syslog
?   -o,–outfile    //輸出事情到一個文件而不是標準輸出。
?   -s,–syslog    //輸出錯誤信息到系統日志
?   -r,–recursive  //監視一個目錄下的所有子目錄。
?   -q,–quiet     //指定一次,不會輸出詳細信息,指定二次,除了致命錯誤,不會輸出任何信息。
?   –exclude      //正則匹配需要排除的文件,大小寫敏感。
?   –excludei     //正則匹配需要排除的文件,忽略大小寫。
?   -t,–timeout#  //設置超時時間,如果為0,則無限期地執行下去。
?   -e,–event    //指定監視的事件。
?   -c,–csv      //輸出csv格式。
?   –timefmt     //指定時間格式,用于–format選項中的%T格式。
?   –format      //指定輸出格式。
?   %w 表示發生事件的目錄
?   %f 表示發生事件的文件
?   %e 表示發生的事件
?   %Xe 事件以“X”分隔
?   %T 使用由–timefmt定義的時間格式

2.3.2、inotifywatch用法

inotifywatch [-hvzrqf] [-e <event> ] [-t <seconds> ] [-a <event> ] [-d <event> ] <file> [ … ]       
?   -h,–help    # 輸出幫助信息
?   -v,–verbose  # 輸出詳細信息
?   @          # 排除不需要監視的文件,可以是相對路徑,也可以是絕對路徑。
?   –fromfile    # 從文件讀取需要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。
?   -z,–zero    # 輸出表格的行和列,即使元素為空
?   –exclude     # 正則匹配需要排除的文件,大小寫敏感。
?   –excludei    # 正則匹配需要排除的文件,忽略大小寫。
?   -r,–recursive # 監視一個目錄下的所有子目錄。
?   -t,–timeout  # 設置超時時間
?   -e,–event    # 只監聽指定的事件。
?   -a,–ascending # 以指定事件升序排列。
?   -d,–descending# 以指定事件降序排列

3、rsync + in otify 實時同步備份實驗

3.1、實驗拓撲

拓撲.jpg

3.2、服務器端

1、安裝超級守護進程

[root@RServer data]# yum -y install xinetd

注意:要想啟動rsync服務,必須先安裝此進程。rsync服務是依賴xinetd來啟動

2、設置開機自動啟動

[root@RServer data]# chkconfig xinetd on

3、安裝rsync

[root@RServer data]# yum -y install rsync

4、查看超級守護進程下自動生成的rsync服務,并設置激活

[root@RServer data]# vim /etc/xinetd.d/rsync
service rsync
{
       disable = no       # 改為no ,表示啟用rsync,默認是關閉的
       flags           = IPv6
       socket_type     = stream
       wait            = no
       user            = root
       server          = /usr/bin/rsync
       server_args     = --daemon
       log_on_failure  += USERID

5、創建共享的目錄文件

[root@RServer /]# mkdir /data/

6、編輯配置文件/etc/rsyncd.conf

[root@RServer data]# vim /etc/rsyncd.conf
# Global Setting
uid = nobody                    #運行rsync服務器的角色名稱
gid = nobody                    #運行rsync服務器的組名稱
use chroot = no             # 是否允許使用chroot
max connections = 10            #最大的連接數
strict modes = yes              # 是否啟用嚴格檢查權限,用戶是否允許上傳下載
pid file = /var/run/rsync.pid       # pid文件路徑
log file = /var/log/rsyncd.log      #日志文件記錄路徑
# Directory to be synced
[tools]                     #共享存儲的模塊名稱
path = /data                    #共享文件存儲路徑
ignore error = yes              #傳輸過程出現錯誤處理方式,yes表示忽略
read only = no                  #是否只讀
write only = no             #是否只寫,表示不允許別人看
hosts allow = 192.168.80.0/24   #允許哪些主機來實現數據同步(類似白名單)
hosts deny = *                  # 如果匹配到上面的就表示通過,否則就拒絕
list = false                    #是否允許你列出所有 {true | false}
uid = root                      #以什么身份運行,如果這里不填,將會繼承上面
gid = root
auth users = wqp                #認證用戶
secrets file = /etc/rsyncd.passwd   #認證用戶密碼的文件
# rsyncd.passwd格式為 USERNAME:PASSWORD

注意:(此文件需要手動創建,系統不會自動生成,請注意,文件名必須是rsyncd.conf,否則rsync會無法正常讀取配置文件)

7、編輯密碼文件

[root@RServer /]# vim /etc/rsyncd.passwd
wqp:redhat

8、啟動服務

[root@RServer /]# service xinetd start

9、查看所監聽的端口

[root@RServer /]# netstat -tanlp | grep xinetd
tcp        0      0 :::873         :::*               LISTEN      1362/xinetd

10、使用客戶端測試連接rsync服務器

[root@RClient ~]# rsync /etc/fstab wqp@192.168.80.106::tools

3.3、客戶端配置

1、安裝inotify-tools

[root@RClient ~]# yum -y install inotify-tools

備注:如果使用yum安裝,需要配置好epel源

2、編輯密碼文件,目的是為后面腳本自動化執行

[root@RClient ~]# vim /etc/rsyncd.passwd
redhat

3、設置密碼文件權限

[root@RClient ~]# chmod 600 /etc/rsyncd.passwd
# 設置密碼文件夾權限為600,目的是為了更安全,而且如果不設置,有可能導致腳本讀取密碼文件出錯

4、創建監控腳本

[root@RClient ~]# vim rsyncInotify.sh
#!/bin/bash                                        
#
host='192.168.80.106'
user='wqp'
src='/tmp/dir'
dest='tools'
passwdFile='/etc/rsyncd.passwd'
inotifywait -mrq -e modify,attrib,moved_to,moved_from,move,move_self,create,delete,delete_self --timefmt='%d/%m/%y %H:%M' --format='%T %w%f %e' $src  | while read chgeFile
dorsync -avqz --delete --progress --password-file=$passwdFile $src $user@$host::$dest &>>/var/log/rsync.log
done

5、設置開機自動啟動

[root@RClient ~]# echo 'bash /root/rsyncInotify.sh &' >> /etc/rc.local

3.4、 驗證試驗結果

1、手動啟動腳本

[root@RClient ~]# bash /root/rsyncInotify.sh &

2、在客戶端上被監控的目錄下創建文件

[root@RClient dir]# touch file{1..10}

3、查看服務器端rsyncd.log日志文件

[root@RServer data]# tail /var/log/rsyncd.log

1.jpg

4、查看已同步的文件

2.jpg

原創文章,作者:螃蟹,如若轉載,請注明出處:http://www.www58058.com/18379

(0)
螃蟹螃蟹
上一篇 2016-06-15
下一篇 2016-06-16

相關推薦

  • shell腳本一鍵安裝二進制Apache

    安裝背景:用的一臺最小化安裝的centos6。 編譯安裝安裝的必備安裝gcc,gcc-c++ 安裝包arp,arp-util以及pcre的壓縮包已經傳到七牛,沒有通過官網下載。太慢。 apache是通過官網下載的,所以下載比較慢,需要的話更改下地址 不足,只按照正常流程寫,未做任何異常判斷處理 #/bin/bash #一鍵安裝Apache #安裝GCC ec…

    Linux干貨 2016-07-10
  • 馬哥教育網絡20期+第7周練習博客

    1、創建一個10G分區,并格式為ext4文件系統;    (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl;    (2) 掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳; [root@7b ~]#&nbsp…

    Linux干貨 2016-07-24
  • RAID常見級別及特性

    磁盤陣列(Redundant Arrays of Independent Disks,RAID),通過軟件或者硬件的手段將多個磁盤整合成一個磁盤來使用,以此來提高磁盤的性能,并提供數據冗余的功能。 目前常見的RAID等級: raid0,被稱為條帶卷。 條帶卷,我們可以通過名字來想象:RAID0通過把文件切割之后把數據像一條帶子一樣平鋪在每個磁盤之上。 由于文…

    Linux干貨 2016-01-05
  • 馬哥教育網絡班21期+第1周課程練習

    1.描述計算機的組成及其功能。   計算機主要由運算器,控制器,存儲器,輸入設備,輸出設備組成   運算器用來做計算,用來做二進制運算(加法運算)和邏輯運算   控制器用來控制計算機各部件之間的協調,例如運算器想做運算從哪里讀入加數和被加數,寄存在哪里   存儲器分為內存儲器和外存儲器,用來存放數據 內存儲器用于存放計…

    Linux干貨 2016-07-12
  • http://www.jianshu.com/p/f1d0739b141f

    Linux干貨 2017-07-30
  • GRUB詳解

    GRUB的啟動流程: grub: 在centos56中:0.X版本 grub legacy 在centos7中:1.X版本  grub2 grub可分為三個階段: stage1:mbr前446字節中保存的Boot Loader程序 stage1.5:mbr之后的扇區,讓stage1中的Boot Loader能夠識別stage2所在的分區上的文件系統…

    Linux干貨 2016-09-13
欧美性久久久久