Linux服務之inotify+rsync數據同步

一、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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章