天天看點

rsync一個遠端資料同步工具詳解

作者:超越永無止境技有所長

一、rsync介紹

1、rsync是什麼

rsync(remote synchronize)是Liunx/Unix下的一個遠端資料同步工具。

它可通過LAN/WAN快速同步多台主機間的檔案和目錄,并适當利用rsync算法(差分編碼)以減少資料的傳輸。

rsync算法并不是每一次都整份傳輸,而是隻傳輸兩個檔案的不同部分,是以其傳輸速度相當快。

除此之外,rsync可拷貝、顯示目錄屬性,以及拷貝檔案,并可選擇性的壓縮以及遞歸拷貝。

2、rsync的工作原理

a、用戶端構造FileList,FileList包含了需要與伺服器同步的所有檔案資訊對name->id

(id用來唯一表示檔案例如MD5)

b、用戶端将FileList發送到伺服器。

c、伺服器上rsync處理用戶端發過來的FileList,建構新的NewFileList。

其中根據MD5值比較,删除伺服器上已經存在的檔案資訊對,隻保留伺服器上不存在或變化的檔案。

d、用戶端得到伺服器發送過來的NewFileList,然後把NewFileList中的檔案重新傳輸到伺服器。

3、rsync優點

1)可以鏡像儲存整個目錄樹和檔案系統。

2)可以很容易做到保持原來檔案的權限、時間、軟硬連接配接等。

3)無需特殊權限即可安裝。

4)快速:第一次同步時rsync複制全部内容,但在下一次值傳輸修改過的内容

5)壓縮傳輸:rysnc在傳輸的過程中可以實行壓縮及解壓縮操作,可以使用更少的帶寬

6)安全:可以使用scp、ssh等方式來進行檔案傳輸

7)支援匿名傳輸,以友善進行網站鏡像

8)rsync不僅可以遠端同步資料(類似于scp),而且可以本地同步資料(類似于cp),做差異同步

9)openssh 8.0已經把scp标記為過時不建議使用了。建議用sftp或者rsync替代scp

# 需要在Liunx/Unix伺服器之間互傳海量資料時,建議選擇rsync進行傳輸

4、rsync認證方式

rsync有兩種常用的認證方式,一種是rsync-daemon方式,另外一種是ssh方式。

在平時使用過程,我們使用最多的是rsync-daemon方式。

注意:在使用rsync時,伺服器和用戶端都必須安裝rsync程式。

rsync-daemon 認證

rsync在rsync-daemon認證方式下,預設監聽TCP的873端口。

rsync-daemon認證方式是rsync的主要認證方式,這個也是我們經常使用的認證方式。

并且也隻有在此種模式下,rsync才可以把密碼寫入到一個檔案中。

注意:

rsync-daemon認證方式,需要伺服器和用戶端都安裝rsync服務

并且隻需要rsync伺服器端啟動rsync,同時配置rsync配置檔案。

用戶端啟動不啟動rsync服務,都不影響同步的正常進行。

ssh認證

rsync在ssh認證方式下,可通過系統使用者進行認證,即在rsync上通過ssh隧道進行傳輸,類似于scp工具。

此時同步操作不在局限于rsync中定義的同步檔案夾。

注意:

ssh認證方式,不需要伺服器和用戶端配置rsync配置檔案

隻需要雙方都安裝rsync服務,并且也不需要雙方啟動rsync。

# 若rsync服務端SSH為标準端口,此時rsync使用方式如下:

rsync -avz /root/test [email protected]:/root/

# 若rsync服務端SSH為非标準端口,可通過rsync的-e參數進行端口指定。使用方式如下:

rsync -avz /root/test -e 'ssh -p1234' [email protected]:/root/

二、安裝rsync

安裝rsync,我們可以分為兩種方式:源碼方式安裝和RPM方式安裝。

注意:rsync軟體無論是伺服器端還是用戶端都是同一個軟體包。

1、源碼方式安裝

# 源碼方式安裝rsync,需要到其官網下載下傳對應的安裝包。rsync官網:rsync.samba.org

1)、下載下傳

wget https://download.samba.org/pub/rsync/src/rsync-3.2.3.tar.gz

2)、解壓并安裝

tar -xvf rsync-3.2.3.tar.gz

3)、編譯安裝

# 源碼安裝rsync時,其編譯時所需要的gcc庫檔案盡量提前安裝完畢

# 預設安裝到/usr/local/目錄下

./configure

make &&make install

4)、設定開機啟動

echo “/usr/local/bin/rsync --daemon -config=/etc/rsyncd.conf” >>/etc/profile

2、 yum方式安裝

yum -y install rsync

#設定開機啟動

echo “/usr/local/bin/rsync --daemon -config=/etc/rsyncd.conf” >>/etc/profile

三、配置rsync daemon

rsync的配置分為伺服器端和用戶端

使用rsync協定,需要服務端啟動守護程序

1、服務端配置

準備rsync配置檔案

# 以 rsync 使用者啟動程序

uid = rsync

gid = rsync

# 無需讓rsync以root身份運作,允許接收檔案的完整屬性

fake super = yes

# 禁锢推送的資料至某個目錄, 不允許跳出該目錄

use chroot = no

max connections = 200 # 最大連接配接數

timeout = 600 # 逾時時間

ignore errors # 忽略錯誤資訊

read only = false # 對備份資料可讀寫

list = false # 不允許檢視子產品資訊

# 定義虛拟使用者,作為連接配接認證使用者

auth users = myuser

# 定義rsync服務使用者連接配接認證密碼檔案路徑

secrets file = /etc/rsync.passwd

#### 定義子產品資訊

[backup]

comment = commit # 子產品注釋資訊

path = /backup # 定義接收備份資料目錄

# 隻允許10.10.10段ip連接配接

hosts allow = 10.10.10.0/24

配置并啟動守護程序

# 需要一個rsync程序運作時使用的普通使用者 rsync

useradd rsync -M -s /sbin/nologin

# 服務端需要定義一個用戶端連接配接 虛拟使用者名和密碼

# 密碼檔案形式 user:passwd

echo "myuser:password" > /etc/rsync.passwd

chmod 600 /etc/rsync.passwd

# 準備子產品定義好的目錄,用戶端的資料都存放在該目錄下

mkdir /backup

chown -R rsync.rsync /backup

# 啟動服務

rsync --daemon

# 檢視服務

ps aux | grep rsync

netstat -lntp|grep 873

2、用戶端使用

# 在用戶端安裝完畢rsync服務後,是不需要啟動rsync服務的。

# 我們隻需要在用戶端建立連接配接rsync伺服器時,驗證碼使用者所需要的密碼檔案即可。

# 該密碼檔案中的密碼要與rsync伺服器上的密碼檔案中的密碼對應

# 并且也要與rsync伺服器rsyncd.conf配置檔案中的認證子產品中的使用者比對。

echo “password”>>/etc/rsync.passwd

chmod 600 /etc/rsync.passwd

# 檢視 rsync 守護程式配置設定的所有 module 清單,可以執行下面指令。

rsync rsync://10.10.10.10

# 具體寫法是伺服器與目标目錄之間使用雙冒号分隔`::`

# 位址中的module并不是實際路徑名,而是 rsync 守護程式指定的子產品名

# 把本地的檔案同步到遠端伺服器

# rsync [OPTION]… [SRC]… [USER@]HOST::DEST

# rsync [選項] [--port=] [--password-file=] [/local/path] [使用者名]@服務端IP::[子產品名]

rsync -av --password-file=/etc/rsync.passwd local/ [email protected]::backup

# 把遠端機器的檔案同步到本地

# rsync [OPTION]… [USER@]HOST::SRC [DEST]

# rsync [選項] [--port=] [--password-file=] [使用者名@]服務端IP::[子產品名] [/local/path]

rsync -av --password-file=/etc/rsync.passwd [email protected]::backup local/

四、rsync使用

1、同步模式模式

1.1 本地同步

##本地 rsync 選項 源 目标

Local: rsync [OPTION...] SRC... [DEST]

#将/etc目錄備份到/opt目錄下,和cp的差別在于會自動增量備份

rsync -avz /etc /opt

1.2遠端同步

ssh協定

# 預設使用 SSH 進行遠端登入和資料傳輸

# 不需要做任何配置,需要都安裝rsync,操作上類似scp

#将遠端檔案拉(下載下傳)到本地

Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]

#将本地檔案推送(上傳)到遠端

Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

#将etc推送到10.10.10.10下的自定義檔案夾下

rsync -az /etc/ 10.10.10.10:/opt/etc-$(hostname)-$(date +%F)

rsync協定

使用rsync協定,需要服務端啟動守護程序

操作參考 配置rsync daemon

2、指令參數

常用參數

-v, –verbose詳細模式輸出。

-a, –archive歸檔模式,表示以遞歸方式傳輸檔案,并保持所有檔案屬性不變。

-z, –compress對備份的檔案在傳輸時進行壓縮處理。

–delete:删除那些DST中存在而在SRC中沒有的檔案。

所有參數

-a:–archive archive mode 權限儲存模式,相當于 -rlptgoD 參數,存檔,遞歸,保持屬性等。

-r:–recursive 複制所有下面的資料,遞歸處理。

-p:–perms 保留檔案權限,檔案原有屬性。

-t:–times 保留時間點,檔案原有時間。

-g:–group 保留原有屬組。

-o:–owner 保留檔案所有者(root only)。

-D:–devices 保留device資訊(root only)。

-l:–links 複制所有的連接配接,拷貝連接配接檔案。

-z:–compress 壓縮模式,當資料在傳送到目的端進行檔案壓縮。

-H:–hard-links 保留硬連結檔案。

-A:–acls 保留ACL屬性檔案,需要配合–perms。

-P:-P參數和 --partial --progress 相同,隻是為了把參數簡單化,表示傳進度。

--version:輸出rsync版本。

-v:–verbose 複雜的輸出資訊。

-u:–update 僅僅進行更新,也就是跳過已經存在的目标位置,并且檔案時間要晚于要備份的檔案,不覆寫新的檔案。

--port=PORT:定義rsyncd(daemon)要運作的port(預設為tcp 873)。

--delete:删除那些目标位置有的檔案而備份源沒有的檔案。

--delete-before: 接收者在傳輸之前進行删除操作

--password-file=FILE :從 指定密碼檔案中擷取密碼。

--bwlimit=KBPS:限制 I/O 帶寬。

--filter “-filename”:需要過濾的檔案。

--exclude=filname:需要過濾的檔案。

--progress:顯示備份過程。

五、示例

1、常用示例

# 将目前目錄下所有檔案同步到遠端

rsync -avzP ./* [email protected]::backup

# 從服務端同步資料到本地

rsync -avzP [email protected]::backup .

# 保持服務端于用戶端上資料完全一緻,服務端有則同步給用戶端,服務端沒有,用戶端有的則從用戶端删除

# –delete 選項,表示用戶端上的資料要與伺服器端完全一緻,多則删之,少則補之

# 用的時候要小心點,最好不要把已經有重要數所據的目錄,當做本地更新目錄,否則會把你的資料全部删除

rsync -avzP --delete [email protected]::backup /tmp/test/

# 下面的 rsync 指令将10.10.10.10主機上的 /www 目錄(不包含 /www/logs 和 /www/conf子目錄)複制到本地的 /backup/www/

rsync -avzP --delete --exclude "logs/" --exclude "conf/" \

10.10.10.10:/www/ /backup/www/

2、快速删除大量資料

1、在need_delete 目錄下建立30萬個檔案

time for i in $(seq 1 300000)

do

echo test >>$i.txt

done

# 執行時間

real 0m42.267s

user 0m6.756s

sys 0m33.973s

2、測試rsync删除

# 先建立一個空目錄new_dir

# 然後執行

time rsync -a --delete-before new_dir/ need_delete/

# 隻需要幾秒鐘,速度非常快

real 0m8.146s

user 0m0.216s

sys 0m7.127s

3、測試 rm -rf 删除

time rm -rf need_delete/

real 0m9.639s

user 0m0.143s

sys 0m8.250s

六、rsyncd.conf 詳解

1、全局參數

# 在獨立運作時,用于指定的伺服器運作的 IP 位址

address = IP

# 監聽端口

port = 873

# rsync 的守護程序将其 PID 寫入指定的檔案

pid file = /var/run/rsyncd.pid

# 指定支援 max connections 參數的鎖檔案

lock file = /var/run/rsync.lock

# 指定 rsync 守護程序的日志檔案,而不将日志發送給 syslog

log file = /var/log/rsyncd.log

#========== 控制參數 =============#

# 以指定的 UID 傳輸檔案

uid = rsync

# 指定該子產品以指定的 GID 傳輸檔案。

gid = rsync

# 禁锢推送的資料至某個目錄, 不允許跳出該目錄,

# 預設為 yes,則 rsync 在傳輸檔案之前首先 chroot 到 path 參數所指定的目錄下

# 這樣做的原因是實作額外的安全防護,但是缺點是需要 root 權限

# 并且不能備份指向 path 外部的符号連接配接所指向的目錄檔案

use chroot = no

# 無需讓rsync以root身份運作,允許接收檔案的完整屬性

fake super = yes

# 大并發連接配接數量以保護伺服器,超過限制的連接配接請求将被告知随後再試

# 預設為0 (沒有限制)

max connections = 200

# 逾時時間

timeout = 600

# 指定在 rsync 伺服器上運作 delete 操作時是否忽略 I/O 錯誤。

# 一般來說 rsync 在出現 I/O 錯誤時将将跳過 –delete 操作

# 以防止因為暫時的資源不足或其它 I/O 錯誤導緻的嚴重問題。

ignore errors

# 指定是否允許客戶上傳檔案。

# 預設為true,不允許使用者上傳檔案,

# 若為 false 并且伺服器目錄也具有讀寫權限則允許上傳。

read only = false

# 指定當客戶請求列出可以使用的子產品清單時,該子產品是否應該被列出。

# 預設為 true,如果設定該選項為 false,可以建立隐藏的子產品

list = false

2、子產品參數

子產品參數主要用于定義 rsync 伺服器哪個目錄要被同步。

子產品聲明的格式必須為 [module] 形式,這個名字就是在 rsync 用戶端看到的名字,類似于 Samba 伺服器提供的共享名。

而伺服器真正同步的資料是通過 path 來指定的。可以根據自己的需要,來指定多個子產品,子產品中可以定義以下參數:

基本子產品參數

# 指定子產品名

[backup]

# 指定目前子產品在 rsync 伺服器上的同步路徑,該參數是必須指定的

path = /backup

# 給子產品指定一個描述,該描述連同子產品名在客戶連接配接得到子產品清單時顯示給客戶

comment = commit

子產品檔案篩選參數

# 指定多個由空格隔開的多個檔案或目錄(相對路徑)

# 并将其添加到 exclude 清單中。這等同于在用戶端指令中使用 –exclude 來指定模式。

exclude = exclude_file

# 指定一個包含 exclude 規則定義的檔案名,伺服器從該檔案中讀取 exclude 清單定義

exclude from = exclude-file.txt

# 指定多個由空格隔開的多個檔案或目錄(相對路徑),并将其添加到 include 清單中。

# 這等同于在用戶端指令中使用 –include 來指定模式 。

include = include-file.txt

# 指定一個包含 include 規則定義的檔案名,伺服器從該檔案中讀取 include 清單定義

include from = exclude-file.txt

# 一個子產品隻能指定一個exclude 參數、一個include 參數

# 結合 include 和 exclude 可以定義複雜的exclude/include 規則

# 這幾個參數分别與相應的rsync 客戶指令選項等價,唯一不同的是它們作用在伺服器端

子產品使用者認證參數

# rsync 預設匿名方式傳輸

# 若隻配置匿名通路的 rsync 伺服器,則無需設定下述參數

# 指定由空格或逗号分隔的使用者名清單,隻有這些使用者才允許連接配接該子產品。

# 這裡的使用者和系統使用者沒有任何關系。使用者名和密碼以明文方式存放在 secrets file 參數指定的檔案中

auth users = user_name

# 指定一個 rsync 認證密碼檔案。隻有在 auth users 被定義時,該檔案才起作用

secrets file = /etc/rsync.passwd

# rsync 認證密碼檔案的權限一定是 600,否則用戶端将不能連接配接伺服器。

# rsync 認證密碼檔案中每一行指定一個 使用者名:密碼 對,格式為:

# username:passwd

# 一般來說密碼最好不要超過8個字元

# 一個rsync配置檔案中可以包含多個認證子產品,同時一個密碼檔案中也可以存放多個使用者和其對應的密碼。

# 其中每一個認證子產品可以對應不同的用戶端。

繼續閱讀