Rsync 資料備份

fanhaixin發表於2024-12-05

Rsync 資料備份

配置檔案

資料檔案

其他重要的檔案

使用rsync命令將備份資料儲存到備份伺服器

rsync 預設安裝

rsync 傳輸模式

1. 本地模式 類似cp命令 充當cp命令 但是是增量複製

2. 遠端訪問模式

  • 不分誰是客戶端誰是服務端,可以程序遠端伺服器的上傳和下載== 遠端複製

(1) 語法

# 將10.0.0.7的a.txt  上傳到 10.0.0.41 的root目錄下
rsync -avz a.txt root@10.0.0.41:/root/

# 將10.0.0.41 的root目錄下的 b.txt 下載到當前目錄
rsync -avz root@10.0.0.41:/root/b.txt .

# rsync 指定ssh埠進行資料傳輸  -e 'ssh -port 54111'
rsync -avz -e 'ssh -port 54111' a.txt root@10.0.0.41:/root/
# 指定ssh埠54111將資料傳輸至10.0.0.41的/root/下

3. 守護程序方式

既然遠端訪問模式已經能實現資料的備份功能,為什麼要使用 守護程序模式

(1) 安全

  • 遠端訪問模式如命令所見必須知道伺服器的使用者名稱和密碼,可能洩露

(2) 規範

  • 支援匿名使用者:限定一方必須為客戶端 一方必須為服務端,能進行許可權控制
  • 匿名使用者 系統中不存在 在rsync服務端的配置檔案中設定

Rsync 語法

1. 本地模式

rsync -avz 複製的內容  複製到那裡去
# 將1.txt  複製到 /opt下
rsync -avz 1.txt /opt/

2. 遠端訪問模式

rsync -avz 使用者名稱@主機ip:路徑

# 將10.0.0.7的a.txt  上傳到 10.0.0.41 的root目錄下
# 上傳模式 push
rsync -avz a.txt root@10.0.0.41:/root/


# 下載模式 pull
# 將10.0.0.41 的root目錄下的 b.txt 下載到當前目錄
rsync -avz root@10.0.0.41:/root/b.txt .

# 測試用例 
在10.0.0.202 建立5個檔案
[root@zookeeper2 /ceshi]#hostname -I
10.0.0.202 172.16.1.202 
[root@zookeeper2 /ceshi]#ll
total 20
-rw-r--r-- 1 root root 4 Nov 13 23:37 1.txt
-rw-r--r-- 1 root root 4 Nov 13 23:37 2.txt
-rw-r--r-- 1 root root 4 Nov 13 23:37 3.txt
-rw-r--r-- 1 root root 4 Nov 13 23:37 4.txt
-rw-r--r-- 1 root root 4 Nov 13 23:37 5.txt

在10.0.0.201 建立3個檔案
[root@zookeeper1 /ceshi2]#hostname -I
10.0.0.201 172.16.1.201 
[root@zookeeper1 /ceshi2]#ll
total 32
-rw-r--r-- 1 root root 4 Nov 13 23:34 a.txt
-rw-r--r-- 1 root root 4 Nov 13 23:34 b.txt
-rw-r--r-- 1 root root 4 Nov 13 23:34 c.txt

執行命令
rsync -avz ceshi/ root@10.0.0.201:/ceshi2/


結果如下:
10.0.0.201 下是增量的檔案
[root@zookeeper1 /ceshi2]#ll
total 32
-rw-r--r-- 1 root root 4 Nov 13 23:37 1.txt
-rw-r--r-- 1 root root 4 Nov 13 23:37 2.txt
-rw-r--r-- 1 root root 4 Nov 13 23:37 3.txt
-rw-r--r-- 1 root root 4 Nov 13 23:37 4.txt
-rw-r--r-- 1 root root 4 Nov 13 23:37 5.txt
-rw-r--r-- 1 root root 4 Nov 13 23:34 a.txt
-rw-r--r-- 1 root root 4 Nov 13 23:34 b.txt
-rw-r--r-- 1 root root 4 Nov 13 23:34 c.txt

# 測試結果證明  將整個目錄進行推送到指定目錄只是將該目錄下的內容增量推送到指定目錄下,而不會將目錄本身推送過去,如果指定目錄下有相同的檔案下會進行覆蓋


測試結果證明 將整個目錄進行推送到指定目錄只是將該目錄下的內容全部推送到指定目錄下,而不會將目錄本身推送過去,如果指定目錄下有相同的檔案下會進行覆蓋

注意使用rsync 目錄/ 這種方式是不同的

rsync -avz ceshi/ root@10.0.0.201:/ceshi2/

此命令是將 ceshi下的所有檔案推送到10.0.0.201:/ceshi2/下

rsync -avz ceshi root@10.0.0.201:/ceshi2/

此命令是將 ceshi 這個目錄包含內部的所有檔案整體推送到10.0.0.201:/ceshi2/下

root@10.0.0.201:/ceshi2/ 此處的ceshi2/ 帶不帶 / 都無所謂

3. 守護程序模式

rsync -avz file 匿名活使用者@服務端ip::模組名稱

Rsync 引數

基本引數

  • -a--archive: 歸檔模式,等同於 -rlptgoD,即遞迴同步目錄,同時保留符號連結、檔案許可權、時間戳、組、所有權和裝置檔案等。

  • -v--verbose: 詳細輸出模式,顯示同步過程資訊。

  • -z--compress: 在傳輸過程中壓縮檔案,提高傳輸效率,特別是在網路頻寬有限的情況下。

  • -r--recursive: 遞迴到目錄下所有子檔案和子目錄。

  • -l--links: 將符號連結按照連結本身複製。

  • -t--times: 保持檔案時間戳。

  • -p--perms: 保持檔案許可權。

  • -g--group: 保持檔案的所屬組。

  • -o--owner: 保持檔案的所有者資訊。

進階引數

  • -n--dry-run: 模擬執行,顯示將要進行的操作,但不實際執行。

  • --delete: 將目標目錄中源目錄沒有的檔案刪除,保持目標目錄與源目錄一致。

  • -u--update: 只更新目標目錄中老的檔案,不替換更新更早或相同時間戳的檔案。

  • --exclude=PATTERN: 排除指定的檔案或目錄,不同步這些內容。

rsync -av --exclude='*.tmp' source/ destination/
  • --include=PATTERN: 只包括指定的檔案或目錄進行同步,與 --exclude 可以一起使用,精確控制同步內容。

  • -e--rsh=COMMAND: 指定遠端 shell,例如使用 SSH 進行加密傳輸。

rsync -avz -e ssh source/ user@host:destination/
  • --progress: 顯示同步過程中檔案的傳輸進度資訊。

  • --partial: 保留傳輸中斷的部分檔案,便於下次恢復複製。

示例

完整命令示例,使用 rsync 透過 SSH 同步檔案並刪除多餘的檔案:

rsync -avz --delete -e ssh /local/dir/ user@remote.host:/remote/dir

這個命令檔案模式下同步 /local/dir/ 的內容到遠端伺服器 remote.host/remote/dir,並刪除目標中沒有的檔案,同時透過 SSH 加密傳輸。

守護程序模式服務配置

1. 環境

主機角色 外網ip(wan) 內網ip(Lan) 主機名稱
Rsync服務端 10.0.0.41 172.16.1.41 backup
Rsync客戶端 10.0.0.31(nfs) 172.16.1.31 web01

2. 執行步驟

  1. 安裝服務
  2. 配置服務
  3. 啟動服務
  4. 測試

2.1 安裝服務

  1. 服務端安裝rsync
yum -y install rsync
rpm -qa rsync

[root@backup ~]#rpm -qa rsync
rsync-3.1.2-10.el7.x86_64

  1. 服務端配置服務

檢視配置檔案位置

# 檢視rsync 配置檔案的位置
[root@backup ~]#rpm -qc rsync
/etc/rsyncd.conf
/etc/sysconfig/rsyncd

配置檔案配置

[root@backup ~]#cat /etc/rsyncd.conf 
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup

配置檔案每項解釋

[root@backup ~]#cat /etc/rsyncd.conf 
uid = rsync	# 執行程序的使用者,該使用者為虛擬使用者,檢查如無需要建立
gid = rsync	# 執行程序的使用者組
port = 873	# 監聽埠
fake super = yes	# 無需讓rsync 以root 身份執行,允許接收檔案的完整屬性
use chroot = no		# 限制推送的資料到某個目錄,不允許跳出該目錄
max connections = 200	# 最大連線數
timeout = 600	# 超時時間
ignore errors	# 忽略錯誤資訊
read only = false # 對備份資料可讀寫
list = false	# 不允許檢視模組資訊
auth users = rsync_backup	# 定義虛擬使用者作為連線認證使用者,該使用者不需要存在,在配置檔案定義即可
secrets file = /etc/rsync.passwd	# 定義rsync 服務使用者連線認證密碼檔案路徑,建立並許可權600
log file = /var/log/rsyncd.log		# 日誌檔案位置
#####################################
[backup]	# 模組名稱  客戶端連線命令的時候需要一致
comment = welcome to oldboyedu backup!  # 模組註釋資訊
path = /backup		# 定義接收備份資料目錄  該目錄需建立或存在  屬於 rsync(配置檔案中定義的執行rsync虛擬使用者)

配置檔案注意事項

1. uid = rsync  該使用者為虛擬使用者  需要建立,並且該使用者執行rsync程序,需要向指定的模組目錄
path = /backup  /backup  目錄下寫內容   需要許可權,因此需要將 該目錄的屬主更改為rsync 這個虛擬使用者

2. auth users = rsync_backup 這是連線使用的認證使用者, 不需要存在,但是需要在連線命令的時候使用該認證使用者

3. 配置檔案中可寫多個模組,後面追加即可

根據配置檔案建立必要的資料

大部分的密碼配置檔案許可權都必須為600 否則會報錯

# 注意:有些服務在安裝後會自動建立所需的虛擬使用者,可以先檢查
[root@backup ~]#id rsync
id: rsync: no such user

1. 建立虛擬使用者
[root@backup ~]#useradd -M -s /sbin/nologin rsync
[root@backup ~]#id rsync
uid=1001(rsync) gid=1001(rsync) groups=1001(rsync)

2. 建立密碼檔案 並修改許可權為600
[root@backup ~]#vim /etc/rsync.passwd
[root@backup ~]#cat /etc/rsync.passwd
rsync_backup:123456

[root@backup ~]# chmod 600 /etc/rsync.passwd 
# 密碼檔案需要寫上使用者名稱和密碼  使用者名稱為配置檔案的認證使用者  密碼自定義即可
# 大部分的密碼配置檔案許可權都必須為600 否則會報錯

3. 建立存放資料的目錄
[root@backup /]#mkdir /backup
[root@backup /]#chown rsync.rsync /backup/
[root@backup /]#ll
total 16
drwxr-xr-x    2 rsync rsync    6 Nov 14 01:07 backup



2.2 啟動服務並加入開機自啟

systemctl start rsyncd
systemctl enable rsyncd

2.3 測試

rsync -avz /etc/hosts rsync_backup@10.0.0.41::backup

rsync_backup # 服務端配置檔案定義的認證使用者
::			 # 守護程序模式的標識
backup       # 服務端配置檔案定義的模組名
# 執行此命令後需要輸入密碼  密碼為服務端定義的密碼檔案的密碼

# 客戶端執行推送命令
[root@nfs ~]#rsync -avz /etc/hosts rsync_backup@10.0.0.41::backup

# 檢視推送結果
[root@backup /backup]#ll
total 4
-rw-r--r-- 1 rsync rsync 158 Jun  7  2013 hosts


模組後面也可以加路徑:  服務端目錄如不存在 會自動建立
[root@nfs ~]#rsync -avz /etc/hosts rsync_backup@10.0.0.41::backup/oldboy/
Password: 
sending incremental file list
created directory oldboy
hosts

sent 140 bytes  received 72 bytes  60.57 bytes/sec
total size is 158  speedup is 0.75
# 檢視結果
[root@backup /backup]#ll
total 4
-rw-r--r-- 1 rsync rsync 158 Jun  7  2013 hosts
drwxr-xr-x 2 rsync rsync  19 Nov 14 01:16 oldboy


將伺服器上的11.txt下載到當前目錄
[root@nfs ~]# rsync -avz rsync_backup@10.0.0.41::backup/oldboy/11.txt .

3. rsync 免密碼互動及引數選項

指定密碼檔案實現免互動
第一種方法: 使用密碼檔案方式
[root@web01 ~]# cat /etc/rsync.pass 
123456
修改檔案許可權
[root@web01 ~]# chmod 600 /etc/rsync.pass
使用密碼密碼檔案
[root@web01 ~]# rsync -avz /etc/hosts  rsync_backup@10.0.0.41::data --password-file=/etc/rsync.pass
第二種方法: 使用rsync服務的內建變數
RSYNC_PASSWORD 內建變數預設為空,在執行rsync推送命令時候會先讀取此變數,如果有則呼叫,如果沒有定義,則提示讓使用者輸入密碼
1.定義變數
[root@web01 ~]# export RSYNC_PASSWORD=123456
2.直接推送預設會呼叫上面的變數
[root@web01 ~]# rsync -avz /etc/hosts  rsync_backup@10.0.0.41::data




Rsync無差異資料同步 delete引數
以當前的oldboy為準將資料無差異同步給41/root下
rsync  -avz --delete oldboy root@10.0.0.41:/root/

以遠端41為準將資料同步給本地的oldboy目錄
rsync  -avz --delete root@10.0.0.41:/root/oldboy/ oldboy

Rsync無差異資料同步,公司程式碼上線使用:
		  		  程式碼被篡改恢復業務

限速: --bwlimit
[root@backup ~]# rsync -avzP --bwlimit=2 /tmp/1g 10.0.0.7:/root/
root@10.0.0.7's password: 
sending incremental file list
1g
   139,493,376   2%    2.01MB/s    0:51:09 

客戶端:

指令碼+定時任務
1.客戶端提前準備存放的備份的目錄,目錄規則如下:/backup/nfs_172.16.1.31_2018-09-02
2.客戶端在本地打包備份(系統配置檔案、應用配置等)複製至/backup/nfs_172.16.1.31_2018-09-02
3.客戶端最後將備份的資料進行推送至備份伺服器
4.客戶端每天凌晨1點定時執行該指令碼
5.客戶端伺服器本地保留最近7天的資料, 避免浪費磁碟空間

服務端:
1.服務端部署rsync,用於接收客戶端推送過來的備份資料
2.服務端需要每天校驗客戶端推送過來的資料是否完整
3.服務端需要每天校驗的結果通知給管理員
4.服務端僅保留6個月的備份資料,其餘的全部刪除
注意:所有伺服器的備份目錄必須都為/backup

相關文章