在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