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開始引入,允許監控程序打開一個獨立文件描述符,並針對事件集監控一個或者多個文件,例如打開、關閉、移動/重命名、刪除、創建或者改變屬性。

三、實驗配置:

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  文件系統取消掛載,之後不再監聽此文件系統。


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