天天看點

rsync+inotify實作觸發式遠端實時同步

在Linux平台下我們可以利用2.6核心的inotify監控檔案系統機制,通過inotify-tools來實作實時同步了。

具體操作如下:

1.安裝所需軟體

目前各大Linux發行版本都已經具有了rsync與inotify-tools的軟體包,推薦通過RPM,yum,apt-get等方式進行安裝。

RHEL:

[root@server1 ~]# rpm -ivh rsync-*

[root@server1 ~]# rpm -ivh inotify-tools-*

CentOS:

[root@server1 ~]# yum install rsync inotify-tools

Ubuntu:

[root@server1 ~]# apt-get install rsync inotify-tools

采用源碼方式安裝的步驟如下:

[root@server1 ~]# wget ftp://ftp.samba.org/pub/rsync/rsync-3.0.8.tar.gz

[root@server1 ~]# tar xzvf rsync-3.0.8.tar.gz

[root@server1 ~]# cd rsync-3.0.8

[root@server1 ~]# ./configure

[root@server1 ~]# make

[root@server1 ~]# make install

[root@server1 ~]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

[root@server1 ~]# tar xzvf inotify-tools-3.14.tar.gz

[root@server1 ~]# cd inotify-tools-3.14

2.配置ssh key信任

建議通過普通使用者進行操作,理由是通過root操作本身就危險,免密碼登陸的root就更危險了。

在兩台伺服器上建立rsync使用者

[root@server1 ~]# useradd -m rsync

[root@server1 ~]# passwd rsync

[root@server2 ~]# useradd -m rsync

[root@server2 ~]# passwd rsync

[root@server1 ~]# su - rsync

[rsync@server1 ~]$ ssh-keygen -t rsa

在提示儲存私鑰(key)和公鑰(public key)的位置時,使用預設值;

在提示是否需要私鑰密碼(passphrase)時,直接敲回車,即不使用私鑰密碼。

之後,将生成一對密鑰,id_rsa(私鑰檔案)和id_rsa.pub(公鑰檔案),儲存在/home/rsync/.ssh/目錄下。

将公鑰添加到遠端主機的 authorized_keys 檔案中

将檔案上傳到遠端主機(假設遠端主機IP為192.168.10.4)

[rsync@server1 ~]$ scp ~/.ssh/id_rsa.pub [email protected]:/home/rsync/

使用rsync使用者SSH到登陸到遠端主機,并将公鑰添加到 authorized_keys 檔案中

[rsync@server2 ~]$ mkdir .ssh

[rsync@server2 ~]$ chmod 700 .ssh

[rsync@server2 ~]$ mv ~/id_rsa.pub ~/.ssh/authorized_keys

重新開機SSH服務

[root@server1 ~]# /etc/init.d/sshd restart

[root@server2 ~]# /etc/init.d/sshd restart

3.建立inotify_rsync.sh腳本

[root@server1 ~]# vim inotify_rsync.sh

1    #!/bin/sh

2    SRC=/home/rsync/test

3    [email protected]:/home/rsync/test

4    

5    /bin/su - rsync

6    /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${SRC} | while read D E F

7            do

8                    /usr/bin/rsync -ahqzt --delete $SRC $DST

9            done

相關注解如下:

/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${src}

-m 是保持一直監聽

-r 是遞歸檢視目錄

-q 是列印出事件

-e create,move,delete,modify,attrib 是指 “監聽 建立 移動 删除 寫入 權限” 事件

/usr/bin/rsync -ahqzt --delete $SRC $DST

-a 存檔模式

-h 儲存硬連接配接

-q 制止非錯誤資訊

-z 壓縮檔案資料在傳輸

-t 維護修改時間

-delete 删除于多餘檔案

要排除同步某個目錄時,為rsync添加--exculde=PATTERN參數,注意,路徑是相對路徑,具體檢視man rsync。

要排除某個目錄的事件監聽的處理時,為inotifywait添加--exclude或--excludei參數,具體檢視man inotifywait。

inotifywait 指令産生三個傳回值,分别是“日期,時間,檔案” 這3個傳回值會做為參數傳給read,是以腳本中的“while read D E F” 寫法細化了傳回值。

賦予腳本可執行權限

[root@server1 ~]# chmod +x inotify_rsync.sh

執行腳本

[root@server1 ~]# /root/inotify_rsync.sh &

設定腳本開機自啟動

[root@server1 ~]# cat "/root/inotify_rsync.sh &" >> /etc/rc.local

4.測試

首先在server1伺服器的/home/rsync/test目錄下建立檔案或目錄,然後再到server2的/home/rsync/test目錄下檢視,如果看到就說明成功了。

[rsync@server1 ~]$ cd test

[rsync@server1 test]$ touch a.txt

注意:第一次SSH連接配接的時候可能需要輸入一次密碼,之後就不需要輸入了。

[rsync@server2 ~]$ cd test

[rsync@server2 test]$ ls

a.txt

看到了a.txt檔案,說明檔案同步已經成功!

本文轉自Devin 51CTO部落格,原文連結:http://blog.51cto.com/devingeng/1290957

繼續閱讀