rsync+inotify實現數據自動同步

rsync+inotify

rsync簡介

rsync是一個遠程數據同步工具,可通過lan/wan快速同步多臺主機間的文件。它使用所謂的“rsync演算法”來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快。所以通常可以作爲備份工具來使用。

運行rsync server的機器也叫backup server,一個rsync server可同時備份多個client的數據;也可以多個rsync server備份一個client的數據。rsync可以搭配ssh甚至使用daemon模式。rsync server會打開一個873的服務通道(port),等待對方rsync連接。連接時,rsync server會檢查口令是否相符,若通過口令查覈,則可以開始進行文件傳輸。第一次連通完成時,會把整份文件傳輸一次,下一次就只傳送二個文件之間不同的部份。

 

inotify介紹

inotify是一種強大的、細粒度的、異步的文件系統事件監控機制,Linux內核從2.6.13開始引入,允許監控程序打開一個獨立文件描述符,並針對事件集監控一個或者多個文件,例如打開、關閉、移動/重命名、刪除、創建或者改變屬性。

 

實驗


拓撲



服務器端(數據接收方)的配置


[root@backupserver ~]# vim /etc/sysconfig/selinux     #關閉selinux

SELINUX=disabled

[root@backupserver ~]#reboot   #重啓

[root@backupserver ~]# yum -y install rsync  #安裝rsync,默認情況下已經安裝

[root@backupserver ~]# vim /etc/rsyncd.conf  #編輯rsync配置文件

log file = /var/log/rsyncd.log  #日誌文件位置,啓動rsync後自動產生這個文件,無需提前創建

pid file = /var/run/rsyncd.pid   #pid文件的存放位置

lock file = /var/run/rsync.lock   #支持max connections參數的鎖文件

secrets file = /etc/rsync.password   #用戶認證配置文件,裏面保存用戶名稱和密碼

motd file = /etc/rsyncd.motd    #啓動時歡迎信息頁面文件位置(文件內容自定義)

[web_log]   #定義模板,自定義名稱

path = /rsydata/   #rsync服務端數據目錄路徑,自定義

comment = web_log   #模塊名稱與[web_log]自定義名稱相同

uid = root   #設置rsync運行權限爲root

gid = root   #設置rsync運行權限爲root

port=873    #默認端口

use chroot = false   #默認爲true,修改爲false,增加對目錄文件軟連接的備份

read only = false    #設置rsync服務端文件爲只讀權限

list = false   #不顯示rsync服務端資源列表

max connections = 200   #最大連接數

timeout = 600    #設置超時時間

auth users = backuser   #執行數據同步的用戶名,可以設置多個,用英文狀態下逗號隔開

hosts allow = ip地址    #允許進行數據同步的客戶端IP地址,可以設置多個,用英文狀態下逗號隔開

hosts deny = IP地址   #禁止數據同步的客戶端IP地址,可以設置多個

[root@backupserver ~]# mkdir /rsydata   #創建備份目錄

[root@backupserver ~]# vim /etc/rsync.password  #編輯用戶認證配置文件

backuser:redhat

root@backupserver ~]# chmod 600 /etc/rsync.password   #一定要把用戶認證配置文件的權限改成600

[root@backupserver ~]# /usr/bin/rsync --daemon &   #後臺運行rsync服務

[1] 3392

[root@backupserver ~]# systemctl enable rsyncd.service   #設置rsync服務開機自啓

[root@backupserver ~]# firewall-cmd --permanent --add-port=873/tcp   #配置防火牆

[root@backupserver ~]# firewall-cmd --reload

 

客戶端(數據發送方)的配置


[root@backupclient ~]# yum -y install rsync   #安裝rsync,默認情況下已經安裝

[root@backupclient ~]# vim /etc/rsync.password  #編輯認證文件,只保存密碼

redhat

[root@backupclient ~]# chmod 600 /etc/rsync.password  #一定要把認證文件權限修改成600

[root@backupclient~]#wget

http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz   #下載inotify源碼包

[root@backupclient ~]# tar -xzvf inotify-tools-3.14.tar.gz -C /usr/local/  #解壓到/usr/logcal目錄

[root@backupclient ~]# mkdir /usr/local/inotify  #創建安裝目錄

[root@backupclient ~]# cd /usr/local/inotify-tools-3.14/

[root@backupclient inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify  #指定安裝目錄爲/usr/local/inotify

[root@backupclient inotify-tools-3.14]# make &&make install  #編譯安裝

[root@backupclient ~]# systemctl restart rsyncd

[root@backupclient ~]# systemctl enable rsyncd


測試驗證

[root@backupclient ~]# mkdir /tmp/test

[root@backupclient ~]# cd /tmp/test

[root@backupclient test]# touch a{1..9}

[root@backupclient test]# ls

a1  a2  a3  a4  a5  a6  a7  a8  a9

[root@backupclient~]#rsync -vzrtopg --progress /tmp/test/ [email protected]::web_log --password-file=/etc/rsync.password#把客戶端/tmp/test目錄下的文件同步到服務器端的/rsydata目錄下

[root@backupserver ~]# cd /rsydata/

[root@backupserver rsydata]# ls

a1  a2  a3  a4  a5  a6  a7  a8  a9  #數據已經同步

 

寫一個腳本實現當客戶端/tmp/test/下的文件有變化時,把此目錄下的數據自動同步到服務器端的/rsydata

[root@backupclient ~]# vim inotify.sh

#!/bin/bash

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib /tmp/test | while read file

do

/usr/bin/rsync -vzrtopg --delete /tmp/test/ [email protected]::web_log --password-file=/etc/rsync.password

echo "${files} was rsynced" >> /var/log/rsync.log 2>&1

done

[root@backupclient ~]# chmod +x inotify.sh

[root@backupclient ~]# sh inotify.sh &  #後臺運行腳本

[1] 15435

[root@backupclient ~]# jobs   #查看後臺作業

[1]+  Running                 sh inotify.sh &

[root@backupclient ~]# echo "/root/inotify.sh" >> /etc/rc.local  #把腳本寫到開機自啓動文件裏面


爲了防止inotify服務由於意外情況停止服務,編寫監控inotify進程的腳本

[root@backupclient ~]# vim /root/inotify_status.sh

#!/bin/bash

ps -elf | grep inotify &> /dev/null

if [ -z $? ]

   then

       echo "inotify service is running"

   else

       /root/inotify.sh &

       echo "inotify service is activing"

fi

[root@backupclient ~]# chmod +x /root/inotify_status.sh

[root@backupclient ~]# crontab -e   #編寫一個計劃任務,每時每刻執行這個腳本

* * * * * /root/inotify_status.sh & > /dev/null

 

附:

 

參數說明

語法:inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]

-h,–help
輸出幫助信息
@
排除不需要監視的文件,可以是相對路徑,也可以是絕對路徑。
–fromfile 
從文件讀取需要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。
-m, –monitor
接收到一個事情而不退出,無限期地執行。默認的行爲是接收到一個事情後立即退出。
-d, –daemon
–monitor一樣,除了是在後臺運行,需要指定–outfile把事情輸出到一個文件。也意味着使用了–syslog
-o, –outfile 
輸出事情到一個文件而不是標準輸出。
-s, –syslog
輸出錯誤信息到系統日誌
-r, –recursive
監視一個目錄下的所有子目錄。
-q, –quiet
指定一次,不會輸出詳細信息,指定二次,除了致命錯誤,不會輸出任何信息。
–exclude 
正則匹配需要排除的文件,大小寫敏感。
–excludei 
正則匹配需要排除的文件,忽略大小寫。
-t , –timeout 
設置超時時間,如果爲0,則無限期地執行下去。
-e , –event 
指定監視的事件。
-c, –csv
輸出csv格式。
–timefmt 
指定時間格式,如(“%”後面的大小寫代表不同的格式,如%y表示2位的年)

    %Y-%M-%D 日期:2012-10-13

    %H:%M:%S 時間:15:45:05

 是否顯示該參數指定的時間,取決於–format選項中是否指定了“%T”
–format 
指定輸出格式。
%w 表示發生事件的目錄
%f 表示發生事件的文件
%e 表示發生的事件
%Xe 事件以“X”分隔
%T 顯示由–timefmt定義的時間格式

 

參數說明

語法:inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
參數:
-h, –help
輸出幫助信息
-v, –verbose
輸出詳細信息
@
排除不需要監視的文件,可以是相對路徑,也可以是絕對路徑。
–fromfile 
從文件讀取需要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。
-z, –zero
輸出表格的行和列,即使元素爲空
–exclude 
正則匹配需要排除的文件,大小寫敏感。
例:要排除/home/mjb目錄下的test1,test2,cc目錄,可這樣寫--exclude="/home/mjb/(test1/|test2/|cc/)"。多個目錄或文件一定要用“|”分開,不能在命令行中用兩個--exclude,否則最後的--exclude會覆蓋其它的。系統只是在文件路徑中查找是否有上面參數指定的字符,如果有就排除。因此在test1後面加了“/”。否則/home/mjb/test123也會被排除。
–excludei 
正則匹配需要排除的文件,忽略大小寫。
-r, –recursive
監視一個目錄下的所有子目錄。
-t , –timeout 
設置超時時間
-e , –event 
只監聽指定的事件。
-a , –ascending 
以指定事件升序排列。
-d , –descending 
以指定事件降序排列。

可監聽事件
access 文件讀取 
modify 文件更改。 
attrib  文件屬性更改,如權限,時間戳等。 
close_write 以可寫模式打開的文件被關閉,不代表此文件一定已經寫入數據。  
close_nowrite  以只讀模式打開的文件被關閉。  
close  文件被關閉,不管它是如何打開的。 
open  文件打開。 
moved_to  一個文件或目錄移動到監聽的目錄,即使是在同一目錄內移動,此事件也觸發。 
moved_from 一個文件或目錄移出監聽的目錄,即使是在同一目錄內移動,此事件也觸發。  
move  包括moved_tomoved_from  
move_self 文件或目錄被移除,之後不再監聽此文件或目錄。  
create  文件或目錄創建 
delete  文件或目錄刪除 
delete_self  文件或目錄移除,之後不再監聽此文件或目錄 
unmount  文件系統取消掛載,之後不再監聽此文件系統。 


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