Inotify:
Inotify,它是在內核 2.6.13 版本中引入的一個新功能,爲用戶態監視文件系統的變化提供了強大的支持,允許監控程序打開一個獨立文件描述符,並針對事件集監控一個或者多個文件,例如打開、關閉、移動/重命名、刪除、創建或者改變屬性。
Inotify-tools:
Inotify-tools是爲linux下inotify文件監控工具提供的一套c的開發接口庫函數,同時還提供了一系列的命令行工具,這些工具可以用來監控文件系統的事件。
Rsync+Inotify軟件角色:
之前的博客講述過Rsync工具的使用,在很多場景下,我們使用Rsync工具是從服務器主機獲取數據或者是向服務器主機推送數據,這種操作的主動方在客戶端主機,往往服務器端是被動接收數據請求或提供數據服務的一方,是對外提供服務的,這種應用場景更適合於企業內的數據存儲,而在使用了Inotify+Rsync的應用場景中,數據發送請求的主動方的角色發生了轉換,服務器端主動向客戶端發起數據同步請求,而客戶端(這個場景下的客戶端主機通常也是服務器,但是是從服務器)被動的接收數據傳輸請求,但有一點需要注意,這些從服務器需要啓用Rsync的服務器模式,監聽在tcp的873端口,所以我們要注意這種場景下主服務器端和從服務器端工作方式的轉換和Rsync軟件工作於哪類主機的角色上的轉換,便於我們理解並配置Rsync和Inotify。
inotofy-tools安裝:
[root@rsync ~]# tar xf inotify-tools-3.14.tar.gz [root@rsync ~]# cd inotify-tools-3.14 [root@rsync inotify-tools-3.14]# ./configure [root@rsync inotify-tools-3.14]# make && make install
inotify命令使用:
首先要確認當前系統的內核版本,2.6.13版本以後支持Inotify,之前的版本是不支持的。安裝後的Inotify工具在/usr/local/bin目錄下有兩個工具文件:
[root@rsync ~]# ll /usr/local/bin/ total 88 -rwxr-xr-x 1 root root 44271 Aug 23 21:12 inotifywait -rwxr-xr-x 1 root root 41361 Aug 23 21:12 inotifywatch
inotifywait命令使用:
語法格式:
inotifywait [-hcmrq] [-e <event> ] [-t <seconds> ] [--format <fmt> ] [--timefmt <fmt> ] <file> [ ... ]
參數選項: -h,--help :輸出幫助信息 @ :排除不需要監視的文件,可以是相對路徑,也可以是絕對路徑 -fromfile :從文件讀取需要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭 -m,-monitor :接收到一個事件後不退出,無限期執行。 -d,-daemon :以服務進程的方式在後臺運行,不退出,但需要指定-outfile用於記錄日誌 -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定義的時間格式
-e選項指定可以監聽的時間,其中時間的可用類型有: access :表示文件讀取。 modify : 表示文件更改。 attrib : 表示文件屬性的。 close_write :以可寫的方式打開的文件被關閉時觸發,但不一定寫入了數據。 close_nowrite: 以只讀的模式打開的文件被關閉時觸發。 close : 文件被後關閉。 open :文件打開。 moved_to :文件或目錄被移動到被監聽的目錄中,該事件會被觸發。 moved_from :文件或目錄移出被監聽的目錄,即使在同一個目錄移動,該事件也會被觸發。 move:包括moved_to和moved_from。 move_self:文件或目錄被移除,之後不再監聽此文件或目錄。 delete:文件或目錄被刪除觸發。 delete_self:文件或目錄移除,以後不再監聽此文件或目錄。 umount:文件系統被取消掛載,之後不再監聽此文件系統。
inotify命令使用示例:
[root@rsync ~]# inotifywait -rm /etc/ Setting up watches. Beware: since -r was given, this may take a while! Watches established.
打開另一個終端,進入/etc目錄執行ls命令就可以觸發監聽事件。
/etc/ OPEN ld.so.cache /etc/ CLOSE_NOWRITE,CLOSE ld.so.cache /etc/ OPEN,ISDIR /etc/ CLOSE_NOWRITE,CLOSE,ISDIR
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:以指定的事件進行升序排列。 -d:以指定的時間降序排列。
inotifywatch命令使用示例:
統計/etc目錄下指定監聽的時間發生的次數
[root@rsync ~]# inotifywatch -v -e create -e modify -e delete -t 30 -r /etc Establishing watches... Setting up watch(es) on /etc OK, /etc is now being watched. Total of 245 watches. Finished establishing watches, now collecting statistics. Will listen for events for 30 seconds. total create filename 2 2 /etc/
Inotif結合Rsync示例:
實驗環境用三臺虛擬機:
主服務器:192.168.2.1
從服務器:192.168.2.2,192.168.2.3
當主服務器端被監聽的目錄發生數據改變時,自動向從服務器端發送數據。
步驟1,主服務器端安裝Rsync,Inotify-tools,前面已經演示過就不再重複了,但主服務器端需要創建數據傳送時認證用戶的密碼文件,還要準備監聽的數據目錄,假設爲/var/www/html。
[root@rsync ~]# echo "redhat" > /etc/rsyncd.passwd [root@rsync ~]# cat /etc/rsyncd.passwd redhat
步驟二,在從服務器端同樣也安裝上Rsync,但是從服務器端的Rsync是要被動接收服務請求的,所以要配置爲服務器模式,配置文件的示例如下,注意:兩臺從服務器都要配置,從服務器端的數據接收目錄假設也爲/var/www/html:
[root@client2 ~]# yum install xinetd [root@client2 ~]# yum install rsync #多數情況下已安裝,需要的情況下執行該操作 [root@client2 ~]# chkconfig rsync on
編輯配置文件/etc/rsyncd.conf:
# Global Settings uid = nobody gid = nobody use chroot = no max connections = 10 strict modes = yes pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log # Directory to be synced [backup] path = /var/www/html ignore errors = yes read only = no write only = no hosts allow = 192.168.2.0/24 hosts deny = * list = true uid = root gid = root auth users = backup_transfer secrets file = /etc/rsyncd.passwd
創建認證用的密碼文件,同時改變文件屬性爲600,注意,密碼的長度不要超過8個字符,否則認證會失敗:
[root@rsync ~]# echo -e "backup_transfer:redhat" /etc/rsyncd.passwd [root@rsync ~]# chmod 600 /etc/rsyncd.passwd [root@rsync ~]# cat /etc/rsyncd.passwd backup:redhat
啓動xinetd服務:
[root@client2 ~]# service xinetd start [root@client2 ~]# ss -tnlp | grep xinetd LISTEN 0 64 :::873 :::* users:(("xinetd",1436,5))
步驟三、測試主服務器端向從服務器拉取和推送數據是否可以正常完成:
[root@rsync tmp]# rsync -a /etc/fstab [email protected]::backup [root@rsync tmp]# rsync -a [email protected]::backup/fstab ./
測試通過後設置主服務器端監聽的數據目錄並提供腳本以實現實時數據同步:
腳本內容如下:
#!/bin/bash # /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %w%f %e' -e modify,delete,create,attrib /var/www/html | while read file; do /usr/bin/rsync -vzrtopg --delete --progress /var/www/html/ [email protected]::backup --password-file=/etc/rsyncd.passwd /usr/bin/rsync -vzrtopg --delete --progress /var/www/html/ [email protected]::backup --password-file=/etc/rsyncd.passwd echo "${files} was rsynced" >> /var/log/rsync.log 2>&1 done
注意:複製的目錄後面要有路徑分隔符/,這樣可以將目錄內的文件同步到從服務器的指定目錄下,如果沒有路徑分隔符,會將主服務器的html目錄複製到從服務器的/var/www/html目錄下面,會多出一層目錄,不是我們期望的效果。
增加腳本的可執行權限,使腳本運行於後臺,並且可以開機啓動(追加至/etc/rc.d/rc.local文件中)
[root@rsync ~]# chmod +x rsync.sh [root@rsync ~]# echo "/root/rsync.sh" >> /etc/rc.d/rc.local
Rsync+Inotify的配置完成。