在上一篇中介紹了rsync的應用和一些rsync的優點、缺點等,並在最後提到了inotify這個工具,下面就來說一下inotify這個工具。
先來說一下rsync的不足之處吧。
1、rsync同步數據時,需要掃描所有文件後進行比對,然後進行差量傳輸。如果文件數量達到百萬甚至千萬量級,掃描所有文件將是非常耗費時間的,而且發生變化的往往是其中的很少一部分,因此在這種情況下rsync的工作效率是非常低的,
2、rsync不能實時監測、同步數據,雖然它可以通過Linux守護進程的方式觸發同步,但是在兩次觸發動作一定會有時間差,可能就導致服務器端與客戶端數據出現不一致,無法在出現應用故障時完全恢復數據。
基於以上原因,rsync+inotify組合出現了。
關於inotify
inotify是一種強大的、細粒度的、異步的文件系統事件監控機制,Linux內核從2.6.13版本就開始加入對inotify的支持。
通過inotify可以監控文件系統中添加、刪除、修改、移動等各種細微事件,利用這個內核接口,第三方軟件可以監控文件系統下文件的各種變化情況,inotify-tools就是這樣的一個第三方軟件。
正由於inotify這些特性能夠彌補rsync的不足。兩者的工作方式是:用inotify可以監控文件系統和各種變化,當文件有任何變動時,會觸發rsync同步。
安裝inotify工具inotify-tools
由於inotify的特性需要Linux內核的支持,在安裝之前要確認Linux系統內核是否在2.6.13版本之上,如果低於這個版本,就要重新編譯內核加入對inotify的支持。可以用以下方式來判斷是否支持inotify
- [root@localhost ~]# uname -r
- 2.6.18-164.el5
- [root@localhost ~]# ll /proc/sys/fs/inotify/
- total 0
- -rw-r--r-- 1 root root 0 Jun 21 18:11 max_queued_events
- -rw-r--r-- 1 root root 0 Jun 21 18:11 max_user_instances
- -rw-r--r-- 1 root root 0 Jun 21 18:11 max_user_watches
如果有上面3行的輸出說明系統默認支持inotify,可以安裝inotify-tools了。可以到http://inotify-tools.sourceforge.net/下載相應版本的inotify-tools
- [root@localhost ~]# tar zxvf inotify-tools-3.14.tar.gz
- [root@localhost inotify-tools-3.14]# cd inotify-tools-3.14
- [root@localhost inotify-tools-3.14]# ./configure
- [root@localhost inotify-tools-3.14]# make
- [root@localhost inotify-tools-3.14]# make install
- [root@localhost inotify-tools-3.14]# ll /usr/local/bin/inotifywa*
- -rwxr-xr-x 1 root root 37260 Jun 21 18:20 /usr/local/bin/inotifywait
- -rwxr-xr-x 1 root root 35434 Jun 21 18:20 /usr/local/bin/inotifywatch
- 安裝完成後,會生成inotifywait和inotifywatch兩個指令。
inotifywait用於等待文件或文件集上的一個待定事件,可以監控任何文件和目錄設置,並且可以遞歸地監控整個目錄樹;
inotifywatch 用於收集被監控的文件系統計數據,包括每個inotify事件發生多少次等信息
從上面可知inotifywait是一個監控事件,可以配合shell腳本使用它。與它相關的參數:
-m 即“--monitor”,表示始終保持事件監聽狀態。
-r 即“--recursive”,表示遞歸查詢目錄
-q 即“--quiet”,表示打印出監控事件
-e 即 “--event”,通過此參數可以指定要監控的事件,常見的事件有modify、delete、create、和attrib等
要想更多的瞭解可以用man inotifywait
下面針對rsync和inotify來做個小設計:
有兩個臺服務器也就是兩個節點 A 、B
還有一個服務器C是來將靜態的頁面同步到A、B兩個服務器上的。
這三臺服務器的相關信息:
內核版本 用途 ip地址 網頁數據路徑
A 2.6.18-164.el5 服務節點1 192.168.35.4 /web1/wwwroot
B 2.6.18-164.el5 服務節點2 192.168.35.5 /web2/wwwroot
C 2.6.18-164.el5 內容發佈節點 192.168.35.6 /web/wwwroot
1、安裝rsync與inotify-tools
inotify-tools是用來監控文件系統變化的工具,因此必須安裝在內容發佈節點上,服務節點不用安裝。
還有就是這三臺服務器都要安裝上rsync這個工具。安裝方式在上篇博客中提到在這裏就不再說了。
安裝完成後,下面來說一下各服務器節點的配置
對於兩臺服務器節點上的配置如下:
A 節點的rsyncd.conf配置如下:
- uid = nobody
- gid = nobody
- use chroot = no
- max connections = 10
- strict modes = yes
- pid file = /var/run/rsyncd.pid
- lock file = /var/run/rsync.lock
- log file = /var/log/rsyncd.log
- [web1]
- path = /web1/wwwroot/
- comment = web1 file
- ignore errors
- read only = no
- write only = no
- hosts allow = 192.168.35.6
- hosts deny = *
- list = false
- uid = root
- gid = root
- auth users = web1user
- secrets file = /etc/web1.pass
B 節點的rsyncd.conf配置如下:
- uid = nobody
- gid = nobody
- use chroot = no
- max connections = 10
- strict modes = yes
- pid file = /var/run/rsyncd.pid
- lock file = /var/run/rsync.lock
- log file = /var/log/rsyncd.log
- [web2]
- path = /web2/wwwroot/
- comment = web2 file
- ignore errors
- read only = no
- write only = no
- hosts allow = 192.168.35.6
- hosts deny = *
- list = false
- uid = root
- gid = root
- auth users = web2user
- secrets file = /etc/web2.pass
這兩個配置文件完成了,下面還要在這兩臺服務器上分別創建web1.pass和web2.pass這兩個文件
所要添加的內容是:
# vim /etc/web1.pass
web1user:zhou
# vim /etc/web2.pass
web2user:zhou
在配置完成後,就可以啓動rsync守護進程了。
/usr/local/bin/rsync --daemon
下面在內容發佈節點上來做一下配置,主要工作是將變化的內容實時同步到2個服務節點上,來創建一個腳本來實現這個功能。
腳本內容如下:
- #!/bin/bash
- host1=192.168.35.4
- host2=192.168.35.5
- src=/web/wwwroot/
- dst1=web1
- dst2=web2
- user1=web1user
- user2=web2user
- /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modfiy,delete,create,attrib $src | while read files
- do
- /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@$host1::$dst1
- /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user2@$host2::$dst2
- echo "${files} was rsynced" >> /tmp/rsync.log 2>&1
- done
在這個腳本完成後還創建一個文件在
# vim /etc/server.pass
內容就是上面兩個服務器中的用戶的密碼。zhou
# more /etc/server.pass
zhou
腳本的一些參數如下:
--timefmt: 指定時間的輸出格式
--format: 指定變化文件的詳細信息
這個參數要配合使用,通過指定輸出格式輸出類似以下的內容
15/06/10 12:00 /web/wwwroot/ixdba.shDELETE,ISDIR was rsynced
這個腳本的作用就是通過inotify監控文件目錄的變化,進而觸發rsync進行同步操作。由於這個過程是一個主動觸發操作的過程,是通過系統內核完成的,所以比那些遍歷整個目錄的掃描方式效率要高很多。
有時會出現這樣的情況,當在監控的目錄中寫入一個很大的文件,也就寫入的文件需要一段時間,inotify會持續不停地輸出該文件被更新的信息,這樣就會持續不斷地觸發rsync執行同步操作,佔用大量系統資源。出現這種情況,最理想的做法就是等待文件寫完後再觸發rsync同步。在這種情況下,可以修改inotify的監控事件,即,“-e close_write,delete,create,attrib”。
給上面的腳本添加執行權限,放到後臺運行就可以了。
下面就可在發佈節點上的/web/wwwroot/目錄下添加,刪除或者修改某個文件來測試一下,是否能正常工作。如果看到有變化說明這個實時同步的功能就配置成功了。
如果有什麼不對的地方,還請指出來,謝謝大家!