一、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開始引入,允許監控程序打開一個獨立文件描述符,並針對事件集監控一個或者多個文件,例如打開、關閉、移動/重命名、刪除、創建或者改變屬性。
三、實驗配置:
1、服務端安裝並配置rsync
[root@server ~]# yum -y install rsync #安裝rsync,默認情況下已經安裝
[root@server ~]# vim /etc/rsyncd.conf #編輯rsync配置文件
pid file = /var/run/rsyncd.pid #pid文件的存放位置
lock file = /var/run/rsync.lock #支持max connections參數的鎖文件
port = 873 #監聽端口
address = 192.168.192.130 #rsyncd服務監聽端口
uid = root #設置rsync運行用戶權限爲root
gid = root #設置rsync運行組權限爲root
use chroot = yes #默認爲true,修改爲false,增加對目錄文件軟連接的備份
read only = no #是否設置rsync服務端文件爲只讀權限
hosts allow = 192.168.0.0/16 #允許進行數據同步的客戶端IP地址,可以設置多個,用英文狀態下逗號隔開
hosts deny = * #禁止數據同步的客戶端IP地址,可以設置多個
max connections = 5 #最大連接數
#motd file = /etc/rsyncd.motd #啓動時歡迎信息頁面文件位置(文件內容自定義)
log file = /var/log/rsyncd.log #日誌文件位置,啓動rsync後自動產生這個文件,無需提前創建
log format = %t %a %m %f %b #日誌格式
syslog facility = local3 #日誌級別{系統日誌}
timeout = 300 #設置超時時間
[postgres] #定義模板,自定義名稱
path = /data/rsync #rsync服務端數據目錄路徑,自定義
list = yes #顯示rsync服務端資源列表
ignore errors #忽略錯誤
#auth users = backuser #執行數據同步的用戶名,可以設置多個,用英文狀態下逗號隔開(如果是匿名備份,可註釋)
#secrets file = /etc/rsyncd.secrets #用戶認證配置文件,裏面保存用戶名稱和密碼
comment = this is pgsql xlog arive #模塊名稱信息
#exclude = arch #同步時所保留archive_status目錄或文件
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 #指定類型的文件不在壓縮傳輸
[root@server ~]# mkdir /rsydata #創建備份目錄
[root@server ~]# vim /etc/rsync.password #編輯用戶認證配置文件
backuser:redhat #格式: 用戶名:密碼
[root@server ~]# chmod 600 /etc/rsync.password #一定要把用戶認證配置文件的權限改成600
[root@server ~]# vi /etc/rsyncd.motd
------------welcome use rsyncd backup data----------
[root@server ~]# /usr/bin/rsync --daemon & #後臺運行rsync服務
[root@server ~]# systemctl enable rsyncd.service #設置rsync服務開機自啓
[root@server ~]# firewall-cmd --permanent --add-port=873/tcp #配置防火牆
[root@server ~]# firewall-cmd --reload
2、客戶端配置
[root@client ~]# yum -y install rsync #安裝rsync軟件包。提供rsync客戶端相關命令
[root@client test]# touch {1..9} #在測試目錄創建測試文件/data/test
[root@client test]# ls
1 2 3 4 5 6 7 8 9
[root@client test]# rsync -azv /data/test/ 192.168.192.130::postgres #使用rsync客戶端命令執行手動同步
------------welcome use rsyncd backup data---------- #服務端設置的歡迎語
sending incremental file list
./
1
2
3
4
5
6
7
8
9
sent 407 bytes received 182 bytes 1178.00 bytes/sec
total size is 0 speedup is 0.00
命令選項註釋:
-a #歸檔模式備份,相當於-rlptgoD的組合
-v #在終端顯示同步過程的詳細信息
-z #壓縮傳輸
/data/test #本地文件位置
192.168.192.130::postgres #rsync命令格式。服務器::模塊名稱
更多註釋:
-r #遞歸模式,包含目錄及子目錄的所有文件
-l #對於符號鏈接文件仍復製爲符號鏈接文件
-p #保留文件的權限標記
-t #保留文件的時間標記
-H #保留硬鏈接文件
-A #保留ACL屬性信息
-D #保留設備文件及其他特殊文件
--delete #使備份服務器文件與本地文件保持一直
--checksum #根據校驗和(而不是文件大小、修改時間)來決定是否跳過該文件
3、客戶端配置inotify實時同步
[root@client ~]# yum -y install inotify-tools #安裝inotify-tools,提供inotify相關命令 inotifywait、inotifywatch
編寫inotify腳本:
[root@client ~]# vi inotify.sh
#!/bin/bash
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e create /var/lib/pgsql/bac kups/ | while read file
do
DATE=`date +%Y%m%d%H%M%S`
event=$(echo $file | awk '{print $3}')
echo "------------$DATE-------------"
if [[ $event =~ 'CREATE' ]] ; then
/usr/bin/rsync -avzP --progress /var/lib/pgsql/backups/ 192.168.192.134::postgres &>> /var/log/r sync/rsync-$DATE.log
fi
done
[root@client ~]# chmod +x inotify.sh #添加腳本的執行權限
[root@client ~]# sh inotify.sh & #讓腳本在後臺終端運行
[1] 2631
[root@client ~]# echo "/root/inotify.sh" >> /etc/rc.local #將腳本添加到開機執行的文件中
4、創建文件進行測試
[root@client test]# touch test{1..5} #創建測試文件
------------welcome use rsyncd backup data---------- #腳本自動在此終端輸出內容
sending incremental file list
./
test1
test2
test3
test4
test5
sent 228 bytes received 8 bytes 472.00 bytes/sec
total size is 1088 speedup is 4.61
5、防止inotify異常運行,編寫檢測腳本
[root@client ~]# vi inotify_status.sh
#!/bin/bash
ps -ef | grep -w inotify.sh | grep -v $$
if [ $? -eq 0 ]
then
echo "inotify service is running"
else
/root/inotify.sh &
echo "inotify service is activing"
fi
[root@client ~]# crontab -e #編寫計劃任務,每分鐘檢測一遍服務的運行情況
*/1 * * * * /root/inotify_status.sh
四、附加選項
參數說明
語法: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 文件系統取消掛載,之後不再監聽此文件系統。