通過rsync+inotify-tools+ssh實現觸發式遠程實時同步

通過rsync+inotify-tools+ssh實現觸發式遠程實時同步


文件的同步鏡像在很多地方都需要用到,因此rsync這款免費軟件得到了廣泛的應用,包括在Windows平臺上,都已經有了支持rsync的“cwRsyncServer”。
但是,我們一般都是通過結合crontab計劃任務來實現文件同步的,這樣做的缺點是效率低,不能做到實時同步。
現在,在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
[root@server1 ~]# ./configure
[root@server1 ~]# make
[root@server1 ~]# make install
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
#!/bin/sh
SRC=/home/rsync/test
[email protected]:/home/rsync/test
/bin/su - rsync
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${src} | while D E F
        do
                /usr/bin/rsync -ahqzt --delete $SRC $DST
        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文件,說明文件同步已經成功!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章