一、inotify簡介
inotify是Linux內核2.6.13 (June 18, 2005)版本新增的一個子系統(API),它提供了一種監控文件系統(基於inode的)事件的機制,可以監控文件系統的變化如文件修改、新增、刪除等,並可以將相應的事件通知給應用程序。該機制由著名的桌面搜索引擎項目beagle引入用於替代此前具有類似功能但存在諸多缺陷的dnotify。
二、rsync簡介
rsync是類unix系統下的數據鏡像備份工具,從軟件的命名上就可以看出來了——remote sync.
1、rsync有四種模式:常用的是第一種,第二種和第四種
第一個是shell模式,也稱爲本地模式;
第二個是遠程shell模式,其利用SSH執行底層連接和傳輸;
第三個是列表模式,其工作方式與ls相似,即列出源的內容;-nv
第四個模式是服務器模式。rsync以守護進程方式運行,接收文件傳輸請求。在使用時,可以使用rsync命令把文件發送給守護進程,也可以向它請求文件。服務器模式非常適合創建中心備份服務器或項目存儲庫。
2、Rsync常用選項:
rsync有許多選項。如果擔心指定的選項或者源或目標不正確,可以使用-n執行試運行。試運行 會預覽對每個文件的操作,但是不會實際複製數據。當確認所有設置是正確的之後,刪除-n選項,再次運行命令。
-n測試,不真正操作數據 -v, --verbose 詳細模式輸出 -q, --quiet 精簡輸出模式 -c, --checksum 打開校驗開關,強制對文件傳輸進行校驗 -a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性,等於-rlptgoD -r, --recursive 對子目錄以遞歸模式處理 -l, --links 保留符號鏈結 -p, --perms 保留文件權限 -t, --times 保留文件時間戳 -g, --group 保留文件屬組信息 -o, --owner 保留文件屬主信息 -D, --devices 保留設備文件即特殊文件信息 -e, --rsh=COMMAND 指定替代rsh的shell程序 -z, --compress 對備份的文件在傳輸時進行壓縮處理 還可以使用兩個選項監視傳輸的狀態:--progress和--stats。 --progress 顯示進度條 --stats 顯示如何執行壓縮和傳輸
注意:rsync命令使用中,如果源參數的末尾有斜槓,就會複製指定目錄的內容,而不復制目錄本身。目標參數末尾的斜槓沒有作用。如下面的命令會把/mydata/data目錄中的所有文件複製到/backups目錄中。
三、環境介紹
環境描述,client上傳數據到web1,軟後通過inotify+rsync同步到web2,而且要求實時同步,這樣就能保證兩臺web服務器的數據一致了。
同步目錄:
源:web1:172.16.3.3:/www/htdocs
目標:web2:172.16.3.4:/www/htdocs
四、實現rsync手動同步
1、設定目標主機(Web2:172.16.3.4)
(1)安裝相關軟件
# yum -y install rsync xinetd
(2)爲rsync提供配置文件/etc/rsyncd.conf,內容類似如下內容:
# Section 1: Global settings uid = nobody gid = nobody use chroot = no max connections = 3 strict modes = yes pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log # Section 2:Directory to be synced [htdocs] path = /www/htdocs ignore errors = yes read only = no write only = no hosts allow = 172.16.0.0/16 hosts deny = * list = false uid = root gid = root auth users = testuser secrets file = /etc/rsync.passwd
(3)提供secrets file所指定的口令文件/etc/rsync.passwd,並設置訪問權限
# vi /etc/rsync.passwd testuser:P@ssw0rd 修改權限 # chmod 600 /etc/rsync.passwd
(4)配置服務可以開機啓動:
# chkconfig rsync on # chkconfig xinetd on # service xinetd start
(5)查看873端口是否在監聽,默認情況下,rsyncd監聽的端口爲873/TCP
# netstat -antp |grep 873 tcp 0 0 :::873 :::* LISTEN 1667/xinetd
(6)創建同步測試目錄
# mkdir -pv /www/htdocs
2、配置源主機
(1)安裝rsync
yum -y install rsync
(2)爲源主機的rsync提供通過htdocsuser用戶同步文件至目標主機的口令文件
# echo 'P@ssw0rd' > /etc/rsync.passwd # chmod 600 /etc/rsync.passwd
(3)手動同步測試
# rsync -avz --password-file /etc/rsync.passwd /etc/inittab [email protected]::htdocs sending incremental file list inittab sent 533 bytes received 27 bytes 1120.00 bytes/sec total size is 884 speedup is 1.58
五、利用inotify自動同步
1、安裝inotify-tools
軟件下載地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
# tar xf inotify-tools-3.14.tar.gz # cd inotify-tools-3.14 # ./configure # make # make install # echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf # ldconfig
2、創建測試目錄
# mkdir -pv /www/htdocs
3、建立腳本/root/bin/htdocsync.sh,通過inotifywait監控目標文件上的相應事件,並在事件觸發時啓動同步過程:
#!/bin/bash # DESTHOST=172.16.3.4 DESTHOSTDIR=/www/htdocs/ SRCDIR=/www/htdocs/ inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e close_write,modify,delete,create,attrib $SRCDIR | while read DATE TIME DIR FILE; do FILECHANGE=${DIR}${FILE} rsync -avz --password-file=/etc/rsync.passwd $SRCDIR htdocsuser@${DESTHOST}::htdocs &>/dev/null && \ echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/websync.log done
4、執行腳本
chmod +x /root/bin/htdocsync.sh /root/bin/htdocsync.sh &
5、測試
在web1的/www/htdocs目錄創建一個文件,立刻同步到web2