一、rsync 簡介
Rsync(remote synchronize)是一個遠程數據同步工具,可通過LAN/WAN快速同步多臺主機間的文件,也可以使用 Rsync 同步本地硬盤中的不同目錄。
Rsync 是用於取代rcp的一個工具,Rsync使用所謂的 “Rsync 算法” 來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快。您可以參考 How Rsync Works A Practical Overview 進一步瞭解 rsync 的運作機制。
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 進行數據同步。
二、服務端和客戶端安裝rsync服務
1. 檢查rsync 是否已經安裝
rpm -qa|grep rsync
2. 安裝rsync
yum install -y rsync
三、配置 rsync 服務
1. 服務端配置方式
a. 編寫配置文件
[root@backup ~]# vim /etc/rsyncd.conf
##created by SouthBay
###rsyncd.conf start##
uid = rsync # 指定管理備份目錄的用戶
gid = rsync # 指定管理備份目錄的用戶組
port = 873 # 定義rsync備份服務的網絡端口號
fake super = yes # 將rsync虛擬用戶僞裝成爲一個超級管理員用戶
use chroot = no # 和安全相關的配置
max connections = 200 # 最大連接數 同時只能有200個客戶端連接到備份服務器
timeout = 300 # 超時時間(單位秒)
pid file = /var/run/rsyncd.pid # 記錄進程號碼信息 1.讓程序快速停止進程 2. 判斷一個服務是否正在運行
lock file = /var/run/rsync.lock # 鎖文件
log file = /var/log/rsyncd.log # rsync服務的日誌文件 用於排錯分析問題
ignore errors # 忽略傳輸中的簡單錯誤
read only = false # 指定備份目錄是可讀可寫
list = false # 使客戶端可以查看服務端的模塊信息
hosts allow = 172.16.1.0/24 # 允許傳輸備份數據的主機(白名單)
hosts deny = 0.0.0.0/32 # 禁止傳輸備份數據的主機(黑名單)
auth users = rsync_backup # 指定認證用戶
secrets file = /etc/rsync.password # 指定認證用戶密碼文件 用戶名稱:密碼信息
[backup] # 模塊信息
comment = "backup dir by SouthBay"
path = /backup # 模塊中配置參數 指定備份目錄
b. 創建rsync服務的虛擬用戶
useradd rsync -M -s /sbin/nologin
c. 創建備份服務認證密碼文件
echo "rsync_backup:123456" >/etc/rsync.password
chmod 600 /etc/rsync.password # 修改密碼文件權限爲600
d. 創建備份目錄並修改屬主屬組信息
mkdir /backup
chown rsync.rsync /backup/
e. 啓動備份服務
systemctl start rsyncd
systemctl enable rsyncd
f. 查看服務狀態
systemctl status rsyncd
2. 客戶端配置方式
a. 創建一個密碼文件
方法一:
echo "123456" >/etc/rsync.password
chmod 600 /etc/rsync.password
方法二:
export RSYNC_PASSWORD=123456 # 臨時生效配置
echo "export RSYNC_PASSWORD=123456" >> /etc/bashrc # 永久生效配置
注:方法二使用定時任務時執行rsync命令備份時要重新定義這個密碼變量
b. 進行免交互傳輸數據測試
rsync -avz /etc/hosts [email protected]::backup --password-file=/etc/rsync.password
# 方法一可以使用這種方法
rsync -avz /etc/hosts [email protected]::backup # 配置了方法二的密碼,可以使用
四、rsync使用方法
1.本地備份數據
rsync [OPTION...] SRC... [DEST]
OPTION: 參數
src: 要備份的數據信息
dest: 備份到什麼路徑中
2.遠程備份數據
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
# OPTION: 參數
# [USER@]: 以什麼用戶身份拉取數據(默認以當前用戶)
# HOST: 指定遠程主機IP地址或者主機名稱
# SRC: 要拉取的數據信息
# DEST: 保存到本地的路徑信息
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
# OPTION: 參數
# SRC: 本地要進行遠程傳輸備份的數據
# [USER@]: 以什麼用戶身份推送數據(默認以當前用戶)
# HOST: 指定遠程主機IP地址或者主機名稱
# DEST: 保存到遠程的路徑信息
3. 守護進程方式備份數據
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
# OPTION: 參數
# [USER@]: 指定認證用戶信息
# HOST: 指定遠程主機IP地址或者主機名稱
# [:PORT]: 指定端口
# SRC: 要拉取的數據信息
# DEST: 保存到本地的路徑信息
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
# OPTION: 參數
# SRC: 要推送備份數據信息
# [USER@]: 指定認證用戶信息
# HOST: 指定遠程主機的IP地址或者主機名稱
# [:PORT]: 指定端口
# ::DEST: 備份服務器的模塊信息
4. 參數說明:
參數信息 | 參數說明 |
---|---|
-v --verbose | 顯示詳細的傳輸信息 |
-a --archive | 命令的歸檔參數 包含: rtopgDl |
-r --recursive | 遞歸參數 |
-t --times | 保持文件屬性信息時間信息不變(修改時間) |
-o --owner | 保持文件屬主信息不變 |
-g --group | 保持文件屬組信息不變 PS: 如何讓-o和-g參數生效,需要將配置文件uid和gid改爲root,需要將 fake super參數進行註釋 |
-p perms | 保持文件權限信息不變 |
-D | 保持設備文件信息不變 |
-l links | 保持鏈接文件屬性不變 |
-L | 保持鏈接文件數據信息不變 |
-P | 顯示數據傳輸的進度信息 |
--exclude=PATTERN | 排除指定數據不被傳輸 |
--exclude-from=file | 排除指定數據不被傳輸(批量排除) |
--bwlimit=RATE | 顯示傳輸的速率 100Mb/8=12.5MB |
--delete | 無差異同步參數(慎用) |
--partial | 斷點續傳,保留部分傳輸文件 |
--partial-dir=DIR | 斷點續傳,保留部分文件到文件夾內,傳輸完後刪除該文件 |
五、rsync常見問題
1. rsync服務端防火牆問題
- 錯誤提示
No route to host - 演示過程
[root@nfs ~]# rsync -avz /etc/hosts [email protected]::data --password-file=/etc/rsync.pass
rsync: failed to connect to 172.16.1.41: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6] - 問題解決
Rsync服務端開啓了防火牆功能,關閉即可。
2. 客戶端執行rsync命令發生錯誤問題
- 錯誤提示
The remote path must start with a module name not a / - 演示過程
[root@nfs ~]# rsync -avz /etc/hosts [email protected]::/data --password-file=/etc/rsync.pass
ERROR: The remote path must start with a module name not a /
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6] - 問題解決
rsync命令語法錯誤,::/data錯誤的語法,data爲模塊,而不是目錄,正確寫法::data。
3. Rsync用戶認證失敗問題
- 錯誤提示
auth failed on module data - 演示過程
[root@nfs ~]# rsync -avz /etc/hosts [email protected]::data --password-file=/etc/rsync.pass
@ERROR: auth failed on module data
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6] - 問題解決
1.客戶端rsync命令認證用戶沒寫對,或者認證文件密碼所在行的結尾有多餘的空格或tab(cat -A /etc/rsync.pass檢查)
2.客戶端認證文件/etc/rsync.pass配置錯誤,不需要rsync_backup認證用戶,只需要設置認證密碼即可。
3.服務端認證文件中rsync_backup:123456後有空行或tab,需要注意。
4.服務端認證文件/etc/rsync.pass權限不是600。
5.服務端rsyncd.conf配置文件中,secrets file參數設置的認證文件名稱與系統中創建的認證文件名稱不一致。
6.服務端rsyncd.conf配置文件中,uid和gid設置的管理用戶與備份目錄管理用戶不一致。
4. Rsync服務權限阻止問題
- 錯誤提示
Permission denied -
演示過程
sent 180 bytes received 27 bytes 414.00 bytes/sec
[root@nfs ~]# rsync -avz /etc/hosts [email protected]::data --password-file=/etc/rsync.pass
sending incremental file list
hosts
rsync: mkstemp ".hosts.dGfSQ1" (in data) failed: Permission denied (13)
total size is 294 speedup is 1.42
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6] -
問題解決
1.服務端/etc/rsyncd.conf文件中,uid和gid設置的管理用戶與備份目錄的屬主和屬組不一致。
2.備份目錄的文件權限不是755。
5. Rsync服務備份模塊異常問題
- 錯誤提示
Unknown module 'data' - 演示過程
[root@nfs ~]# rsync -avz /etc/hosts [email protected]::data --password-file=/etc/rsync.pass
@ERROR: Unknown module 'data'
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6] - 問題解決
1.客戶端rsync命令執行時,指定的模塊名稱不正確。
2.服務端/etc/rsyncd.conf文件中,指定的備份目錄的模塊名稱不正確。
6. Rsync服務備份目錄異常問題
- 錯誤提示
chdir failed - 演示過程
[root@nfs ~]# rsync -avz /etc/hosts [email protected]::data --password-file=/etc/rsync.pass
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6] - 問題解決
服務端/etc/rsyncd.conf文件中,備份目錄模塊path路徑設置存在問題,檢查目錄是否存在,或者path路徑是否填寫正確。
7. Rsync無效的用戶問題
- 錯誤提示
invalid uid mine - 演示過程
[root@nfs ~]# rsync -avz /etc/hosts [email protected]::data --password-file=/etc/rsync.pass
@ERROR: invalid uid mine
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6] - 問題解決
服務端管理備份目錄的虛擬用戶不存在,通過“useradd 用戶 -M -s /sbin/nologin”進行創建即可。
8. 配置了免交互方式備份數據,客戶端依舊需要輸入密碼問題
- 錯誤提示
password file must not be other-accessible -
演示過程
sent 26 bytes received 8 bytes 9.71 bytes/sec
[root@nfs ~]# rsync -avz /etc/hosts [email protected]::data --password-file=/etc/rsync.pass
password file must not be other-accessible
continuing without password file
Password:
sending incremental file list
total size is 294 speedup is 8.65 -
問題解決
Rsync客戶端的認證文件不是600權限。
9. Rsync服務未開啓問題
- 錯誤提示
Connection refused - 演示過程
[root@nfs ~]# rsync -avz /etc/hosts [email protected]::data --password-file=/etc/rsync.pass
rsync: failed to connect to 172.16.1.41: Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6] - 問題解決
1.檢查服務:ps -ef|grep [r]sync
2.開啓服務:rsync --daemon
10. Rsync服務連接超時問題
- 錯誤提示
Connection timed out - 演示過程
[root@nfs ~]# rsync -avz /etc/hosts [email protected]::data --password-file=/etc/rsync.pass
rsync: failed to connect to 172.16.1.51: Connection timed out (110)
rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6] - 問題解決
檢查目標主機IP地址,ping目標主機檢查鏈路是否正常。
[root@nfs ~]# ping 172.16.1.41
PING 172.16.1.41 (172.16.1.41) 56(84) bytes of data.
64 bytes from 172.16.1.41: icmp_seq=1 ttl=64 time=0.438 ms
11. Rsync服務連接慢的問題
- 日誌分析
[root@backup ~]# tailf /var/log/rsyncd.log
2019/06/27 12:49:35 [22251] params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors
--- 未對rsync客戶端主機在服務端進行host解析,導致反向解析域名,使得連接緩慢。
2019/06/27 12:49:55 [22251] name lookup failed for 172.16.1.31: Temporary failure in name resolution
2019/06/27 12:49:55 [22251] connect from UNKNOWN (172.16.1.31)
2019/06/27 12:49:55 [22251] rsync to data/ from rsync_backup@unknown (172.16.1.31)
2019/06/27 12:49:55 [22251] receiving file list
2019/06/27 12:49:56 [22251] sent 76 bytes received 81 bytes total size 294 - 問題解決
[root@backup ~]# echo -e '172.16.1.31\tnfs' >>/etc/hosts
[root@backup ~]# tailf /var/log/rsyncd.log
2019/06/27 12:55:06 [22268] params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors
--- 可以查看到服務端對nfs主機進行了正確的反向解析過程。
2019/06/27 12:55:06 [22268] connect from nfs (172.16.1.31)
2019/06/27 12:55:06 [22268] rsync to data/ from rsync_backup@nfs (172.16.1.31)
2019/06/27 12:55:06 [22268] receiving file list
2019/06/27 12:55:06 [22268] sent 76 bytes received 81 bytes total size 294