Rsync原理介紹及配置應用

振宇要低調發表於2015-08-24

1、前言

  基於LAN或WAN的網路應用之間進行資料傳輸或者同步非常普遍,比如遠端資料映象、備份、複製、同步,資料下載、上傳、共享等等。對此,最簡單、直接的做法是對資料進行完全複製。然而,資料在網路上來回被複制多次後就會存在大量副本,很多情形下這些檔案副本之間僅有很小的差異,很可能是從同一個檔案版本演化而來。另一方面,如果對檔案進行完全複製,在檔案較大的情況下,會佔用大量網路頻寬,同步時間也會較長。目前,廣域網WAN的頻寬與訪問延遲仍然是急需解決的問題,完全複製使得很多網路應用無法提供良好的服務質量。Rsync是類Unix下常見的一種資料同步演算法,它僅傳輸差異資料,從而節省網路頻寬並提高效率。

2、演算法介紹

2.1 分塊Checksum演算法

  首先,rsync會把目標端fileDst的檔案平均切分成若干個小塊,每塊的預設大小為700個位元組(最後一塊會小於這個數),然後對每塊計算兩個checksum:一個是32位的rolling checksum,是弱checksum,其使用的演算法是Mark Adler發明的adler-32演算法。另一個是強checksum,128位的md5 hash演算法。(adler-32演算法不屬於本文討論的主要內容,有興趣可參考http://rsync.samba.org/tech_report/node3.html)

  adler-32作為快演算法是用來鑑別檔案塊的不同,但是弱的adler32演算法碰撞概率太高了,所以還要引入強的md5 checksum演算法以保證兩檔案塊是相同的。也就是說,弱的rolling checksum是用來區別不同,而強的md5 checksum是用來確認相同。

2.2 checksum查詢演算法

  目標端會把fileDst的一個checksum列表傳給源端,這個列表中的每一項包含三個屬性:rolling checksum(32bits)、md5 checksume(128bits)、檔案塊編號。源端rsync接收到這個列表後,會對源端fileSrc做同樣的checksum,然後和目標端fileDst的checksum做對比,通過比對就可以感知哪些檔案做了變動。為獲得O(1)時間複雜度的查詢效能,同步源端fileSrc拿到目標端fileDst的checksum陣列後,會把這個資料存到一個hash table中。

2.3 比對演算法

  (1)取fileSrc的第一個檔案塊(假設是512個長度),也就是從fileSrc的第1個位元組到第512個位元組,取出來後做rolling checksum計算。計算好的值到hash表中查。

  (2)如果查到了,說明fileDst中有潛在相同的檔案塊,就再比較md5的checksum。因為rolling checksume只有32位,發生碰撞的概率非常大,於是還要算md5的128bits的checksum,這樣一來發生碰撞的概率就可以忽略了。如果rolling checksum和md5 checksum都相同,這說明在fileDst中有相同的塊,我們需要記下這一塊在fileDst下的檔案編號。

  (3)如果fileSrc的rolling checksum 沒有在hash table中找到,那就表明這一檔案塊不存在於目標端。總之,只要rolling checksum 或 md5 checksum 其中有一個在目標端的checksum hash表中找不到匹配項,那麼就會觸發演算法對fileSrc的滾動計算動作。即演算法會住後滑動 1個位元組,取fileSrc中位元組2-513的檔案塊要做checksum,重新執行第一步的流程。

  (4)當源端的fileSrc完全做完一遍rolling checksum後,就可以找出源端fileSrc與目標端fileDst不相同的檔案塊了,也就是要同步到目標端的檔案塊。之後進行傳輸。

  (5)演算法的簡要流程如下圖所示:

3、安裝配置

3.1 安裝

  下載rsync-3.0.4.tar.gz ,地址:http://rsync.samba.org/ftp/rsync/src/rsync-3.0.4.tar.gz

解壓安裝包,命令:tar –xvzf rsync-3.0.4.tar.gz
進入到rsync資料夾執行:
cd rsync-3.0.4
./configure --prefix=/usr/local/rsync
make
make install

3.2 配置

  Rsync安裝完成之後預設沒有配置檔案,需要自己建立。

3.2.1 建立一系列資料夾

mkdir /usr/local/rsync/logs 
mkdir /usr/local/rsync/etc 
mkdir /usr/local/rsync/run

3.2.2 新增配置檔案

  vim  /usr/local/rsync/etc/rsyncd.conf   內容如下:

uid = root
gid = root
port = 873
use chroot = no
hosts allow = 192.168.31.22
#hosts deny =  192.168.10.0/24
pid file = /usr/local/rsync/run/rsyncd.pid
lock file = /usr/local/rsync/run/rsync.lock
log file = /usr/local/rsync/logs/rsyncd.log
ignore errors

[rsynctest]
path = /home/laizy/rsync/rsynctest
auth users = root
secrets file = /usr/local/rsync/rsyncd.pass
read only = no

3.2.3 新增密碼檔案

  vim /usr/local/rsync/rsyncd.pass   格式為——使用者名稱:密碼。示例:

root:123456

3.2.4 為密碼檔案賦予許可權

chmod 600 /usr/local/rsync/rsyncd.pass

3.2.5 安全配置

  只允許IP為192.168.31.21的主機連入rsync server:

iptables -A INPUT -p tcp -s ! 192.168.31.22 --dport 873 -j DROP

3.2.6 啟動服務

rsync  --daemon --config=/usr/local/rsync/etc/rsyncd.conf &

4、命令詳細說明

–v、–verbose詳細模式輸出

–q、–quiet精簡輸出模式

–c、–checksum開啟校驗開關,強制對檔案傳輸進行校驗

–a、–archive歸檔模式,表示以遞迴方式傳輸檔案,並保持所有檔案屬性

–r、–recursive對子目錄以遞迴模式處理

–R、–relative使用相對路徑資訊

–b、–backup建立備份,也就是對於目的已經存在有同樣的檔名時,將老的檔案重新命名為~filename

–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保持檔案時間資訊

–W、–whole-file拷貝檔案,不進行增量檢測

–x、–one-file-system不要跨越檔案系統邊界

–B、–block-size=SIZE檢驗演算法使用的塊尺寸,預設是700位元組

–e、–rsh=COMMAND指定替代rsh的shell程式

–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=TIMEIP超時時間,單位為秒

–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排除一個指定檔名中指定模式匹配的檔案

–include-from=FILE不排除一個指定檔名中指定模式匹配的檔案

–version列印版本資訊

–address繫結到特定的地址

–config=FILE指定其他的配置檔案,不使用預設的rsyncd.conf檔案

–port=PORT指定其他的rsync服務埠

–blocking-io對遠端shell使用阻塞IO

–stats給出某些檔案的傳輸狀態

–log-format=FORMAT指定日誌檔案格式

–password-file=FILE從FILE中得到密碼

–bwlimit=KBPS限制I/O頻寬,KBytespersecond

–h、–help顯示幫助資訊

 

5、常見使用例項

5.1 將本地的檔案,同步到遠端機器

rsync -avz --password-file=/root/rsyncd.pass /root/temp/ root@192.168.31.22:/home/laizy/tmp/

調換source和destination的位置,亦可完成遠端機器到本地的資料同步。

5.2 使用ssh通道進行資料同步

rsync -avz --password-file=/root/rsyncd.pass -e ssh /root/temp/ root@192.168.31.22:/home/laizy/tmp/

5.3 刪除不存在於源目錄的目的地檔案

rsync -avz --password-file=/root/rsyncd.pass --delete /var/opt/laizy/ /root/temp/

5.4 同步時不在目的地建立新檔案

rsync -avz --password-file=/root/rsyncd.pass  --existing /var/opt/lx/ /root/temp/

只對目的地已經有的檔案進行同步,而不理會源目錄新增的檔案。

5.5 限制傳輸檔案的大小

rsync -avz --password-file=/root/rsyncd.pass --max-size='100K' /var/opt/lx/ /root/temp/

以上命令限制傳輸的檔案大小隻能小於或等於100K,另可以使用M和G作為大小單位。

5.6全拷貝

rsync -avzW --password-file=/root/rsyncd.pass /var/opt/lx/ /root/temp/

預設情況下 rsync 採用增量拷貝,這樣能節省頻寬,在所同步檔案不大的情況下,我們可以通過 -W 選項實現全拷貝。

相關文章