rsync & inotify

rsync 簡介node

Rsync(remote synchronize)是一個遠程數據同步工具,可經過LAN/WAN快速同步多臺主機間的文件,也可使用 Rsync 同步本地硬盤中的不一樣目錄。 
  Rsync 是用於取代rcp的一個工具,Rsync使用所謂的 「Rsync  quick check算法」 來使本地和遠程兩個主機之間的文件達到同步。
這個算法只傳送兩個文件的不一樣部分(同步大小或者最後修改時間發生變化的文件或目錄,也能夠根據權限、屬主等屬性的變化),而不是每次都整份傳送(即增量),所以速度至關快。   Rsync支持大多數的類Unix系統,不管是Linux、Solaris仍是BSD上都通過了良好的測試。此外,它在windows平臺下也有相應的版本,比較知名的有cwRsync和Sync2NAS。   Rsync 的初始做者是 Andrew Tridgell 和 Paul Mackerras,它當前由 http:
//rsync.samba.org維護。   
Rsync的基本特色以下:   
1. 能夠鏡像保存整個目錄樹和文件系統;   2. 能夠很容易作到保持原來文件的權限、時間、軟硬連接等;   3. 無須特殊權限便可安裝;   4. 優化的流程,文件傳輸效率高;   5. 可使用rcp、ssh等方式來傳輸文件,固然也能夠經過直接的socket鏈接;   6. 支持匿名傳輸,以方便進行網站鏡像。
在使用 rsync 進行遠程同步時,可使用兩種方式:
  客戶端命令方式:遠程 Shell 方式(建議使用
ssh,用戶驗證由 ssh 負責)
  網絡服務方式:C/S 方式(即客戶鏈接遠程 rsync 服務器,用戶驗證由 rsync 服務器負責)。   
不管本地同步目錄仍是遠程同步數據,首次運行時將會把所有文件拷貝一次,之後再運行時將只拷貝有變化的文件(對於新文件)或文件的變化部分(對於原有文件)。 rsync 在首次複製時沒有速度優點,速度不如
tar,所以當數據量很大時您能夠考慮先使用 tar 進行首次複製,而後再使用 rsync 進行數據同步。


應用場景:
  實時同步
  定時同步
  inotify+rsync實時同步

優缺點:
實現增量同步,支持socket(daemon),實現集中備份
大量小文件同步時,時間比較長,有時候進程中止。併發若是大於200個文件(10-100k),同步就會有延時
同步大文件,有時會中斷,未完整同步前,是隱藏文件


NAME
       rsync -- a fast, versatile, remote (and local) file-copying tool
SYNOPSIS(三種工做模式)
第一種   Local:  rsync [OPTION...] SRC... [DEST]
    #rsync -avz /etc/hosts /tmp/       =====>相似cp
    #rsync -avz --delete /null/ /tmp/  =====>相似rm   /null是建立的空目錄,若是有內容,即同步過去
第二種   Access via remote shell:
    Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
    Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
    #rsync -avzP -e 'ssh -p 22' /tmp/ root@192.168.0.85:/tmp  
    #rsync -avzP -e 'ssh -p 22' root@192.168.0.85:/tmp/ /tmp/   ===>目錄後斜線指的是其中內容,不包含自己
第三種    Access via rsync daemon:
     Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
           rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
  #rsync -avz rsync://rsync_backup@192.168.0.85/backup /tmp/ --password-file=/etc/rsync.password
     Push: rsync [OPTION...] SRC... [USER@]HOST DEST
           rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST


Rsync客戶端命令的同步參數選項其餘參數。請見man rsync
生產經常使用avz          ==vzrtopgDl   (或者-vzrtoppg)
  -v, --verbose    increase verbosity  詳細模式輸出,進度
  -z, --compress   compress file data during the transfer傳輸時進行壓縮
  -r, --recursive   recurse into directories  對子目錄以遞歸模式
  -a, --archive     archive mode; equals -rlptgoD (no -H,-A,-X)
  -o, --owner       preserve owner (super-user only)保持文件屬主信息
  -p, --perms       preserve permissions 保持文件權限
  -D                 same as --devices --specials保持設備文件信息
  -e, --rsh=COMMAND  specify the remote shell to use使用信道協議,指定替代rsh的shell程序
  -P      --progress      show progress during transfer
  -l,     --links         copy symlinks as symlinks  保持軟連接
  -t    --times    保持文件時間信息
  --exclude=PATTERN     exclude files matching PATTERN   --exclude={文件1,文件2}
    或者在服務端配置文件rsyncd.conf加入排除
  --exclude-from=FILE     read exclude patterns from FILE
  --bwlimit=KBPS          limit I/O bandwidth; KBytes per second

 

rsync服務端配置算法

root@node85 ~]# rpm -qa | grep rsync    #默認安裝
rsync-3.0.6-12.el6.x86_64
[root@node85 ~]# cat /etc/rsyncd.conf     #編輯rsyncd配置文件
# Distributed under the terms of the GNU General Public License v2
# Minimal configuration file for rsync daemon
# See rsync(1) and rsyncd.conf(5) man pages for help
# This line is required by the /etc/init.d/rsyncd script
uid = rsync
gid = rsync
use chroot = no
max connections = 5
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow=192.168.0.0/255.255.255.0
hosts deny=*
auth users = rsyncd_backup
secrets file = /etc/rsyncd.password
#############################
[backup]
comment = backup server by gtms 2016-05-07
path = /backup

全局參數
在文件中 [module] 以外的全部配置行都是全局參數。固然也能夠在全局參數部分定義模塊參數,這時該參數的值就是全部模塊的默認值。
address            在獨立運行時,用於指定的服務器運行的 IP 地址。由 xinetd 運行時將忽略此參數,使用命令行上的-address 選項替代。    默認本地全部IP
port               指定 rsync 守護進程監聽的端口號。 由 xinetd 運行時將忽略此參數,使用命令行上的-port 選項替代。            默認873
motd file        指定一個消息文件,當客戶鏈接服務器時該文件的內容顯示給客戶。                            默認無
pid file        rsync 的守護進程將其 PID 寫入指定的文件。                                    默認無
log file        指定 rsyncd 守護進程的日誌文件,而不將日誌發送給syslog。                            默認無
syslog facility        指定 rsync 發送日誌消息給 syslog 時的消息級別。                                    
socket options        指定自定義 TCP 選項。                                                默認無            

模塊參數
模塊參數主要用於定義 rsync 服務器哪一個目錄要被同步。模塊聲明的格式必須爲 [module] 形式,這個名字就是在 rsync 客戶端看到的名字,相似於 Samba 服務器提供的共享名。
而服務器真正同步的數據是經過 path 來指定的。能夠根據本身的須要,來指定多個模塊,模塊中能夠定義如下參數:
a. 基本模塊參數
    path    指定當前模塊在 rsync 服務器上的同步路徑,該參數是必須指定的。            默認無
    comment    給模塊指定一個描述,該描述連同模塊名在客戶鏈接獲得模塊列表時顯示給客戶。    默認無
b. 模塊控制參數
use chroot    若爲 true,則 rsync 在傳輸文件以前首先 chroot 到 path 參數所指定的目錄下。這樣作的緣由是實現額外的安全防禦,可是缺點是須要 root 權限,而且不能備份指向 path 外部的符號鏈接所指向的目錄文件。    默認true
uid        指定該模塊以指定的 UID 傳輸文件。    nobody
gid        指定該模塊以指定的 GID 傳輸文件。    nobody
max connections    指定該模塊的最大併發鏈接數量以保護服務器,超過限制的鏈接請求將被告知隨後再試。    默認沒有限制
lock file    指定支持 max connections 參數的鎖文件。    /var/run/rsyncd.lock
list        指定當客戶請求列出可使用的模塊列表時,該模塊是否應該被列出。若是設置該選項爲 false,能夠建立隱藏的模塊。    默認true
read only    指定是否容許客戶上傳文件。若爲 true 則不容許上傳;若爲 false 而且服務器目錄也具備讀寫權限則容許上傳。    默認true
write only    指定是否容許客戶下載文件。若爲 true 則不容許下載;若爲 false 而且服務器目錄也具備讀權限則容許下載。    默認false
ignore errors    指定在 rsync 服務器上運行 delete 操做時是否忽略 I/O 錯誤。通常來講 rsync 在出現 I/O 錯誤時將將跳過 -delete 操做,以防止由於暫時的資源不足或其它 I/O 錯誤致使的嚴重問題。    默認true
ignore nonreadable    指定 rysnc 服務器徹底忽略那些用戶沒有訪問權限的文件。這對於在須要備份的目錄中有些不該該被備份者得到的文件時是有意義的。        默認false
timeout        該選項能夠覆蓋客戶指定的 IP 超時時間。從而確保 rsync 服務器不會永遠等待一個崩潰的客戶端。對於匿名 rsync 服務器來講,理想的數字是 600(單位爲秒)。    默認0 未限制
dont compress    用來指定那些在傳輸以前不進行壓縮處理的文件。該選項能夠定義一些不容許客戶對該模塊使用的命令選項列表。必須使用選項全名,而不能是簡稱。當發生拒絕某個選項的狀況時,服務器將報告錯誤信息而後退出。例如,要防止使用壓縮,應該是:」dont compress = *」。    *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
c. 模塊文件篩選參數
參數    說明    默認值
exclude        指定多個由空格隔開的多個文件或目錄(相對路徑),並將其添加到 exclude 列表中。這等同於在客戶端命令中使用 –exclude 來指定模式。    空
exclude from    指定一個包含 exclude 規則定義的文件名,服務器從該文件中讀取 exclude 列表定義。                            空
include        指定多個由空格隔開的多個文件或目錄(相對路徑),並將其添加到 include 列表中。這等同於在客戶端命令中使用 –include 來指定模式 。    空
include from    指定一個包含 include 規則定義的文件名,服務器從該文件中讀取 include 列表定義。    空
    一個模塊只能指定一個exclude 參數、一個include 參數。
    結合 include 和 exclude 能夠定義複雜的exclude/include 規則 。
    這幾個參數分別與相應的rsync 客戶命令選項等價,惟一不一樣的是它們做用在服務器端。
    關於如何書寫規則文件的內容請參考http://www.howtocn.org/rsync:use_rsync。
d. 模塊用戶認證參數
參數    說明    默認值
auth users    指定由空格或逗號分隔的用戶名列表,只有這些用戶才容許鏈接該模塊。這裏的用戶和系統用戶沒有任何關係。用戶名和口令以明文方式存放在 secrets file 參數指定的文件中。    (匿名方式)
secrets file    指定一個 rsync 認證口令文件。只有在 auth users 被定義時,該文件才起做用。    空
strict modes    指定是否監測口令文件的權限。若爲 true 則口令文件只能被 rsync 服務器運行身份的用戶訪問,其餘任何用戶不能夠訪問該文件。    true
    rsync 認證口令文件的權限必定是 600,不然客戶端將不能鏈接服務器。
    rsync 認證口令文件中每一行指定一個 用戶名:口令 對,格式爲:
    username:passwd
    通常來講口令最好不要超過8個字符。若您只配置匿名訪問的 rsync 服務器,則無需設置上述參數。
e. 模塊訪問控制參數
參數    說明    默認值
hosts allow    用一個主機列表指定哪些主機客戶容許鏈接該模塊。不匹配主機列表的主機將被拒絕。    *
hosts deny    用一個主機列表指定哪些主機客戶不容許鏈接該模塊。    空
客戶主機列表定義能夠是如下形式:
    單個IP地址。例如:192.168.0.1
    整個網段。例如:192.168.0.0/24192.168.0.0/255.255.255.0
    可解析的單個主機名。例如:centos,centos.bsmart.cn
    域內的全部主機。例如:*.bsmart.cn
    「*」則表示全部。
    多個列表項要用空格間隔。
f. 模塊日誌參數
參數    說明    默認值
transfer logging    使 rsync 服務器將傳輸操做記錄到傳輸日誌文件。    false
log format        指定傳輸日誌文件的字段。    」%o %h [%a] %m (%u) %f %l」
設置了」log file」參數時,在日誌每行的開始會添加」%t [%p]「。
可使用的日誌格式定義符以下所示:
    %a - 遠程IP地址
    %h - 遠程主機名
    %l - 文件長度字符數
    %p - 該次 rsync 會話的 PID
    %o - 操做類型:」send」 或 「recv」
    %f - 文件名
    %P - 模塊路徑
    %m - 模塊名
    %t - 當前時間
    %u - 認證的用戶名(匿名時是 null%b - 實際傳輸的字節數
    %c - 當發送文件時,記錄該文件的校驗碼
rsync配置文件詳解

[root@node85 ~]# useradd rsync -s /sbin/nologin -M
[root@node85 ~]# mkdir /backup
[root@node85 ~]# chown -R rsync /backup/
[root@node85 ~]# echo "rsyncd_backup:rootabcd" >>/etc/rsyncd.password
[root@node85 ~]# chmod 600 /etc/rsyncd.password
[root@node85 ~]# rsync --daemon
[root@node85 ~]# lsof -i:873
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync   27269 root    3u  IPv4  33755      0t0  TCP *:rsync (LISTEN)
rsync   27269 root    5u  IPv6  33756      0t0  TCP *:rsync (LISTEN)
[root@node85 ~]# ps -ef | grep rsync
root      27269      1  0 05:55 ?        00:00:00 rsync --daemon
root      27272   2256  0 05:56 pts/0    00:00:00 grep rsync
shell

 

rsync客戶端配置express

[root@node84 ~]# cat  /etc/rsyncd.passwd
rootabcd     
[root@node84 ~]# chmod 600 /etc/rsyncd.passwd
push方式
[root@node84 ~]# rsync -avz /tmp/ rsyncd_backup@192.168.0.85::backup --password-file=/etc/rsyncd.password

sending incremental file list
./
yum.log
.ICE-unix/
ssh-hgfbdL1711/
ssh-hgfbdL1711/agent.1711

sent 170 bytes  received 41 bytes  46.89 bytes/sec
total size is 0  speedup is 0.00

[root@node85 ~]# ls /backup/  #從server上查看
ssh-hgfbdL1711  yum.log

[root@node84 tmp]# rm -rf *
pull方式
[root@node84 tmp]# rsync -avz  rsyncd_backup@192.168.0.85::backup  /tmp/ --password-file=/etc/rsyncd.password

receiving incremental file list
./
yum.log
.ICE-unix/
ssh-hgfbdL1711/
ssh-hgfbdL1711/agent.1711

sent 98 bytes  received 259 bytes  64.91 bytes/sec
total size is 0  speedup is 0.00
[root@node84 tmp]# ls
ssh-hgfbdL1711  yum.log

 

關鍵參數 --deletewindows

rsync -avz  --delete rsyncd_backup@192.168.0.85::backup  /tmp/ --password-file=/etc/rsyncd.password 
操做結果,遠端有啥,本地有啥,遠端沒有的,本地也會被刪除
所以,須要慎用

rsync進程查殺centos

#kill -9 強制殺,不要輕易使用
#pkill rsync 狠殺進程,不要輕易使用
#killall rsync 平滑殺,屢次執行(會提示沒有進程被殺死)
#kill pid不要輕易使用
以下2種平滑:
#kill -HUP `cat /var/run/rsyncd.pid`
#kill -USR2 `cat /var/run/rsyncd.pid`

 

配置實用inotify工具實現實時同步安全

檢查確認環境支持
root@node84 ~]#  ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Jan 30 07:34 max_queued_events  (優化調大)設置inotifywait或inotifywatch命令能夠監控的文件數量(單程)
-rw-r--r-- 1 root root 0 Jan 30 07:34 max_user_instances  (優化調大)設置每一個用戶能夠運行的inotifywait或inotifywatch命令的進程數
-rw-r--r-- 1 root root 0 Jan 30 07:34 max_user_watches    設置inotify實例事件(event)隊列可容納的事件數量


編譯安裝inotify-tools
tar -xf inotify-tools-3.13.tar.gz
cd inotify-tools-3.13
./configure --prefix=/usr/local/inotify-tools-3.13
make && make install
ln -s /usr/local/inotify-tools-3.13/ /usr/local/inotify-tools

root@node84 ~]# ls -l /usr/local/inotify-tools/bin/
total 80
-rwxr-xr-x 1 root root 38606 Jan 30 07:38 inotifywait         在被監控的文件或目錄上等待特定文件系統事件(open close delete等)發生,執行後處於阻塞狀態,適合在shell腳本中使用
-rwxr-xr-x 1 root root 40377 Jan 30 07:38 inotifywatch        收集被監視的文件系統使用度統計數據,指文件系統事件發生的次數統計

inotifywait參數介紹
[root@node84 ~]# /usr/local/inotify-tools/bin/inotifywait --help
inotifywait 3.13
Wait for a particular event on a file or set of files.
Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
Options:
        -h|--help       Show this help text.
        @<file>         Exclude the specified file from being watched.
        --exclude <pattern>
                        Exclude all events on files matching the
                        extended regular expression <pattern>.
        --excludei <pattern>
                        Like --exclude but case insensitive.
        -m|--monitor    Keep listening for events forever.  Without
                        this option, inotifywait will exit after one
                        event is received.
        -r|--recursive  Watch directories recursively.
        --fromfile <file>
                        Read files to watch from <file> or `-' for stdin.
        -q|--quiet      Print less (only print events).
        -qq             Print nothing (not even events).
        --format <fmt>  Print using a specified printf-like format
                        string; read the man page for more details.
        --timefmt <fmt> strftime-compatible format string for use with
                        %T in --format string.
        -c|--csv        Print events in CSV format.
        -t|--timeout <seconds>
                        When listening for a single event, time out after
                        waiting for an event for <seconds> seconds.
                        If <seconds> is 0, inotifywait will never time out.
        -e|--event <event1> [ -e|--event <event2> ... ]
                Listen for specific event(s).  If omitted, all events are
                listened for.

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.

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
        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



[root@node84 ~]# /usr/local/inotify-tools/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete /tmp/
30/01/17 07:57 /tmp/a
30/01/17 07:57 /tmp/a
=>對/tmp目錄進行文件建立及刪除的監控,測試建立文件a,而後刪除,能夠監控到事件

同步腳本
#!/bin/bash
inotify=/usr/local/inotify-tools/bin/inotifywait
$inotify -mrq --format '%w%f' -e create,close_write,delete /nfs84 \
|while read file
do
  rsync -az --delete /nfs84 rsyncd_backup@192.168.0.85::backup --password-file=/etc/rsyncd.password
done

ps:    /dir    /形式推送不影響目標目錄其餘文件,推送整個目錄
      /dir    形式,使用--delete,即徹底被rsync影響
相關文章
相關標籤/搜索