天天看點

Rsync同步工具的詳細使用

    RSYNC簡介:

    Rsync (remote sync)是一款開源、快速,多功能、可實作增量的本地或遠端資料鏡像同步備份優秀工具。它可通過 LAN/WAN 快速同步多台主機間的檔案。Rsync 本來是用以取代rcp 的一個工具,它目前由 Rsync.samba.org 維護。Rsync 使用所謂的“Rsync演算法”來使本地和遠端主機之間的檔案達到同步,該算法隻傳送兩個檔案中的不同部分,而不是每次都整份傳送,是以速度相當快。

      Rsync支援大多數的類 Unix 系統,無論是 Linux、Solaris 還是 BSD 上都經過了良好的測試。此外,它在windows 平台下也有相應的版本,比較知名的有 cwRsync 和 Sync2NAS。

RSYNC的特性:

1、支援拷貝特殊檔案如連結、裝置等。

2、可以有排除制定檔案或目錄同步的功能,相當于打包指令tar。

3、可以做到保持原來檔案或目錄的權限、時間、軟硬連接配接等所有屬性均不改變。

4、可實作增量同步,既隻同步發生變化的資料,是以資料傳輸效率很高。

5、可以使用rcp,rsh,ssh等方式配合傳輸檔案,也可以通過直接的socket連接配接。

6、支援匿名的或認證的程序模式傳輸,友善進行資料備份及鏡像

7、優化的流程,檔案傳輸效率高

RSYNC工作模式:

Rsync有四種工作模式,具體如下:

1、清單模式

      和ls -l相似,負責列出源的内容。不僅可以看本地還可以看遠端。

2、shell模式,也稱為本地模式

      和cp相似,本地拷貝檔案

3、遠端shell模式,可以通過通過rcp,ssh等通道傳輸

      和rcp相似,不過可以實作增量備份,并且能夠通過安全的ssh方式進行資料傳輸。

4、伺服器模式

      在這種模式下,rsync 守護程序在一台機器上永久運作,接收檔案傳輸請求。可以把檔案發送給守護程序,也可以向它請求檔案。伺服器模式非常适合建立中心備份伺服器或項目存儲庫。

      以上是對rsync做的一個簡單介紹,下面來安裝一下rsync,然後再詳細介紹我們rsync的四種工作模式!

環境

CentOS6.5 x86_64位 采用最小化安裝,系統經過了基本優化

selinux為關閉狀态,iptables為無限制模式

源碼包存放位置:/root

在安裝之前,首先讓我們看下系統上是否已經安裝了rsync。

[root@rsync-server ~]# rpm -qa|grep rsync

rsync-3.0.6-9.el6_4.1.x86_64

如果出現如上的情況,說明我們的系統已經安裝了rsync。如果沒有出現,就說明沒有安裝。

如果系統沒有安裝,我們就需要自己安裝了。安裝rsync的方式一共有2種,一種是基于包管理器安裝,比如rpm包之類,另外一種是基于源碼安裝。

1、基于包管理器安裝

[root@rsync-server ~]# yum install rsync -y

2、基于源碼安裝

  a、安裝缺少的gcc和庫檔案等

[root@rsync-server ~]# yum install -y kernel-headers glibc-headers glibc-devel libgomp gcc  gcc-c++

   b、安裝rsync

[root@rsync-server ~]# wget  http://rsync.samba.org/ftp/rsync/rsync-3.1.1.tar.gz

[root@rsync-server ~]# tar zxvf rsync-3.1.1.tar.gz

[root@rsync-server ~]# cd rsync-3.1.1

[root@rsync-server rsync-3.1.1]# ./configure --prefix=/usr/local/rsync[root@rsync-server rsync-3.1.1]# make && make install

     這樣子rsync就安裝完成了。

  我們需要注意的是,源碼安裝的rsync預設是沒有加入xinetd的,是以你會發現,在/etc/xinetd.d目錄下找不到rsync檔案。

下面,我就開始帶着大家一起來了解下rsync的四種模式!

1、清單模式(list mode)

     Rsync的清單模式,即等同于在實作 ls -l 的功能。我們可以通過分别執行rsync和ls指令來觀察差別。

[root@rsync-server /]# rsync /rsync

drwxr-xr-x        4096 2014/06/04 00:45:06 rsync

[root@rsync-server /]# rsync /rsync/

drwxr-xr-x        4096 2014/06/04 00:45:06 .

-rw-r--r--           0 2014/06/04 00:45:01 a

-rw-r--r--           0 2014/06/04 00:45:03 b

-rw-r--r--           0 2014/06/04 00:45:05 c

-rw-r--r--           0 2014/06/04 00:45:06 d

[root@rsync-server /]# ls -dl /rsync

drwxr-xr-x. 2 root root 4096 Jun  4 00:45 /rsync

[root@rsync-server /]# ls -l /rsync

total 0

-rw-r--r--. 1 root root 0 Jun  4 00:45 a

-rw-r--r--. 1 root root 0 Jun  4 00:45 b

-rw-r--r--. 1 root root 0 Jun  4 00:45 c

-rw-r--r--. 1 root root 0 Jun  4 00:45 d

     通過上面的輸出,可以看出來,rsync後跟檔案或目錄和ls -l後跟檔案和目錄的效果大體相同(不一樣的細節,這裡不多描述)。需要注意的是,如果你身處某個目錄,你ll能檢視到所在目錄下檔案清單的詳細資訊。但是你執行rsync會報錯,是以rsync必須後跟檔案或目錄才能檢視相關的詳細資訊。

     另外,rsync的清單模式是支援對遠端的目錄進行檢視的,而ls -l是不具備這個功能的。

[root@rsync-server /]#

2、Shell模式(shell mode)

     在 RSYNC 的 shell 模式(本地模式)中,我會列舉rsync指令的用法和正常選項資訊。

     首先來看下 RSYNC 的指令文法:

 rsync [OPTION]... SRC [SRC]... DEST

執行rsync --help可得到上面輸出,當然輸出不僅僅隻有上面這一條,我僅僅将shell模式的語句摘了出來。下面對該條語句進行拆解。

 rsync  [OPTION]...  SRC  [SRC]...  DEST

1)rsync為同步的指令

2)[OPTION]... 為同步時的參數選項

3)SRC為源,即需要拷貝的分區,檔案或目錄等

4)[DEST]為目地分區,檔案或目錄等

rsync 常用的參數選項有如下:

-n : 如果擔心指令執行不正确,一同步複制,可能這個複制的後果是緻命的,那後果可就嚴重了,這裡我們可以加-n先測試一下

-v :  --verbose,詳細輸出模式,顯示詳細過程

-q : --quiet,靜默模式,盡可能輸出少的資訊

-c : --checksum,可以對傳輸的檔案進行較驗的,強制對檔案傳輸進行校驗

-r  : --recursive,遞歸複制

-p : --perms,儲存檔案的權限

-t  : --times,保留檔案的時間戳

-l  : --links,保留檔案的符号連結

-u : update, 僅僅進行更新發生變化的資料

-g : --group,保留檔案的屬組

-o : --owner,保留檔案的屬主

-D : --devices,保留裝置檔案

-A : --acls,保留acl通路控制清單

-a : --archives歸檔,複制時可以儲存原有的屬主屬主等屬性資訊,甚至包括一點額外的屬性。等同于-rlptgoD

-e SSH : 遠端複制時,表示使用ssh協定作承載。如果ssh端口不是22,可以用-e ‘ssh -p 22’

-z : 基于網絡時使用,對檔案壓縮後傳輸

--progress : 顯示壓縮進度條的,簡寫-P

--stats : 顯示如何執行壓縮和傳輸的,也就是顯示傳輸狀态的

--

       更多的詳細資訊,請通過man rsync來進行檢視。

       需要注意的是:rsync指令在使用中,如果源參數的末尾有斜線,就會複制指定目錄内的内容,而不複制目錄本身;如果沒有斜線,則會複制目錄本身。目标參數的末尾有沒有斜線都不影響。

    接下來,請看下面兩個例子:

[root@rsync-server /]# rsync -a /rsync /backup  #會把目錄rsync直接同步至/backup目錄中去

[root@rsync-server /]# rsync -a /rsync/ /backup #會把目錄中的data/中的内容同步至/backups目錄中

現在,我們在shell模式下,進行rsync的同步。

執行個體1:測試本地rsync同步

[root@rsync-server ~]# mkdir /rsync     #建立rsync測試目錄

[root@rsync-server ~]# touch /rsync/test    #在rsync測試目錄下建立test.txt檔案

[root@rsync-server ~]# chmod -R 700 /rsync     #授權一下以檢視同步後是不是保持了權限屬性

[root@rsync-server rsync]# ll -a /rsync/

total 8

drwx------.  2 root root 4096 Jun  4 01:01 .

dr-xr-xr-x. 26 root root 4096 Jun  4 01:01 ..

-rwx------.  1 root root    0 Jun  4 01:01 test

[root@rsync-server ~]# rsync -avz /rsync/ /tmp

sending incremental file list

./

test

sent 78 bytes  received 34 bytes  224.00 bytes/sec

total size is 0  speedup is 0.00

[root@rsync-server ~]# ls -l /tmp/test

-rwx------. 1 root root 0 Jun  4 01:01 /tmp/test

上面的例子,示範了将本地/rsync目錄下的檔案,同步到/tmp目錄下。其中使用的參數,-avz上面講過。如果不明白,可以去上面看每個參數的詳細介紹。

3、遠端shell模式(remote shell mode)

遠端shell模式的話,和shell模式是異曲同工。隻不過,因為是要通過遠端,是以我們需要指定遠端主機的IP,如果采用ssh我們還需要指定ssh的端口等等。

遠端shell模式,正常分為如下兩種情況,其文法分别為:

拉取pull :rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

推送push:rsync [OPTION]... [USER@]HOST:SRC [DEST]

    下面為大家拆解一下指令:

1)Rsync為同步的指令

3)[USER@]HOST... 為Rsync同步的遠端的連接配接使用者和主機位址

4)SRC為源,即需要拷貝的分區、檔案或目錄等,和HOST之間用一個冒号連接配接

5)[DEST]為目地分區、檔案或目錄等

大家可以發現,拉取和推送,不一樣的地方就是源和目标換了位置。其中拉取,表示從遠端主機把資料同步到執行指令的本地主機相應目錄。(需要注意,拉取的話,遠端主機上一定要安裝rsync,不然會拉取失敗)。推送,表示從本地主機執行指令把本地的資料同步到遠端主機指定目錄下

    下面我們來看一個案例:

拉取執行個體:

    老大要求拉取172.16.100.1這台伺服器上的etc目錄到我們的備份伺服器172.16.100.2上的/backup目錄下。

操作:

通過ssh連接配接到172.16.100.1這台伺服器上,然後執行如下指令:

[root@rsync-server ~]# rsync -vzrtopg --progress -e ‘ssh -p 22’ [email protected]:/etc /backup

文法說明:

1)-vzrtopg 相當于上文的-avz,表示同步時檔案和目錄屬性不變。

2)--progress 顯示同步的過程,可以用-p替換

3)-e ‘ssh -p 22’,表示通過ssh的通道傳輸資料。如果ssh是預設的22号端口,此處的-p 22可省略。

4)[email protected]:/etc 遠端的主機使用者,位址,路徑

5)/backup本地(172.16.100.2)的路徑

推送執行個體:

公司内部有一台svn伺服器(172.16.100.2),公司站點的更新代碼通過背景的測試伺服器測試之後,經過svn同步到svn伺服器。老大要求你将svn伺服器上的代碼,推送到前台的伺服器(172.16.100.1)上。

操作:通過ssh連接配接到svn伺服器(172.16.100.2)上,然後執行如下指令

[root@rsync-server ~]# rsync -avz --progress -e ‘shh -p 22’ /webrepo [email protected]:/data/web/html

特别說明:

1)上面兩個例子中的資料同步都是加密傳輸的,因為是通過ssh通道進行資料傳輸的。

2)在傳輸前需要進行連接配接使用者(一般為系統使用者)密碼驗證,需要手工輸入。這裡我們可以通過配置ssh互信來實作免驗證方式同步。

3)rsync軟體必須安裝在本地及遠端伺服器上

4、服務模式(daemon mode)

RSYNC的服務模式,部署時分為rsync的服務端和rsync的用戶端。需要注意的是,rsync 的服務端和用戶端都是一個軟體包,如果你啟用了 rsync 的服務模式,則該主機就變成 rsync 伺服器。是以我們需要将 rsync 分别安裝于服務端和用戶端,服務端和用戶端使用同一個 rsync 軟體包來實作遠端鏡像和定期同步更新。

rsync 服務端可同時備份多個用戶端的資料,多個服務端備份一個用戶端的資料。 rsync 預設端口為 873,伺服器在該端口接收客戶的匿名或者認證方式的備份請求。

rsync 服務端在使用之前需要進行必要的配置,其配置檔案為 /etc/rsyncd.conf,該檔案預設沒有,需要自己手動建立。Rsync服務端通過/etc/rsyncd.conf進行認證、通路、日志記錄等控制,該配置檔案包括全局參數、子產品參數等設定。

rsyncd.conf 檔案中 [module] 之前的所有參數為全局參數,也可以在全局參數部分定義子產品參數。在這種情況下該參數的值就是所有子產品的預設值。全局參數設定程式使用的端口号,指定消息檔案、日志檔案 pid 檔案以及發送日志消息的級别。子產品參數主要定義服務端哪個目錄需要被同步。使用者可根據不同的需要指定多個子產品,每個子產品對應需要備份的一個目錄樹,即若有 N 個需要備份的目錄樹,則需要 N 個子產品與之對應。子產品中可以定義許多參數。下面,我們拿出來一個rsyncd.conf檔案,來給大家做詳解:

uid = rsync    # 指定的子產品傳輸檔案時所用的使用者身份

gid = rsync    # 指定的site子產品傳輸檔案時所用的使用者組身份

port=873       # 預設端口

use chroot = no # 預設為true,修改為no,增加對目錄檔案軟連接配接的備份

max connections = 200  # 指定最大并發連接配接數以保護伺服器,超過限制的連接配接請求将被告知随後再試。預設值為 0,即沒有限制。

timeout = 300          # 伺服器會話的逾時時間

pid file = /var/run/rsyncd.pid   # 程序啟動後,程序号存放路徑

lock file = /var/run/rsyncd.lock # 服務啟動、停止會用到鎖檔案

log file = /var/log/rsyncd.log   # 指定日志檔案的路徑

Log fromat = %h %o %f %l %b      # 指定日志記錄的格式

motd file = /etc/rsyncd.motd     # 登陸消息提示檔案,可以不配置。預設為空。

[test]         # 子產品名稱,名稱可以任意寫,不過一般是以路徑命名,最好見名意

Comment = test # 子產品資訊描述,該描述連同子產品名在客戶連接配接得到子產品清單時顯示給客戶。預設沒有描述定義

path=/test/    # 指定供備份的目錄路徑,必須指定該參數。該目錄路徑是rsync服務端的一個路徑,提供給用戶端上傳或下載下傳

ignore erros   # 忽略錯誤

read only = false  # 設定是否允許客戶上載檔案。若為 true 任何上載請求均會失敗,若為 false 且用戶端擁有伺服器目錄讀寫權限則可以上載。預設值為 true 。

write only 設定是否允許客戶下載下傳檔案。若為 true 任何下載下傳請求均會失敗,預設值為 false 。

list = false       # 設定當客戶請求可以使用的子產品清單時,是否列出該子產品。若為 false,則建立隐藏的子產品。預設值為 true

hosts allow=192.168.137.0/24  # 指定允許客戶連接配接的 IP 位址。可以為單個 IP 位址或整個網段。多個 IP 或網段需要以空格隔開。預設是允許所有主機連接配接。

hosts deny=*   # 指定拒絕連接配接的客戶IP位址,設定方式和hosts allow相同。

Dont commpress # 指定不進行壓縮處理即可傳輸的檔案,預設值是 *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

auth users = rsync_backup  # 該選項指定由空格或逗号分隔的使用者名清單,隻有這些使用者才允許連接配接該子產品。這裡的使用者不一定是用戶端存在的使用者。如果"auth users"被設定,那麼用戶端發出對該子產品的連接配接請求時,需要對使用者身份進行驗證。使用者的名和密碼以明文方式存放在"secrets file"選項指定的檔案中。預設情況下無需密碼就可以連接配接子產品 ( 也就是匿名方式 )。

secrets file = /etc/rsync.password # 虛拟使用者的密碼檔案

exclude = common/   # 用來指定多個由空格隔開的多個檔案或目錄 ( 相對路徑 ),并将其添加到 exclude 清單中。這等同于在用戶端指令中使用 --exclude 參數。一個子產品隻能指定一個 exclude 選項。但是需要注意的一點是該選項有一定的安全性問題,用戶端很有可能繞過 exclude 清單,如果希望確定特定的檔案不能被通路,那就最好結合 uid/gid 選項一起使用。

pre-xfer exec, post-xfer exec  # 設定可在檔案傳輸前/後執行的指令。若在檔案傳輸前執行的指令失敗,則取消本次傳輸操作。

以上就是,rsyncd.conf的詳細配置資訊了。我将很多的預設不顯示的參數也列舉了出來,大家使用的時候可以靈活掌握。

下面,我就帶大家來一起配置一個 rsync的服務端和rsync的用戶端!

伺服器架構:

rsync-server:172.16.100.1

rsync-client:172.16.100.2

RSYNC 服務端部署:

1、安裝rsync,并且配置服務端主配置檔案

[root@rsync-server ~]# vim /etc/rsyncd.conf

uid = root

gid = root

use chroot = no

max connections = 200

timeout = 300

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

ignore errors

read only = false

list = false

hosts allow = 172.16.100.0/24

hosts deny = *

auth users = rsync_backup

secrets file = /etc/rsync.password

[sunsky]

path = /test

2、建立 rsync.password 作為使用者密碼檔案

[root@rsync-server ~]# touch /etc/rsync.passord

[root@rsync-server ~]# chmod 600 /etc/rsyncd.password

[root@rsync-server ~]# vim rsyncd.password  #裡面記錄條目的格式為“使用者 : 密碼”

    rsync_backup:redhat

ps: /etc/rsyncd.password 的權限必須是600,用戶端的/etc/rsync.password也必須為600,不然請求檔案時會報錯

3、(可選)建立 rsync.motd 作為登入消息檔案。該檔案為選擇性配置檔案,生産環境不推薦使用。

[root@rsync-server ~]# touch /etc/rsyncd.motd

[root@rsync-server ~]# vim rsyncd.conf

============================

This is Critical Data Server

=============================

4、建立子產品中指定的檔案

[root@rsync-server ~]# mkdir /test

[root@rsync-server ~]# chown root.root /test   #更改目錄的權限為rsyncd.conf中uid和gid指定屬主和屬組

5、以守護程序方式啟動 rsync

 Rsync服務端的啟動分2種,一種是交給 xinetd 去管理,另外就是自己手動配置守護程序。

 A、手動配置rsync守護程序

[root@rsync-server ~]# /usr/bin/rsync --daemon  --config=/etc/rsyncd.conf  #注意如果你的rsyncd.conf檔案在/etc/目錄下,就不需要再用--config去指定了。--daemon是以守護程序的方式啟動

我們可以将上面的指令寫入 /etc/rc.local 中,這樣當系統啟動時,就會自動以守護程序的方式去運作 rsync。

補充:

          重新開機rsync的組合指令

[root@rsync-server ~]# pkill rsync  #關閉rsync服務

[root@rsync-server ~]# rsync --daemon #啟動rsync服務

[root@rsync-server ~]# ps -ef | grep rsync   #檢查是否啟動

B、交由xinetd管理

[root@rsync-server ~]# yum install xinetd  #安裝xinetd

[root@rsync-server ~]# vim /etc/xinetd.d/rsync

     disable= no  # 預設為yes,需要将他設定為no,讓xinetd接管rsync服務。注意,如果你使用手動的方式,這裡就修改為no,即拒絕xinetd接管rsync服務。

[root@rsync-server ~]# /etc/init.d/xinetd  start # 啟動xinetd服務,則預設會以守護程序方式啟動rsync 服務

6、檢查服務狀态

[root@rsync-server ~]# netstat -lntup |grep 873

[root@rsync-server test]# netstat -lntup |grep 873

tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      10234/rsync

tcp        0      0 :::873                      :::*                        LISTEN      10234/rsync

或者

[root@rsync-server ~]# lsof -i tcp:873

[root@a test]# lsof -i tcp:873

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

rsync   10234 root    3u  IPv4  93239      0t0  TCP *:rsync (LISTEN)

rsync   10234 root    5u  IPv6  93240      0t0  TCP *:rsync (LISTEN)

    手動啟動rsync的常見參數:

[root@rsync-server ~]# rsync --daemon   # daemon 表示以守護程序的方式啟動rsync服務

常用啟動參數:

--daemon   # 表示以守護程序的方式啟動rsync服務

--address  # 綁定指定ip位址提供服務,即伺服器是多網卡模式或多虛拟IP模式,需要指定某個固定ip提供服務

--config=FILE  # 更改配置檔案路徑,而不去使用預設的/etc/rsyncd.conf

--port=PORT    # 更改其它端口提供服務,而不去使用模式的873端口。

以上即為rsync服務端的整個配置步驟了!

RSYNC 服務端已經部署完畢,接下來如果要使用的話,肯定還需要搭配 rsync 用戶端才行!下面就來看,rsync用戶端怎麼部署!

RSYNC 用戶端部署

RSYNC 用戶端部署起來非常簡單,我們僅僅需要安裝 rsync 軟體,然後建立一個本地密碼檔案。該密碼檔案為對應rsync 服務端配置檔案裡面每個子產品下面的虛拟使用者的密碼,以此來實作免密碼同步!

操作如下:

1、安裝rsync

2、配置本地密碼檔案

[root@rsync-server ~]# vim /etc/rsync.password   # 該檔案裡面僅存放密碼即可

   redhat

[root@rsync-server ~]# cat /etc/rsync.password   # 配置完畢之後檢查

[root@rsync-server ~]# ll /etc/rsync.password    # 配置完畢之後檢查

OK!!!

RSYNC的服務端和用戶端都配置完畢,現在我們可以進行測試了。

我們需要去rsync用戶端,來完成下面的測試操作。需要注意,測試同樣分為兩種情況,每種情況又有兩種文法寫法,分别為:

拉取:①rsync [OPTION...] [USER@]HOST::SRC... [DEST]

      ②rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

推送:①rsync [OPTION...] SRC... [USER@]HOST:DEST

      ②rsync [OPTION...] SRC...  rsync://[USER@]HOST[:PORT]/DEST

特别值得注意的是,與遠端shell模式指令不同的是,第①種文法格式, [USER@]HOST::SRC和 [USER@]HOST::DEST結尾處,均為雙冒号連接配接SRC或DEST。另外,這個SRC或DEST已經不再是路徑了,而是守護程序中配置的子產品的名稱了。

下面列舉我們在rsync用戶端上,對rsync服務端進行拉取或推送的操作範例:

第一種格式:

拉取:

rsync -avzP [email protected]::sunsky /test/ --password-file=/etc/rsync.password

推送:

rsync -avzP /test [email protected]::sunsky --password-file=/etc/rsync.password

第二種格式:

    拉取:

rsync -avzP rsync://[email protected]:/sunsky/ /test/ --password-file=/etc/rsync.password

    推送:

rsync -avzP /test/ rsync://[email protected]:/sunsky/  --password-file=/etc/rsync.password

       以上就是,rsync整個服務端和用戶端的配置。

       在生産環境中,我們可以專門部署一台rsync伺服器,專門負責接收業務伺服器的日志歸檔和配置檔案歸檔。當然,我們也可以部署在svn伺服器之前,來作為網站代碼推送的伺服器,或者說一台web伺服器專門用來做分發的時候。

 但是我們知道,我們的日志歸檔都是在淩晨,是以我們不可能天天晚上去做向rsync服務端的推送操作。并且,如果日常web内容做分發的次數頻繁的話,我們不可能每時每刻都盯着它去做手動推送。是以我們可以借助crontab計劃任務來實作定時推送。

[root@rsync-server ~]# crontab -e

# Automatic synchronization log files at 1 a.m

* 1 * * * /usr/bin/rsync-avzP [email protected]::weblog /data/log/  --password-file=/etc/rsyncd.passwd > /dev/null 2>&1

# Automatic distribution site file points every second of every day

* * * * * /usr/bin/rsync-avzP --delete [email protected]::webdata /data/web/  --password-file=/etc/rsyncd.passwd > /dev/null 2>&1

注意:上面用到的weblog和webdata都是子產品的名字,我們在rsyncd.conf裡面指定子產品所對應的目錄路徑。

但是,我們仍然會發現一個問題,雖然使用計劃認為能滿足我們的日志歸檔定時推送到rsync服務端,但是每次都有1分鐘的延遲。并且,在某些作為網站釋出平台的情況下,rsync每分鐘都去檢查整體一緻性然後做推送,這樣子非常耗費資源。是以,我們需要對此種情況進行改良。在後面一篇博文,我會帶大家一起了解rsync+inotify,借助rsync+inotify來實作實時同步檔案。

在本文最後面,我貼上rsync的--delete和--exclude的操作效果!

--delete操作如下:

[root@rsync-server ~]# ls /test/  #檢視rsync服務端,sunsky子產品下的/test目錄的檔案清單

e

[root@rsync-client ~]# ls /test/   #檢視rsync用戶端本地/test目錄的檔案清單

a  b  c  d

以上為操作前的環境,請保持這個環境一緻,然後做如下操作:(下面的推送和拉取都是基于此環境做的)

在rsync用戶端做拉取操作:

[root@rsync-client ~]# rsync -avzP --delete [email protected]::sunsky /test/ --password-file=/etc/rsync.password

receiving incremental file list

deleting d

deleting c

deleting b

deleting a

           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 86 bytes  received 143 bytes  458.00 bytes/sec

[root@rsync-client ~]# ls /test/

[root@rsync-server ~]# ls /test/

 我們發現,rsync用戶端本身的a,b,c,d檔案都消失了,取而代之的是e檔案,并且我們在rsync的拉取過程中,也能看到删除操作!

在rsync用戶端做推送操作:

[root@rsync-client ~]# rsync -avzP --delete /test/ [email protected]::sunsky --password-file=/etc/rsync.password

deleting e

a

           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=3/5)

b

           0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=2/5)

c

           0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=1/5)

d

           0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=0/5)

sent 201 bytes  received 87 bytes  576.00 bytes/sec

我們發現,rsync服務端本身的e檔案消失了,取而代之的是a,b,c,d檔案,并且我們在rsync的推送過程中,也能看到删除操作!

--exclude操作如下:

[root@rsync-server ~]# tree /test/

/test/

0 directories, 0 files

[root@rsync-client ~]# tree /test/

├── a

├── b

├── c.txt

├── x

│   └── xxx.txt

└── x.txt

2 directories, 4 files

以上為操作前的環境,請保持這個環境一緻,然後做如下操作:

[root@rsync-client ~]# rsync -avz --exclude=*.txt /test/ [email protected]:/test/

[email protected]'s password:

x/

sent 154 bytes  received 57 bytes  60.29 bytes/sec

在rsync服務端進行檢視同步效果:

└── x

1 directory, 2 files

我們可以發現,隻要是能被*.txt比對到的都沒有被推送過去!

如果說,你有很多需要排除的目錄或者檔案,不希望他們被同步過去,此時你可以使用--exclude-from參數,該參數後面跟一個檔案,你可以将需要比對排除的項寫到該檔案裡面!

例子:

[root@rsync-client ~]# cat /tmp/exclude

x

*.txt

[root@rsync-client ~]# rsync -avz --exclude-from=/tmp/exclude /test/ [email protected]:/test/

xx/

sent 151 bytes  received 57 bytes  59.43 bytes/sec

└── xx

以上就是我們的--exclude和--exclude-from的詳細用法!