天天看點

rsync+inotify實作檔案的實時同步

 環境描述:現有兩台伺服器,要實作mp3檔案的實時同步。可以使用rsync來做同步,但不能實作實時,為了實作實時同步,我們使用inotify來監控需要同步的目錄發生的改變,inotify隻是核心中的一個監控檔案變化的子產品,提供了監控檔案變化的API,而要連接配接這個API,需要安裝inotify-tools工具。可以實作檔案的新增,删除,修改,改變屬性等,功能很強大。現在需要一台伺服器做為内容釋出端,來把改變的檔案,通過rsync實時的同步到内容伺服器。

==========================================

内容伺服器:1.1.1.1(Ubuntu 12.04 x86-64)

釋出伺服器:1.1.1.2(Ubuntu 12.04 x86-64)

安裝rsync

# sudo apt-get install rsync

提供rsync配置檔案

# mkdir /etc/rsyncd/

# vim /etc/rsyncd/rsyncd.conf

# Section 1: Global settings 

port = 873 

uid = root 

gid = root 

use chroot = yes 

read only = no 

max connections = 7 

pid file = /var/run/rsyncd.pid 

log file = /var/log/rsyncd.log 

hosts allow = * 

transfer logging = yes 

log format = %t %a %m %f %b 

syslog facility = local3 

timeout = 300 

# Section 2: Directory to be synced 

[mp3] 

path = /data/mp3 

list = false 

ignore errors = yes 

auth users = syncuser 

secrets file = /etc/rsyncd/rsyncd.pass 

提供secrets file所指定的密碼檔案/etc/rsyncd/rsyncd.pass,其内容類似如下:

syncuser:IamOK

其中冒号前的是使用者名,冒号後的是對應使用者的密碼。此檔案不能為其他任意使用者可通路,是以可用如下指令修改:

# chmod 600  /etc/rsyncd/rsyncd.pass

啟動rsync服務

# /usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf

驗證服務是否開戶

root@node1:/etc/rsyncd# netstat -nutlp | grep :873

tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      2357/rsync

加入開機啟動

# echo "/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf" >>/etc/rc.local

安裝rsync及inotify-tools

# sudo apt-get install rsync inotify-tools

# vim /etc/rsyncd/rsyncd.pass

IamOK

建立自動同步的腳本,使用inotifywait監控目錄,當監控目錄改變的時候,調用rsync同步改變的檔案

# vim /var/tmp/auto_sync.sh

#!/bin/bash 

DESTHOST=1.1.1.1 

DESTHOSTDIR=/data/mp3/ 

SRCDIR=/data/mp3/ 

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/rsyncd/rsyncd.pass $FILECHANGE syncuser@${DESTHOST}::mp3 &>/dev/null && \ 

       echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/mp3sync.log 

done 

# chmod u+x /var/tmp/auto_sync.sh

# /var/tmp/auto_sync.sh &

開機自動運作

# echo '/var/tmp/auto_sync.sh &' >> /etc/rc.local

總結:以上可以實作檔案的實時同步,如果兩端本來檔案不一緻,建議先使用rsync做一次完全的同步,因為本文章所寫的方法,隻對改變的檔案進行同步,而不會去掃描整個目錄。

如果要監控多個同一台機器上的多個目錄的改變,inotifywait也是支援的,多個目錄之間,用空格隔開即可。同步的時候,也是可以同步到多台伺服器的,<b>本文轉自 gm100861 51CTO部落格,原文連結:http://blog.51cto.com/gm100861/916246</b>