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_to和moved_from
move_self 文件或目錄被移除,之後不再監聽此文件或目錄。
create 文件或目錄創建
delete 文件或目錄刪除
delete_self 文件或目錄移除,之後不再監聽此文件或目錄
unmount 文件系統取消掛載,之後不再監聽此文件系統。