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 [email protected]::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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章