inotify是Linux內核的一個功能,它能監控文件系統的變化,好比刪除、讀、寫和卸載等操做。要使用inotify,Linux內核版本必須是大於2.6.13,實現inotify的軟件爲inotify-toolscss
# 查看系統內核版本 [root@nfs ~]# uname -r 3.10.0-1062.12.1.el7.x86_64 # 查看inotify的內核參數的文件是否存在 [root@nfs ~]# ll /proc/sys/fs/inotify/ total 0 -rw-r--r-- 1 root root 0 Jul 8 09:43 max_queued_events -rw-r--r-- 1 root root 0 Jul 8 09:43 max_user_instances -rw-r--r-- 1 root root 0 Jul 8 09:43 max_user_watches max_queued_events ---設置inotify實例事件(event)隊列可容納的事件數量,默認值16384 max_user_instances ---設置每一個用戶單個進程監控文件的數量,默認是8129 max_user_watches ---設置i用戶建立inotify實例的最大值,默認是128 # 修改max_queued_events內核參數 [root@nfs ~]# echo 'fs.inotify.max_queued_events=999999' >> /etc/sysctl.conf [root@test ~]# cat /proc/sys/fs/inotify/max_queued_events 999999
安裝inotify-tools須要用到epel源html
[root@nfs ~]# yum -y install inotify-tools [root@nfs ~]# rpm -ql inotify-tools /usr/bin/inotifywait --- 監控目錄數據信息變化 /usr/bin/inotifywatch --- 對監控的變化信息進行統計 ......
## inotifywait參數說明 參數名稱 參數說明 -m ,-monitor 始終保持事件監聽狀態 -r,-recursive 遞歸查詢目錄 -q,-quiet 只打印監控事件的信息 -exclude 排除文件或目錄時,不區分大小寫 -t,-timeout 超時時間 --timefmt 指定時間輸出格式 --format 指定輸出格式 -e,event 後面指定增,刪,改等事件 ## --timefmt <fmt>時間格式 %Y: ---表示年份信息,包含世紀信息 %y: ---表示年份信息,不包含世紀信息 %m: ---表示月份,範圍01-12 %d: ---表示每個月的第幾天,範圍01-31 %H: ---表示小時信息,使用24小時制度,範圍00-24 %M: ---表示分鐘,範圍00-59 ## --format<fmt>輸出信息格式定義 %T: ---輸出時間格式中定義的時間格式,這個表示調用咱們前面定義時間格式,一般狀況--timefmt選項和--format結合使用 %w: ---表示事件出現時,監控文件或目錄的名稱信息。也就是監控資源名稱信息 %f: ---時間出現時,顯示監控目錄下觸發事件的文件或目錄信息 %e: ---顯示發生的事件信息,不一樣事件默認用逗號分隔 %Xe: ---顯示發生的事件,不一樣的時間指定用"X"分割 ## -e選項指定監控事件類型說明 access ---讀取文件或目錄內容 modify ---修改文件或目錄內容 attrib ---文件或目錄的屬性改變 close_write ---修改真實文件內容 close_nowrite ---示文件或目錄關閉,在只讀模式打開以後關閉的 close ---表示文件或目錄關閉,不論是讀仍是寫模式 open ---文件或目錄被打開 moved_to ---文件或目錄移動到 moved_from ---文件或目錄從...移動到 move ---移動文件或目錄移動到監視目錄 create ---在監視目錄下建立文件或目錄 delete ---刪除監視目錄下的文件或目錄 delete_self ---表示文件或目錄被刪除,目錄自己被刪除 umount ---卸載文件系統
服務器 | 主機名 | 外網IP | 內網IP | 軟件 |
---|---|---|---|---|
NFS服務器 | nfs | 192.168.1.31 | 172.16.1.31 | nfs-utils+rpcbind |
web服務器 | web01 | 192.168.1.7 | 172.16.1.7 | nfs-utils |
# 長時間遞歸監聽/mnt目錄 [root@nfs ~]# inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f event_info:%e' -e delete,create,modify,moved_to,close_write /data # /mnt目錄下操做文件或目錄 [root@web01 mnt]# touch aaa [root@web01 mnt]# echo "hello" > aaa [root@web01 mnt]# rm -f aaa [root@web01 mnt]# mv bbs /root # 監聽信息 [root@nfs ~]# inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f event_info:%e' -e delete,create,modify,moved_to,close_write /data 2020-07-08 14:34 /data/ aaa event_info:CREATE 2020-07-08 14:34 /data/ aaa event_info:CLOSE_WRITE,CLOSE 2020-07-08 14:35 /data/ aaa event_info:MODIFY 2020-07-08 14:35 /data/ aaa event_info:CLOSE_WRITE,CLOSE 2020-07-08 14:35 /data/ aaa event_info:DELETE 2020-07-08 14:35 /data/ bbs event_info:DELETE,ISDIR
[root@nfs scripts]# cat 01-inotify_rsync.sh #!/bin/sh backup_Server=172.16.1.41 export RSYNC_PASSWORD=123456 /usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data | while read line do echo ${line} if [ -f ${line} ] then rsync -az ${line} rsync_backup@${backup_Server}::data else rsync -az --delete /data/ rsync_backup@${backup_Server}::data fi done
sersync相似於inotify,一樣用於監控,但它克服了inotify的缺點.linux
inotify最大的不足是會產生重複事件,或者同一個目錄下多個文件的操做會產生多個事件,例如,當監控目錄中有5個文件時,刪除目錄時會產生6個監控事件,從而致使重複調用rsync命令。好比:vim文件時,inotify會監控到臨時文件的事件,但這些事件相對於rsync來講是不該該被監控的c++
sersync 優勢:git
環境準備:兩臺服務器,一臺NFS服務器,一臺備份服務器(部署好Rsync守護進程服務)github
NFS服務器上操做:web
# 下載軟件 [root@nfs tools]# wget http://down.whsir.com/downloads/sersync2.5.4_64bit_binary_stable_final.tar.gz # 解壓 [root@nfs tools]# tar -xf sersync2.5.4_64bit_binary_stable_final.tar.gz # 修更名稱 [root@nfs tools]# mv GNU-Linux-x86/ sersync # 移動到/usr/local [root@nfs tools]# mv sersync /usr/local/ [root@nfs tools]# cd /usr/local/sersync [root@nfs sersync]# cp confxml.xml confxml.xml.bak
[root@nfs sersync]# vim confxml.xml ## 排除指定數據信息不要進行實時傳輸同步 <filter start="false"> <!--爲true時生效--> <exclude expression="(.*)\.svn"></exclude> <exclude expression="(.*)\.gz"></exclude> <exclude expression="^info/*"></exclude> <exclude expression="^static/*"></exclude> </filter> ## 定義inotify程序須要監控的事件 <inotify> <delete start="true"/> <createFolder start="true"/> <createFile start="false"/> <closeWrite start="true"/> <moveFrom start="true"/> <moveTo start="true"/> <attrib start="false"/> <modify start="false"/> </inotify> ## 監控目錄 <localpath watch="/data"> # 同步數據遠程服務器ip 模塊名 <remote ip="172.16.1.41" name="data"/> <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> # 同步參數 <commonParams params="-artuz"/> # rsync遠程認證用戶,認證密碼文件 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/> # 端口,默認874 <userDefinedPort start="false" port="874"/><!-- port=874 --> <timeout start="false" time="100"/><!-- timeout=100 --> <ssh start="false"/> </rsync>
[root@nfs conf]# sersync -h set the system param execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events parse the command param ______________________________________________________ 參數-d:啓用守護進程模式 參數-r:在監控前,將監控目錄與遠程主機用rsync命令推送一遍 參數-n:指定開啓守護線程的數量,默認爲10個 參數-o:指定配置文件,默認使用confxml.xml文件 參數-m:單獨啓用其餘模塊,使用 -m refreshCDN 開啓刷新CDN模塊 參數-m:單獨啓用其餘模塊,使用 -m socket 開啓socket模塊 參數-m:單獨啓用其餘模塊,使用 -m http 開啓http模塊 不加-m參數,則默認執行同步程序 _______________________________________________________
[root@nfs conf]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
cd /data while true ;do ls |wc -l;sleep 0.1;done
cd /data for i in {1..1000};do echo "${i}"; echo "${i}" > ${i}.txt;sleep 0.1;done
說明:使用sersync是能夠解決以前的缺陷問題,可是這個服務自生也是存在缺陷問題,例如:不能同時監控多個目錄,該服務實現多目錄監控只能將以前的配置文件從新複製一份重命名,以後與以前啓動守護進程同樣,在從新啓動一個新的進程,這樣就比較麻煩。這個問題在lsyncd這個服務中就很好地解決了這個問題shell
Lysncd 其實是lua語言封裝了 inotify 和 rsync 工具,採用了 Linux 內核(2.6.13 及之後)裏的 inotify 觸發機制,而後經過rsync去差別同步,達到實時的效果。我認爲它最使人稱道的特性是,完美解決了 inotify + rsync海量文件同步帶來的文件頻繁發送文件列表的問題 —— 經過時間延遲或累計觸發事件次數實現。另外,它的配置方式很簡單,lua自己就是一種配置語言,可讀性很是強。lsyncd也有多種工做模式能夠選擇,本地目錄cp,本地目錄rsync,遠程目錄rsyncssh。express
官方地址vim
[root@nfs ~]# yum -y install lsyncd
這裏在上面的基礎上在主機名爲nfs新建一個目錄data1,對應在backup新建一個backup1目錄
[root@nfs ~]# cat /etc/lsyncd.conf settings { logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd.status", inotifyMode = "CloseWrite", maxProcesses = 8, } sync { default.rsync, source = "/data1", target = "rsync_backup@172.16.1.41::data", delete = true, exclude = { ".*" }, delay = 1, rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, verbose = true, password_file = "/etc/rsync.password", _extra = {"--bwlimit=200"} } } sync { default.rsync, source = "/backup1", target = "rsync_backup@172.16.1.41::backup", delete = true, exclude = { ".*" }, delay = 1, rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, verbose = true, password_file = "/etc/rsync.password", _extra = {"--bwlimit=200"} } }
lsyncd.conf配置選項說明 settings 裏面是全局設置,--開頭表示註釋,下面是幾個經常使用選項說明: logfile 定義日誌文件 stausFile 定義狀態文件 nodaemon=true 表示不啓用守護模式,默認 statusInterval 將lsyncd的狀態寫入上面的statusFile的間隔,默認10秒 inotifyMode 指定inotify監控的事件,默認是CloseWrite,還能夠是Modify或CloseWrite or Modify maxProcesses 同步進程的最大個數。假如同時有20個文件須要同步,而maxProcesses = 8,則最大能看到有8個rysnc進程 maxDelays 累計到多少所監控的事件激活一次同步,即便後面的delay延遲時間還未到 sync 裏面是定義同步參數,能夠繼續使用maxDelays來重寫settings的全局變量。通常第一個參數指定lsyncd以什麼模式運行:rsync、rsyncssh、direct三種模式: default.rsync :本地目錄間同步,使用rsync,也能夠達到使用ssh形式的遠程rsync效果,或daemon方式鏈接遠程rsyncd進程; default.direct :本地目錄間同步,使用cp、rm等命令完成差別文件備份; default.rsyncssh :同步到遠程主機目錄,rsync的ssh模式,須要使用key來認證 source 同步的源目錄,使用絕對路徑。 target 定義目的地址.對應不一樣的模式有幾種寫法: /tmp/dest :本地目錄同步,可用於direct和rsync模式 172.29.88.223:/tmp/dest :同步到遠程服務器目錄,可用於rsync和rsyncssh模式,拼接的命令相似於/usr/bin/rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET,剩下的就是rsync的內容了,好比指定username,免密碼同步 172.29.88.223::module :同步到遠程服務器目錄,用於rsync模式 三種模式的示例會在後面給出。 init 這是一個優化選項,當init = false,只同步進程啓動之後發生改動事件的文件,原有的目錄即便有差別也不會同步。默認是true delay 累計事件,等待rsync同步延時時間,默認15秒(最大累計到1000個不可合併的事件)。也就是15s內監控目錄下發生的改動,會累積到一次rsync同步,避免過於頻繁的同步。(可合併的意思是,15s內兩次修改了同一文件,最後只同步最新的文件) excludeFrom 排除選項,後面指定排除的列表文件,如excludeFrom = "/etc/lsyncd.exclude",若是是簡單的排除,可使用exclude = LIST。 這裏的排除規則寫法與原生rsync有點不一樣,更爲簡單: 監控路徑裏的任何部分匹配到一個文本,都會被排除,例如/bin/foo/bar能夠匹配規則foo 若是規則以斜線/開頭,則從頭開始要匹配所有 若是規則以/結尾,則要匹配監控路徑的末尾 ?匹配任何字符,但不包括/ *匹配0或多個字符,但不包括/ **匹配0或多個字符,能夠是/ delete 爲了保持target與souce徹底同步,Lsyncd默認會delete = true來容許同步刪除。它除了false,還有startup、running值,請參考 Lsyncd 2.1.x ‖ Layer 4 Config ‖ Default Behavior。 rsync (提示一下,delete和exclude原本都是rsync的選項,上面是配置在sync中的,我想這樣作的緣由是爲了減小rsync的開銷) bwlimit 限速,單位kb/s,與rsync相同(這麼重要的選項在文檔里居然沒有標出) compress 壓縮傳輸默認爲true。在帶寬與cpu負載之間權衡,本地目錄同步能夠考慮把它設爲false perms 默認保留文件權限。 其它rsync的選項 其它還有rsyncssh模式獨有的配置項,如host、targetdir、rsync_path、password_file,見後文示例。rsyncOps={"-avz","--delete"}這樣的寫法在2.1.*版本已經不支持。 lsyncd.conf能夠有多個sync,各自的source,各自的target,各自的模式,互不影響。
[root@nfs ~]# systemctl start lsyncd
# backup測試 cd /data while true ;do ls |wc -l;sleep 0.1;done # NFS測試 cd /data for i in {1..1000};do echo "${i}"; echo "${i}" > ${i}.txt;sleep 0.1;done