Rsync+inotify實現實時同步

若是有一天去接受面試:面試官問你一個1t的文件須要進行傳輸,問題用何種方法。假如你答了scp或者ftp。那麼你掛的概率是很大的html

1、inotify介紹

inotify-tools有兩個命令 //inotify-tools是用c編寫的,除了要求內核支持inotify外,不依賴於其餘。
inotifywait,是用來監控文件或目錄的變化
inotifywatch,是用來統計文件系統訪問的次數
inotify是一種強大的、細粒度的、異步的文件系統事件控制機制。linux內核從2.6.13起,加入了inotify支持,經過inotify能夠監控文件系統中添加、刪除、修改、移動等各類事件,利用這個內核接口,第三方軟件就能夠監控文件系統下文件的各類變化狀況,而inotify-tools正是實施監控的軟件。linux

一、inotify安裝和命令介紹

[root@localhost nginx]# yum install inotify-tools -y
/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib /data/
讓inotifywait監聽/data/目錄,當監聽到有發生modify,create,delete,attrib等事件發生時,按%Xe %w%f的格式輸出。在/data/目錄touch幾個文件nginx

-m :monitor
-r :遞歸
-q :Print less (only print events)
-qq :Print nothing (not even events). //除非是致命錯誤
-d :--daemon後臺運行,須要指定–outfile把事情輸出到一個文件。也意味着使用了–syslog。
-o|--outfile [file] :Print events to <file> rather than stdout.
-s|--syslog     Send errors to syslog rather than stderr.
–fromfile :Read files to watch from <file> or `-' for stdin.從文件讀取須要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。
@ :排除不須要監視的文件,能夠是相對路徑,也能夠是絕對路徑。
–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 
    %w 表示發生事件的目錄
    %f 表示發生事件的文件
    %e 表示發生的事件
    %Xe 事件以「X」分隔
    %T 顯示由–timefmt定義的時間格式

Exit status:
0 - An event you asked to watch for was received.
1 - An event you did not ask to watch for was received (usually delete_self or unmount), or some error occurred.
2 - The --timeout option was given and no events occurred in the specified interval of time.web

Events:
    access      file or directory contents were read
    modify      file or directory contents were written
    attrib      file or directory attributes changed 文件屬性更改,如權限,時間戳等。
    close_write file or directory closed, after being opened in writeable mode 以可寫模式打開的文件被關閉,不表明此文件必定已經寫入數據。
    close_nowrite   file or directory closed, after being opened in read-only mode 以只讀模式打開的文件被關閉。
    close       file or directory closed, regardless of read/write mode
    open        file or directory opened
    moved_to    file or directory moved to watched directory  一個文件或目錄移動到監聽的目錄,即便是在同一目錄內移動,此事件也觸發。
    moved_from  file or directory moved from watched directory 一個文件或目錄移出監聽的目錄,即便是在同一目錄內移動,此事件也觸發。 
    move        file or directory moved to or from watched directory 包括moved_to和 moved_from 
    create      file or directory created within watched directory 文件或目錄被移除,以後再也不監聽此文件或目錄。
    delete      file or directory deleted within watched directory 
    delete_self file or directory was deleted 文件或目錄移除,以後再也不監聽此文件或目錄
    unmount     file system containing file or directory unmounted 文件系統取消掛載,以後再也不監聽此文件系統。

二、inotifywatch命令介紹

inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
@ 排除不須要監視的文件,能夠是相對路徑,也能夠是絕對路徑。
–fromfile 從文件讀取須要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。
-z, –zero 輸出表格的行和列,即便元素爲空
–exclude 正則匹配須要排除的文件,大小寫敏感。
例:要排除/home/mjb目錄下的test1,test2,cc目錄,可這樣寫--exclude="/home/mjb/(test1/|test2/|cc/)"。多個目錄或文件必定要用「|」分開,不能在命令行中用兩個--exclude,不然最後的--exclude會覆蓋其它的。系統只是在文件路徑中查找是否有上面參數指定的字符,若是有就排除。所以在test1後面加了「/」。不然/home/mjb/test123也會被排除。
–excludei 正則匹配須要排除的文件,忽略大小寫。
-r,遞歸
-t,timeout
-e,event
-a , –ascending 以指定事件升序排列。
-d , –descending 以指定事件降序排列。面試

三、實驗

實時監控/home的全部事件(包括文件的訪問,寫入,修改,刪除等)// inotifywait -rm /home
統計/home文件系統的事件 //inotifywatch -v -e access -e modify -t 60 -r /home
監控/home/www目錄及其下子目錄
inotifywait -m -r -d -o /var/log/change.log –timefmt '%F %T’ –format '%T %w%f %e’ -e close_write,create /home/www 算法

2、Rsync簡介

Linux 主機之間即時傳送文件,scp命令你們都很熟悉
但當要傳送的文件較大,過程當中若是網絡中斷了,就比較悲劇了。這時候能夠考慮使用rsync命令替代scp,實現斷點續傳文件。
rsync在同步數據時,須要掃描全部文件後進行比對,進行差量傳輸。若是文件數量達到了百萬甚至千萬量級,掃描全部文件將是很是耗時的,而且正在發生變化的每每是其中不多的一部分,這是很是低效的方式。
rsync不能實時的去監測、同步數據,雖然它能夠經過linux守護進程的方式進行觸發同步,可是兩次觸發動做必定會有時間差,這樣就致使了服務端和客戶端數據可能出現不一致,沒法在應用故障時徹底的恢復數據。shell

一、優化inotify

[root@web ~]# ll /proc/sys/fs/inotify/
max_user_watches #設置inotifywait或inotifywatch命令能夠監視的文件數量(單進程)
max_user_instances #設置每一個用戶能夠運行的inotifywait或inotifywatch命令的進程數
max_queued_events #設置inotify實例事件(event)隊列可容納的事件數量
[root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_user_watches -- 把他加入/etc/rc.local就能夠實現每次重啓都生效
[root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_queued_eventsvim

二、Rsync命令格式使用

1 rsync [OPTION]... SRC DEST
2 rsync [OPTION]... SRC [USER@]HOST:DEST
3 rsync [OPTION]... [USER@]HOST:SRC DEST
4 rsync [OPTION]... [USER@]HOST::SRC DEST
5 rsync [OPTION]... SRC [USER@]HOST::DEST
6 rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]centos

對應於以上六種命令格式,rsync有六種不一樣的工做模式:
1)拷貝本地文件。當SRC和DES路徑信息都不包含有單個冒號」:」分隔符時就啓動這種工做模式。如:rsync -a /data /backup
2)使用一個遠程shell程序(如rsh、ssh)來實現將本地機器的內容拷貝到遠程機器。當DST路徑地址包含單個冒號」:」分隔符時啓動該模式。如:rsync -avz *.c foo:src
3)使用一個遠程shell程序(如rsh、ssh)來實現將遠程機器的內容拷貝到本地機器。當SRC地址路徑包含單個冒號」:」分隔符時啓動該模式。如:rsync -avz foo:src/bar /data
4)從遠程rsync服務器中拷貝文件到本地機。當SRC路徑信息包含」::」分隔符時啓動該模式。如:rsync -av root@172.16.78.192::www /databack
5)從本地機器拷貝文件到遠程rsync服務器中。當DST路徑信息包含」::」分隔符時啓動該模式。如:rsync -av /databack root@172.16.78.192::www
6)列遠程機的文件列表。這相似於rsync傳輸,不過只要在命令中省略掉本地機信息便可。如:rsync -v rsync://172.16.78.192/www
rsync參數的具體解釋以下:安全

-v, --verbose 詳細模式輸出
-q, --quiet 精簡輸出模式
-c, --checksum 打開校驗開關,強制對文件傳輸進行校驗
-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持全部文件屬性,等於-rlptgoD
-r, --recursive 對子目錄以遞歸模式處理
-R, --relative 使用相對路徑信息
-b, --backup 建立備份,也就是對於目的已經存在有一樣的文件名時,將老的文件從新命名爲~filename。可使用--suffix選項來指定不一樣的備份文件前綴。
--backup-dir 將備份文件(如~filename)存放在在目錄下。
-suffix=SUFFIX 定義備份文件前綴
-u, --update 僅僅進行更新,也就是跳過全部已經存在於DST,而且文件時間晚於要備份的文件。(不覆蓋更新的文件)
-l, --links 保留軟鏈結
-L, --copy-links 想對待常規文件同樣處理軟鏈結
--copy-unsafe-links 僅僅拷貝指向SRC路徑目錄樹之外的鏈結
--safe-links 忽略指向SRC路徑目錄樹之外的鏈結
-H, --hard-links 保留硬鏈結
-p, --perms 保持文件權限
-o, --owner 保持文件屬主信息
-g, --group 保持文件屬組信息
-D, --devices 保持設備文件信息
-t, --times 保持文件時間信息
-S, --sparse 對稀疏文件進行特殊處理以節省DST的空間
-n, --dry-run現實哪些文件將被傳輸
-W, --whole-file 拷貝文件,不進行增量檢測
-x, --one-file-system 不要跨越文件系統邊界
-B, --block-size=SIZE 檢驗算法使用的塊尺寸,默認是700字節
-e, --rsh=COMMAND 指定使用rsh、ssh方式進行數據同步
--rsync-path=PATH 指定遠程服務器上的rsync命令所在路徑信息
-C, --cvs-exclude 使用和CVS同樣的方法自動忽略文件,用來排除那些不但願傳輸的文件
--existing 僅僅更新那些已經存在於DST的文件,而不備份那些新建立的文件
--delete 刪除那些DST中SRC沒有的文件
--delete-excluded 一樣刪除接收端那些被該選項指定排除的文件
--delete-after 傳輸結束之後再刪除
--ignore-errors 及時出現IO錯誤也進行刪除
--max-delete=NUM 最多刪除NUM個文件
--partial 保留那些因故沒有徹底傳輸的文件,以是加快隨後的再次傳輸
--force 強制刪除目錄,即便不爲空
--numeric-ids 不將數字的用戶和組ID匹配爲用戶名和組名
--timeout=TIME IP超時時間,單位爲秒
-I, --ignore-times 不跳過那些有一樣的時間和長度的文件
--size-only 當決定是否要備份文件時,僅僅察看文件大小而不考慮文件時間
--modify-window=NUM 決定文件是否時間相同時使用的時間戳窗口,默認爲0
-T --temp-dir=DIR 在DIR中建立臨時文件
--compare-dest=DIR 一樣比較DIR中的文件來決定是否須要備份
-P 等同於 --partial {斷點傳輸} --progress {顯示備份過程}  
-z, --compress 對備份的文件在傳輸時進行壓縮處理
--exclude=PATTERN 指定排除不須要傳輸的文件模式
--include=PATTERN 指定不排除而須要傳輸的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 綁定到特定的地址
--config=FILE 指定其餘的配置文件,不使用默認的rsyncd.conf文件
--port=PORT 指定其餘的rsync服務端口
--blocking-io 對遠程shell使用阻塞IO
-stats 給出某些文件的傳輸狀態
--progress 在傳輸時現實傳輸過程
--log-format=formAT 指定日誌文件格式
--password-file=FILE 從FILE中獲得密碼
--bwlimit=KBPS 限制I/O帶寬,KBytes per second
-h, --help 顯示幫助信息

三、斷點重傳

測試客戶端執行報錯://遠程server到本地
[root@localhost data]# rsync -rP --rsh=ssh 192.168.154.139:test/a.big ./ //這樣訪問的是192.168.154.139的/root/test/a.big
The authenticity of host '192.168.154.139 (192.168.154.139)' can't be established.
RSA key fingerprint is ed:0b:47:d4:20:2b:21:89:b6:69:b2:b4:42:07:0f:df.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.154.139' (RSA) to the list of known hosts.
root@192.168.154.139's password:
receiving incremental file list
rsync: link_stat "/root/test/a.big" failed: No such file or directory (2)

正確的方法:

[root@localhost data]# rsync -rP --rsh=ssh 192.168.154.139::test/a.big ./
root@192.168.154.139's password: 
receiving incremental file list
a.big
     3604480   0%    3.08MB/s    0:05:39

    17629184   1%    7.93MB/s    0:02:09
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(546) [generator=3.0.6]
rsync error: received SIGUSR1 (code 19) at main.c(1285) [receiver=3.0.6]  //中斷了

[root@localhost data]# rsync -rP --rsh=ssh 192.168.154.139::test/a.big ./   //從新傳輸

[root@localhost ~]# rsync -rP --rsh=ssh /test/a.tmp 192.168.154.132:/home/admin  //傳輸本地的a.tmp到遠程機器上。以ssh的方式
[root@localhost ~]# rsync -avzrP /tmp/bigfile cnangel@10.1.6.160:/tmp/bigfile  //a:歸檔,v:詳細顯示,z:壓縮,P:顯示過程和斷點傳輸,r:遞歸,

3、Rsync+inotify組合

一、簡單rsync+intofy組合

#!/bin/bash
/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /backup |while read file
#把發生更改的文件列表都接收到file 而後循環,但有什麼鬼用呢?下面的命令都沒有引用這個$file 下面作的是全量rsync
do
cd /backup && rsync -az --delete /backup/ rsync_backup@192.168.24.101::backup/--password-file=/etc/rsync.password
done
這裏的rsync 每次都是全量的同步(這就坑爹了),並且 file列表是循環形式觸發rsync ,等於有10個文件發生更改,就觸發10次rsync全量同步(簡直就是噩夢),那還不如直接寫個死循環的rsync全量同步得了。

二、優化後的方法:

#!/bin/bash
src=/data/                           # 須要同步的源路徑
des=data                             # 目標服務器上 rsync --daemon 發佈的名稱,rsync --daemon這裏就不作介紹了,網上搜一下,比較簡單。
rsync_passwd_file=/etc/rsyncd.passwd            # rsync驗證的密碼文件
ip1=192.168.0.18                 # 目標服務器1
ip2=192.168.0.19                 # 目標服務器2
user=root                            # rsync --daemon定義的驗證用戶名
cd ${src}                            
# 此方法中,因爲rsync同步的特性,這裏必需要先cd到源目錄,inotify再監聽 ./ 才能rsync同步後目錄結構一致,有興趣的同窗能夠進行各類嘗試觀看其效果
/usr/local/bin/inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
# 把監控到有發生更改的"文件路徑列表"循環
do
    INO_EVENT=$(echo $file | awk '{print $1}')      # 把inotify輸出切割 把事件類型部分賦值給INO_EVENT
    INO_FILE=$(echo $file | awk '{print $2}')       # 把inotify輸出切割 把文件路徑部分賦值給INO_FILE
    echo "-------------------------------$(date)------------------------------------"
    echo $file
    #增長、修改、寫入完成、移動進事件
    #增、改放在同一個判斷,由於他們都確定是針對文件的操做,即便是新建目錄,要同步的也只是一個空目錄,不會影響速度。
    if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         # 判斷事件類型
    then
        echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
        rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
# INO_FILE變量表明路徑哦  -c校驗文件內容
                rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
#仔細看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})變量 即每次只針對性的同步發生改變的文件的目錄(只同步目標文件的方法在生產環境的某些極端
#環境下會漏文件 如今能夠在不漏文件下也有不錯的速度 作到平衡)
#而後用-R參數把源的目錄結構遞歸到目標後面 保證目錄結構一致性
    fi
    #刪除、移動出事件
    if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
    then
        echo 'DELETE or MOVED_FROM'
        rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
        rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
#看rsync命令 若是直接同步已刪除的路徑${INO_FILE}會報no such or directory錯誤 因此這裏同步的源是被刪文件或目錄的上一級路徑
#並加上--delete來刪除目標上有而源中沒有的文件,這裏不能作到指定文件刪除,若是刪除的路徑越靠近根,則同步的目錄月多,同步刪除的操做就越花時間。
#這裏有更好方法的同窗,歡迎交流。
    fi
    #修改屬性事件 指 touch chgrp chmod chown等操做
    if [[ $INO_EVENT =~ 'ATTRIB' ]]
    then
        echo 'ATTRIB'
        if [ ! -d "$INO_FILE" ]
# 若是修改屬性的是目錄 則不一樣步,由於同步目錄會發生遞歸掃描,等此目錄下的文件發生同步時,rsync會順帶更新此目錄。
        then
            rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&         
            rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
        fi
    fi
done

###三、結合crontab
由於inotify只在啓動時會監控目錄,他沒有啓動期間的文件發生更改,他是不知道的,因此這裏每2個小時作1次全量同步,防止各類意外遺漏,保證目錄一致。
crontab -e

* */2 * * * rsync -avz --password-file=/etc/rsync-client.pass /data/ root@192.168.0.18::data && rsync -avz --password-file=/etc/rsync-client.pass /data/ root@192.168.0.19::data

4、實驗

實驗一:rsync+inotify實驗簡單版

server:192.168.154.139 //CentOS7
client;192.168.154.132 //CentOS6

一、Server端配置

[root@localhost data]# systemctl start rsyncd
[root@localhost data]# systemctl enable rsyncd
默認監聽端口873
[root@localhost ~]# vim /etc/rsyncd.conf
[test]
path = /test
auth user = user1
secrets file = /etc/rsyncd.secrets
[root@localhost ~]#
[root@localhost ~]# systemctl restart rsyncd
[root@localhost ~]# vim /etc/rsyncd.secrets
wolf:wolf
[root@localhost ~]# chmod 600 /etc/rsyncd.secrets
[root@localhost ~]# touch /test/file{1..10}

二、客戶端測試

[root@localhost test]# rsync -a 192.168.154.139::
test
[root@localhost test]# rsync -av wolf@192.168.154.139::test /tmp/test/mm/
receiving incremental file list
./
file1
file10
file2
file3
file4
file5
file6
file7
file8
file9

sent 219 bytes received 524 bytes 1486.00 bytes/sec
total size is 0 speedup is 0.00
[root@localhost data]# rsync -a 192.168.154.139::test/file1 ./ //傳輸單個文件
注意:此時假如在192.168.154.139上刪除file1-10,從新執行上面的命令,不會在本地刪除原有的file1-10

三、經過inotify+rsync架構實現實時同步

要求server主機上面的/data目錄發生新的建立,刪除,移動,以及文件屬性信息改變時,自動同不到client主機的/tmp/test/mm目錄
server端設置:
[root@localhost ~]# cat 1.sh
#!/bin/bash
inotifywait -mrq -e modify,create,move,delete,attrib /data |while read events
do
rsync -a --delete /data 192.168.154.132::test
echo "date +'%F %T' 出現事件 $events" >>/tmp/rsync.log 2>&1
done
[root@localhost ~]# ls /data
aa bb cc dd

Client端設置:
[root@localhost ~]# cat /etc/rsyncd.conf //CentOS6默認沒有這個文件,須要手動建立
[test]
path = /tmp/test/mm
read only = false
uid = root
gid = root
[root@localhost ~]# mkdir /test/test/mm
[root@localhost ~]# service restart xinetd

測試:
[root@localhost ~]# nohup sh /tmp/1.sh & //server上執行
[root@localhost ~]# echo haha >>/data/aa
[root@localhost ~]# cat /tmp/rsync.log
[root@localhost ~]#

[root@localhost ~]# ls /tmp/test/mm //client上查看是否生成文件

實驗二:rsync+inotify升級

一、部署inotify-Slave

[root@inotify-slave ~]# yum install rsync
[root@inotify-slave ~]# useradd -s /bin/nologin -M rsync
[root@inotify-slave ~]# mkdir /mydata/ ##建立rsync工做模式的模塊目錄
[root@inotify-slave ~]# chown rsync.rsync /mydata/ ##更改屬主、主組;使rsync用戶有權限更改數據
[root@inotify-slave ~]# vim /etc/rsync.password
[root@inotify-slave ~]# chmod 600 /etc/rsync.password ##爲密碼文件增長安全性
[root@inotify-slave ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
user chroot = no
max connections = 200
timeout = 300
read only = no
[rsync] ##定義模塊名,名字可隨意
path = /mydata ##指定rsync用戶的模塊目錄
auth users = linuxidc ##指定虛擬用戶名
secrets file = /etc/rsync.password ##指定虛擬用戶的密碼文件路徑
ignore errors ##表示忽略錯誤
[root@inotify-slave ~]# rsync --daemon --config=/etc/rsyncd.conf ##rsync監聽在tcp協議的873端口
[root@inotify-slave ~]# ps aux | grep rsync
root 1330 0.0 0.0 114640 328 ? Ss 21:13 0:00 rsync --daemon --config=/etc/rsyncd.conf
root 1338 0.0 0.1 112644 952 pts/0 R+ 21:13 0:00 grep --color=auto rsync

配置虛擬用戶的密碼文件
[root@inotify-master ~]# echo "linux" > /etc/rsync.password
[root@inotify-master ~]# cat /etc/rsync.password
linux ##注意:只須要寫出虛擬用戶的密碼;不用寫出用戶名
[root@inotify-master ~]# chmod 600 /etc/rsync.password
[root@inotify-master ~]# ls -ld /etc/rsync.password
[root@inotify-master ~]# echo "Hello Word" > linuxidc.txt
[root@inotify-master ~]# rsync -avz linuxidc.txt lweim@172.18.42.200::rsync --password-file=/etc/rsync.password
sending incremental file list
linuxidc.txt

sent 81 bytes received 27 bytes 216.00 bytes/sec
total size is 11 speedup is 0.10

檢查inotify-slave的工做模塊目錄
[root@inotify-slave ~]# ll /mydata/
total 4
-rw-r--r-- 1 rsync rsync 11 May 19 21:21 linuxidc.txt
[root@inotify-slave ~]# cat /mydata/linuxidc.txt
Hello Word ##推送成功

二、部署rsync-master

[root@inotify-master ~]# yum install inotify-tools-3.13.tar
[root@inotify-master ~]# vim inotify.sh

#!/bin/bash
host=172.18.42.200  ##指明inotify-slave的ip地址
src=/www/linuxidc    ##本機監控的目錄,可隨意定義
dst=rsync      ##inotify-slave的rsync用戶的模塊目錄
user=linuxidc      ##虛擬用戶的用戶名
passfile=/etc/rsync.password  ##調用本地的密碼文件
inotify_home=/usr/local/inotify  ##指明inotify的安裝目錄

if [ ! -e "$src" ] || [ ! -e "${inotify_home}/bin/inotifywait" ] || [ ! -e "/usr/bin/rsync" ] || [ ! -e "/etc/rsync.password" ]; then
#if  [ ! -e "${inotify_home}/bin/inotifywait" ] || [ ! -e "/usr/bin/rsync" ] || [ ! -e "/etc/rsync.password" ]; then
echo "Check File and Folder"
exit 1
fi

${inotify_home}/bin/inotifywait -mrq -e close_write,delete,create,attrib $src | while read file
do
cd $src && rsync -arvz -P ./ --timeout=100 $user@$host::$dst --password-file=$passfile &>/dev/null
done
exit 0

執行inotify-master上的inotify.sh腳本
[root@inotify-master ~]# bash inotify.sh ##運行腳本

在inotify-master本機監控的目錄下建立文件
[root@inotify-master linuxidc]# pwd
/www/linuxidc
[root@inotify-master linuxidc]# touch a aa aaa aaaa
[root@inotify-master linuxidc]# ll
total 0
-rw-r--r-- 1 root root 0 May 19 22:54 a
-rw-r--r-- 1 root root 0 May 19 22:54 aa
-rw-r--r-- 1 root root 0 May 19 22:54 aaa
-rw-r--r-- 1 root root 0 May 19 22:54 aaaa

在inotify-slave的rsync工做模塊目錄下查看
[root@inotify-slave mydata]# ll
total 0
-rw-r--r-- 1 rsync rsync 0 May 19 22:54 a
-rw-r--r-- 1 rsync rsync 0 May 19 22:54 aa
-rw-r--r-- 1 rsync rsync 0 May 19 22:54 aaa
-rw-r--r-- 1 rsync rsync 0 May 19 22:54 aaaa
[root@inotify-slave mydata]# pwd
/mydata

5、常見問題

如下是爲配置rsync時的常見問題:

問題一:
@ERROR: chroot failed
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]

緣由:
服務器端的目錄不存在或無權限,建立目錄並修正權限可解決問題。

問題二:
@ERROR: auth failed on module tee
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]

緣由:
服務器端該模塊(tee)須要驗證用戶名密碼,但客戶端沒有提供正確的用戶名密碼,認證失敗。
提供正確的用戶名密碼解決此問題。

問題三:
@ERROR: Unknown module ‘tee_nonexists'
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]

緣由:
服務器不存在指定模塊。提供正確的模塊名或在服務器端修改爲你要的模塊以解決問題。

問題1:
在client上遇到問題:
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.133.128::backup /home/
rsync: could not open password file "/etc/rsync.pas": No such file or directory (2)
Password:
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到這個問題:client端沒有設置/etc/rsync.pas這個文件,而在使用rsync命令的時候,加了這個參數--
password-file=/etc/rsync.pas

問題2:
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.133.128::backup /home/
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到這個問題:client端已經設置/etc/rsync.pas這個文件,裏面也設置了密碼111111,和服務器一致,可是
服務器段設置有錯誤,服務器端應該設置/etc/rsync.pas ,裏面內容root:111111 ,這裏登錄名不可缺乏

問題3:
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.133.128::backup /home/
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到這個問題,是由於服務器端的/home/backup 其中backup這個目錄並無設置,因此提示:chdir failed

問題4:
rsync: write failed on "/home/backup2010/wensong": No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(302) [receiver=3.0.7]
rsync: connection unexpectedly closed (2721 bytes received so far) [generator]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [generator=3.0.7]
磁盤空間不夠,因此沒法操做。
能夠經過df /home/backup2010 來查看可用空間和已用空間

問題5:網絡收集問題
一、權限問題
相似以下的提示:rsync: opendir "/kexue" (in dtsChannel) failed: Permission denied (13)注意查看同步的目錄權限是否爲755
二、time out
rsync: failed to connect to 203.100.192.66: Connection timed out (110)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]
檢查服務器的端口netstat –tunlp,遠程telnet測試。
可能由於客戶端或者服務端的防火牆開啓 致使沒法通訊,能夠設置規則放行 rsync(873端口) 或者直接關閉防火牆。

還有一種在同步過程當中可能會提示沒有權限 (將同步目錄加上SvcwRsync所有權限便可,更簡單的方法就是將SvcwRsync設爲管理員便可)

三、服務未啓動
rsync: failed to connect to 10.10.10.170: Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]
啓動服務:rsync --daemon --config=/etc/rsyncd.conf
四、磁盤空間滿
rsync: recv_generator: mkdir "/teacherclubBackup/rsync……" failed: No space left on device (28)
Skipping any contents from this failed directory
五、Ctrl+C或者大量文件
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(544) [receiver=3.0.5]
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(544) [generator=3.0.5]
說明:致使此問題多半是服務端服務沒有被正常啓動,到服務器上去查查服務是否有啓動,而後查看下 /var/run/rsync.pid 文件是否存在,最乾脆的方法是殺死已經啓動了服務,而後再次啓動服務或者讓腳本加入系統啓動服務級別而後shutdown -r now服務器

六、xnetid啓動
rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(759) [receiver=3.0.5]
查看rsync日誌
rsync: unable to open configuration file "/etc/rsyncd.conf": No such file or directory
xnetid查找的配置文件位置默認是/etc下,根據具體狀況建立軟連接。例如:
ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf
或者更改指定默認的配置文件路徑,在/etc/xinetd.d/rsync配置文件中。
Rsync configure:
配置一:
ignore errors
說明:這個選項最好加上,不然再不少crontab的時候每每發生錯誤你也未可知,由於你不可能每天去看每時每刻去看log,不加上這個出現錯誤的概率相對會很高,由於任何大點的項目和系統,磁盤IO都是一個瓶頸

Rsync error:
錯誤一:
@ERROR: auth failed on module xxxxx
rsync: connection unexpectedly closed (90 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
說明:這是由於密碼設置錯了,沒法登入成功,檢查一下rsync.pwd,看客服是否匹配。還有服務器端沒啓動rsync 服務也會出現這種狀況。
錯誤二:
password file must not be other-accessible
continuing without password file
Password:
說明:這是由於rsyncd.pwd rsyncd.sec的權限不對,應該設置爲600。如:chmod 600 rsyncd.pwd
錯誤三:
@ERROR: chroot failed
rsync: connection unexpectedly closed (75 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
說明:這是由於你在 rsync.conf 中設置的 path 路徑不存在,要新建目錄才能開啓同步
錯誤四:
rsync: failed to connect to 218.107.243.2: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=2.6.9]
說明:防火牆問題致使,這個最好先完全關閉防火牆,排錯的基本法就是這樣,不管是S仍是C,還有ignore errors選項問題也會致使

錯誤五:
@ERROR: access denied to www from unknown (192.168.1.123)
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(359)
說明:此問題很明顯,是配置選項host allow的問題,初學者喜歡一個容許段作成一個配置,而後模塊又是同一個,導致致使
錯誤六:
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(244) [generator=2.6.9]
rsync error: received SIGUSR1 (code 19) at main.c(1182) [receiver=2.6.9]
說明:致使此問題多半是服務端服務沒有被正常啓動,到服務器上去查查服務是否有啓動,而後查看下 /var/run/rsync.pid 文件是否存在,最乾脆的方法是殺死已經啓動了服務,而後再次啓動服務或者讓腳本加入系統啓動服務級別而後shutdown -r now服務器
錯誤七:
rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(604) [sender=2.6.9]
說明:原數據目錄裏沒有數據存在

參考博客:
https://www.centos.bz/2012/06/inotify-tools-introduction/
https://blog.csdn.net/birdie_l/article/details/78189064
http://www.javashuo.com/article/p-fqycycvc-ew.html
http://man.linuxde.net/inotifywait
https://www.linuxidc.com/Linux/2016-08/134027.htm

相關文章
相關標籤/搜索