inotify是一種強大的,細粒度的,異步的文件系統時間監控機制,Linux內核從2.6.13加入了inotify支持,通過inotify可以監控文件系統匯中添加,刪除,修改,移動等各種事件,利用這個內核接口,第三方軟件就可以監控文件系統下文件的各種變化情況,而inotify-tools正式實施這樣的監控的軟件,國人周洋在金山公司開發了類似的實時同步軟件sersync.
在安裝inotify-tools前請先確認你的Linux內核是否達到了2.6.13,并且在編輯時開啟CONFIG_INOTIFY選項,也可以通過以下命令檢測。
安裝inotify默認條件:
yum安裝方式源信息必須設置正確:
默認的yum源(軟件的倉庫):base+extras+updates
國內yum源(軟件的倉庫):http://mirrors.aliyun.com/help/centos
擴展yum源(擴展的倉庫):epel(企業級Linux的yum源的擴展倉庫)
阿里云epel源:通過訪問阿里yum源鏡像地址獲取
直接安裝epel源方式:yum install epel-release
實時同步軟件會負責監控磁盤文件系統的變化。比如:指定一個/data目錄,實時同步軟件服務進程會實時監控這個/data目錄中數據的變化,即文件系統block與inode信息的變化。
實時同步軟件服務進程監控/data目錄文件系統數據一旦發生變化,就會執行rsync命令,將變化的文件數據信息推送到備份服務器相應的備份目錄中,從而完成數據的實時備份。
rsync的傳輸效率是很高的但rsync也有缺點,最大的問題就是每次執行rsync命令都會遍歷目標目錄,當文件不多時,這沒什么問題,一旦文件數到了一定規模,那么每次遍歷都會消耗很多資源,如果只對經常改動的目錄進行同步,也可以忽略這個問題,如果每次改動的目錄多較大,那么就要用到inotify了。
inotify+rsync的方式使得效率更高效,只對經常改變的文件進行同步
安裝 inotify 軟件的前提 rsync 服務安裝成功,可以在客戶端推送拉取數據
另外:inotify 是在客戶端配置安裝的軟件,別裝錯了
rsync+定時任務的方式會定時的將系統中變動的文件定時的同步給服務器,但是定時任務的最小單位是分。這對于數據變化快而且數據重要的金融行業來說,顯然是不能容忍的。因此這種方式有一定局限性。
[root@nfs01 ~]# rpm-ql inotify-tools ##查詢inotify-tools中包含哪些包
/usr/bin/inotifywait
/usr/bin/inotifywatch
/usr/lib64/libinotifytools.so.0
/usr/lib64/libinotifytools.so.0.4.1
/usr/share/doc/inotify-tools-3.14
/usr/share/doc/inotify-tools-3.14/AUTHORS
/usr/share/doc/inotify-tools-3.14/COPYING
/usr/share/doc/inotify-tools-3.14/ChangeLog
/usr/share/doc/inotify-tools-3.14/NEWS
/usr/share/doc/inotify-tools-3.14/README
/usr/share/man/man1/inotifywait.1.gz
/usr/share/man/man1/inotifywatch.1.gz
[root@nfs01 ~]#
inotifywait:在被監控的文件或目錄上等待特定文件系統時間(open close delete等)發生,執行后處于阻塞狀態,適合在shell腳本中使用。
inotifywatch:收集被監控的文件系統使用度統計數據,指文件系統事件發生的次數統計。
說明:yum安裝后可以直接使用,如果編譯安裝需要進入到相應軟件目錄的bin目錄下使用。
[root@nfs01 etc]# uname -r
2.6.32-642.el6.x86_64
[root@nfs01 etc]# ls -l /proc/sys
sys/ sysrq-trigger sysvipc/
[root@nfs01 etc]# ls-l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 May 12 16:26 max_queued_events
-rw-r--r-- 1 root root 0 May 12 16:26 max_user_instances
-rw-r--r-- 1 root root 0 May 12 16:26 max_user_watches
[root@nfs01 etc]#顯示上面三個文件說明支持inotify
[root@nfs01 ~]# cd/proc/sys/fs/inotify/
[root@nfs01 inotify]# ls
max_queued_events max_user_instances max_user_watches
[root@nfs01 inotify]# catmax_user_watches
8192
[root@nfs01 inotify]# catmax_user_instances
128
[root@nfs01 inotify]# catmax_queued_events
16384
[root@nfs01 inotify]#
關鍵參數說明:
max_queued_events:設置inotify實例事件(event)隊列可容納的事件數量。
max_user_instances:設置每個用戶可以運行的inotifywait或inotifywatch命令的進程數。
max_user_watches:設置inotifywait或inotifywatch命令可以監視的文件數量(單進程)
客戶端開啟運行inotify服務進程,檢測共享目錄的數據變化
獲取到共享目錄數據發生變化,通知執行rsync命令同步數據。
將變化數據發送到rsync服務端(開啟rsync守護進程服務器)的共享目錄中。
命令參數 | 參數說明 |
-m|--monitor | 始終保持事件監聽狀態 |
-d|--daemon | 類似于-m參數,只是將命令運行在后臺,記錄觸發的事件信息在指定文件中,利用--outfile參數,定義程序日志使用--syslog參數 |
-r(重要參數) | 遞歸監控目錄數據信息變化 |
-o|--outfile <file> | 打印事件到文件中,相當于標準正確輸出 |
-s|--syslog | 發送錯誤到syslog相當于標準錯誤輸出 |
-q|--quiet | 輸出信息少(只打印事件信息) |
--exclude|<pattern> | 排除文件或目錄時,不區分大小寫 |
--timefmt <fmt> | 指定事件輸出的格式 |
--format <fmt> | 打印使用指定的輸出類似格式字符串,即實際監控輸出的內容。 |
-e | 指定監聽指定的事件,如果省略,表示所有事件都進行監聽 |
通過/usr/local/inotify-tools/bin/inotifywait --help命令獲取監控事件信息。
事件名稱 | 事件說明 |
access | 文件或目錄內容被讀取 |
modify | 文件或目錄內容被寫入 |
attrib | 文件或目錄屬性改變 |
close_write | 文件或目錄關閉,在寫入模式打開之后關閉的。 |
close_nowrite | 文件或目錄關閉,在只讀模式打開之后關閉的。 |
close | 文件或目錄關閉,不管讀或是寫模式 |
open | 文件或目錄被打開 |
moved_to | 文件或目錄被移動到監控的目錄中 |
moved_from | 文件或目錄被移動從監控的目錄中。 |
move | 文件或目錄不管移動到或移動出監控目錄都觸發事件 |
create | 文件或目錄創建在監控的目錄中。 |
delete | 文件或目錄被刪除在監控的目錄中 |
delete_self | 文件或目錄被刪除 |
unmount | 文件系統包含的文件或目錄不能卸載 |
部署rsync守護進程模式
服務端的配置
01:檢查是否安裝rsync
02:配置rsyncd.conf配置文件
03:創建rsync進程管理用戶
04:創建模塊的存儲目錄
05:修改存儲目錄的屬主和屬組權限
06:配置認證密碼文件,授權為600權限
07:啟動rsync守護進程服務
08:設置rsync服務開機自啟動
09:進行測試
客戶端的配置
01:創建密碼文件,并授權600權限
02:客戶端進行測試
服務端代碼文件:
[root@backup nfsbackup]# vim/etc/rsyncd.conf
(省略部分內容)
[backup] ##模塊名稱
path = /backup
[nfsbackup] ##創建一個模塊
path = /nfsbackup
"/etc/rsyncd.conf" 20L,474C written
創建備份模塊
[root@backup ~]# mkdir /nfsbackup
授權屬主屬組
[root@backup ~]# chown -R rsync.rsync/nfsbackup/
查看授權情況
[root@backup ~]# ll -d /nfsbackup/
drwxr-xr-x 2 rsync rsync 4096 May 1109:22 /nfsbackup/
查看密碼文件
[root@backup ~]# cat/etc/rsync.password
rsync_backup:123456
查看密碼文件權限是否為600
[root@backup ~]# ll/etc/rsync.password
-rw------- 1 root root 20 May 4 17:51 /etc/rsync.password
[root@backup ~]#
[root@backup ~]# /etc/init.d/xinetdstatus
xinetd (pid 1810) is running...
[root@backup ~]# /etc/init.d/xinetdstop
Stopping xinetd: [ OK ]
[root@backup ~]# rsync --daemon
[root@backup ~]# ps -ef |grep rsync
root 4955 1 0 09:25 ? 00:00:00 rsync --daemon
root 4959 4860 0 09:25 pts/0 00:00:00 grep rsync
[root@backup ~]#
打開兩個相同的xshell窗口測試,在其中一個窗口輸入下面代碼:
[root@nfs01 data]# inotifywait-mrq /data/
/data/ DELETE oldboy.txt
/data/ CREATE oldboy.txt
/data/ OPEN oldboy.txt
/data/ ATTRIB oldboy.txt
/data/ CLOSE_WRITE,CLOSE oldboy.txt
在另外一個相同的窗口進行操作,如創建,刪除,移動等。觀察變化。
測試create 事件
在NFS服務器上開啟inotify相應的監控功能,并輸出信息
[root@nfs01 backup]#inotifywait -mqr --timefmt '%d/%y %H:%M' --format '%T %w%f' -e create /backup ###監控backup創建事件顯示信息
12/17 23:18 /backup/oldbpy.txt
再開啟一個NFS服務器連接窗口進行測試驗證create事件。
[root@nfs01 backup]# ls
m
[root@nfs01 backup]# mkdir oldbpy.txt
[root@nfs01 backup]# ls
m oldbpy.txt
[root@nfs01 backup]# rm oldbpy.txt/-fr
[root@nfs01 backup]#
說明:只監控create創建事件,其他事件沒有進行監控,其他事件產生,監控服務沒有信息輸出。
可以簡化命令和輸出信息:
[root@nfs01 backup]# inotifywait -mqr --format '%w%f' -e create /backup
/backup/1.txt 監控/backup目錄創建事件顯示信息。
/backup/2.txt
/backup/3.txt
/backup/4.txt
/backup/5.txt
再開啟一個NFS服務器連接窗口進行測試驗證create事件。
[root@nfs01 backup]# mkdir {1..5}.txt
[root@nfs01 backup]# ls
1.txt 2.txt 3.txt 4.txt 5.txt m
[root@nfs01 backup]# rm 3.txt/ -fr ##刪除事件沒有監控,另一端也沒有信息輸出。
[root@nfs01 backup]# ls
1.txt 2.txt 4.txt 5.txt m
[root@nfs01 backup]#
測試delete事件
在NFS服務器上開啟inotify相應的監控功能,并輸出信息
[root@nfs01 backup]# ls
1.txt 2.txt 4.txt 5.txt m
[root@nfs01 backup]# rm -fr 5.txt/ ##刪除文件測試
[root@nfs01 backup]# rm -fr 2.txt/
[root@nfs01 backup]# mkdir oldboy.txt ###創建文件測試,但是沒有信息輸出
[root@nfs01 backup]#
再開啟一個NFS服務器連接窗口進行測試驗證delete事件
[root@nfs01 backup]# inotifywait-mqr --format '%w%f' -e delete /backup
/backup/5.txt
/backup/2.txt ##刪除會有信息輸出
測試moved事件
在NFS服務器上開啟inotify相應的監控功能,并輸出信息
[root@nfs01 backup]# inotifywait-mqr --format '%w%f' -e move /backup
/backup/oldboy.txt
/backup/1.txt
再開啟一個NFS服務器連接窗口進行測試驗證move事件
[root@nfs01 backup]# ls
1.txt 4.txt m
[root@nfs01 backup]# mv oldboy.txt//tmp/
[root@nfs01 backup]# mkdir 4
[root@nfs01 backup]# rm 4.txt/ -fr
[root@nfs01 backup]# mv 1.txt/ /tmp/
[root@nfs01 backup]#
說明:只監控move移動事件,其他事件并沒有進行監控,其他事件產生,監控服務沒有信息輸出,因此利用監控移動事件,就對目錄中文件或目錄的移入和移出事件都監控了。
知識點結論:
通過上面的測試實驗可以發現,有些監控事件已經包含了其他相應事件的監控功能,因此進行監控時可以根據要求精簡相應的監控事件。
重要事件 | 包含事件 | 備注說明 |
close | close_write , close_nowrite | 文件或目錄關閉,不管讀寫或是寫模式;即包含寫關閉或讀關閉 |
close_write | create | 包含文件創建事件,但不包含目錄創建事件 |
move | move_to move_from | 文件或目錄不管移動到或移動出監控目錄都觸發事件,即包含信息移入或移除監控目錄事件。 |
重要參數匯總:根據以上說明,在實際使用時,只要監控以下事件即可:create創建,delete刪除,moved_to移入,close_write修改
需要通過相應腳本實現目錄中變化文件信息推送,腳本編寫思路演變過程如下:
環境準備:在服務器上添加nfsbackup模塊和nfsbackup目錄,并授權屬組和屬主。
[root@backup nfsbackup]# cat/etc/rsyncd.conf
tart##
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
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 = 172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup] ##模塊名稱
path = /backup
[nfsbackup] ##模塊名稱
path = /nfsbackup
[root@backup nfsbackup]#
[root@backup backup]# chown rsync.rsync /nfsbackup/
客戶端上編寫腳本實時監控目錄中信息變化,并獲取變化信息。
# 第一步:編寫監控命令
#!/bin/bash
#desc: monitor /data and pushdatainfo to backup_server
/usr/bin/inotifywait -mrq --format"%w%f" -e moved_to,delete,create,close_write /data|\
第二步:編寫腳本編寫推送命令rsync 進行無差異同步 --delete /data/
while read line
do
rsync -az --delete /data/rsync_backup@172.16.1.41::nfsbackup --password-file=/etc/rsync.password
done
實現腳本監控目錄信息事件,并讓腳本在后臺運行。
[root@nfs01 data]# sh/server/scripts/monitor.sh &>/dev/null &
[1] 9891
[root@nfs01 data]#
監控文件系統事件變化,通過同步工具實現實時數據同步。
并發如果大于200個文件(4-100k),同步就會有延遲。
前面寫的腳本,每次都是全部推送一次,但確實是增量的,也可以只同步變化的文件,不變化的不理。
監控到事件后,請用rsync同步是單進程的(加&并發),sersync是多進程同步。
[root@nfs01 etc]# ls-l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 May 12 16:26 max_queued_events
-rw-r--r-- 1 root root 0 May 12 16:26 max_user_instances
-rw-r--r-- 1 root root 0 May 12 16:26 max_user_watches
[root@nfs01 inotify]# catmax_user_watches
8192
[root@nfs01 inotify]# catmax_user_instances
128
[root@nfs01 inotify]# cat max_queued_events
16384
[root@nfs01 inotify]#
[root@nfs01 data]# cd/proc/sys/fs/inotify/
[root@nfs01 inotify]# ls
max_queued_events max_user_instances max_user_watches
[root@nfs01 inotify]# echo "50000000">/proc/sys/fs/inotify/max_user_watches
[root@nfs01 inotify]# echo "50000000">/proc/sys/fs/inotify/max_queued_events
[root@nfs01 inotify]# ##說明:以上配置重啟可能會失效,需要放置在rc.local文件中。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。