一、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配置檔案中可以包含多個認證子產品,同時一個密碼檔案中也可以存放多個使用者和其對應的密碼。
# 其中每一個認證子產品可以對應不同的用戶端。