rsync 守護程式及實時同步

HammerZe發表於2021-12-29

rsync 守護程式及實時同步

image

rsync簡介

rsync英文稱為remote synchronizetion,從軟體的名稱就可以看出來,rsync具有可使本地和遠端兩臺主機之間的資料快速複製同步映象、遠端備份的功能,這個功能類似於ssh帶的scp命令,但是又優於scp命令的功能,scp每次都是全量拷貝,而rsync可以增量拷貝。當然,rsync還可以在本地主機的不同分割槽或目錄之間全量及增量的複製資料,這又類似cp命令。但是同樣也優於cp命令,cp每次都是全量拷貝,而rsync可以增量拷貝。

?rsync官網

  • rsync監聽埠:873
  • rsync執行模式:C/S client/server
  • rsync簡稱叫做遠端同步,可以實現不同主機之間的資料同步,還支援全量和增量

rsync特性

  • 支援拷貝特殊檔案,如連線檔案、裝置等。
  • 可以有排除指定檔案或目錄同步的功能,相當於打包命令tar的排除功能。
  • 可以做到保持原檔案或目錄的許可權、時間、軟硬連結、屬主、組等所有屬性均不改變 –p。
  • 可以實現增量同步,既只同步發生變化的資料,因此資料傳輸效率很高(tar-N)。
  • 可以使用rcp、rsh、ssh等方式來配合傳輸檔案(rsync本身不對資料加密)。
  • 可以通過socket(程式方式)傳輸檔案和資料(服務端和客戶端)
  • 支援匿名的活認證(無需系統使用者)的程式模式傳輸,可以實現方便安全的進行資料備份和映象。

rsync應用場景

  • 全量備份:全量備份就是指對某一個時間點上的所有資料或應用進行的一個完全拷貝,耗時長。
  • 增量備份:增量備份是針對於上一次備份(無論是哪種備份)備份上一次備份後(包含全量備份、差異備份、增量備份)所有發生變化的檔案,耗時短。
  • 差異備份:備份自上一次完全備份之後有變化的資料。差異備份過程中,只備份有標記的那些選中的檔案和資料夾。它不清除標記,也即備份後不標記為已備份檔案。換言之,不清除存檔屬性。差異備份是指在一次全備份後到進行差異備份的這段時間內,對那些增加或者修改檔案的備份。在進行恢復時,我們只需對第一次全備份和最後一次差異備份進行恢復。

?概念參考:全量,增量,差異備份

區別與cpscp備份

cp命令

  • cp備份:本機複製

  • 格式:cp [選項] 原始檔 目標檔案

cp引數

引數 說明
-a 相當於 -d、-p、-r 選項的集合
-d 如果原始檔為軟連結(對硬連結無效),則複製出的目標檔案也為軟連結
-i 詢問,如果目標檔案已經存在,則會詢問是否覆蓋;
-l 把目標檔案建立為原始檔的硬連結檔案,而不是複製原始檔
-s 把目標檔案建立為原始檔的軟連結檔案,而不是複製原始檔
-p 複製後目標檔案保留原始檔的屬性(包括所有者、所屬組、許可權和時間)
-r 遞迴複製,用於複製目錄
-u 若目標檔案比原始檔有差異,則使用該選項可以更新目標檔案,此選項可用於對檔案的升級和備用
# cp的不是本文重點只舉一個
# 建立一個示例目錄
[root@m01 ~]# mkdir -p ./a/b/c/test.txt
[root@m01 ~]# cp -ar ./a /tmp/ 
[root@m01 ~]# ll /tmp/a/b/c/
total 0
drwxr-xr-x 2 root root 6 Dec 29 15:00 test.txt

scp命令

scp 命令用於 Linux 之間複製檔案和目錄,用於遠端複製,是rcp的加強版,rcp不加密。scp可以加密

  • scp備份:遠端複製

  • 格式:

    • scp [本地檔案路徑] 使用者名稱@[伺服器ip]:[遠端檔案路徑] --- 推模式
    • scp 使用者名稱@[伺服器ip]:[遠端檔案路徑] [本地檔案路徑] --- 拉模式
    # 簡單示例(推模式)
    scp a.txt root@172.16.1.41:/opt/
    
  • 引數:

  scp【本地或遠端檔案的路徑】【伺服器使用者名稱】@【伺服器地址】:【遠端或本地檔案的路徑】
  -1: 強制scp命令使用協議ssh1
  -2: 強制scp命令使用協議ssh2
  -4: 強制scp命令只使用IPv4定址
  -6: 強制scp命令只使用IPv6定址
  -B: 使用批處理模式(傳輸過程中不詢問傳輸口令或短語)
  -C: 允許壓縮。(將-C標誌傳遞給ssh,從而開啟壓縮功能)
  -p:保留原檔案的修改時間,訪問時間和訪問許可權。
  -q: 不顯示傳輸進度條。
  -r: 遞迴複製整個目錄。
  -v:詳細方式顯示輸出。scp和ssh(1)會顯示出整個過程的除錯資訊。這些資訊用於除錯連線,驗證和配置問題。
  -c cipher: 以cipher將資料傳輸進行加密,這個選項將直接傳遞給ssh。
  -F ssh_config: 指定一個替代的ssh配置檔案,此引數直接傳遞給ssh。
  -i identity_file: 從指定檔案中讀取傳輸時使用的金鑰檔案,此引數直接傳遞給ssh。
  -l limit: 限定使用者所能使用的頻寬,以Kbit/s為單位。
  -o ssh_option: 如果習慣於使用ssh_config(5)中的引數傳遞方式,
  -P port:注意是大寫的P, port是指定資料傳輸用到的埠號
  -S program: 指定加密傳輸時所使用的程式。此程式必須能夠理解ssh(1)的選項。
  • 傳輸方式:
    • 格式在上面?
    • push 推:本地上傳到遠端伺服器
    • pull 拉:把遠端伺服器檔案下載到本地
# 推模式:本地上傳到遠端伺服器
[root@m01 tmp]# scp -r a root@172.16.1.41:/opt/
root@172.16.1.41's password: 
# 檢視
[root@backup ~]# ll /opt/
total 0
drwxr-xr-x 3 root root 15 Dec 29 15:12 a

# 拉模式:把遠端伺服器檔案下載到本地
[root@backup ~]# touch /opt/b.txt
[root@m01 ~]# scp root@172.16.1.41:/opt/b.txt ./
root@172.16.1.41's password: 
b.txt                                             100%    0     0.0KB/s   00:00 

cp命令和scp命令都只支援全量複製,rsync支援遠端複製(全量)和增量複製

rsync的傳輸方式

  • push 推:客戶端將資料從本地推送至服務端
  • pull 拉:客戶端將資料從服務端拉取到本地

rsync的傳輸模式

  • 本地方式(類似於cp,不支援推送和拉取,只是單純的複製)
  • 遠端方式(類似於scp,又不同於scp),scp只支援全量備份,rsync支援增量備份和差異備份
  • 守護程式方式(客戶端和服務端)

rsync實際使用

rsync命令

三種格式:

# 本地,沒有推和拉模式
Local:  rsync [OPTION...] SRC... [DEST]

# 通過遠端shell訪問
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

# 通過rsync守護程式訪問
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
	  rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
	  rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

參數列(OPTIONS SUMMARY)

引數 說明
-a 歸檔模式傳輸, 等於-tropgDl -t -r -o -p -g -D -l
-v 詳細模式輸出, 列印速率, 檔案數量等
-z 傳輸時進行壓縮以提高效率
-r 遞迴傳輸目錄及子目錄,即目錄下得所有目錄都同樣傳輸
-t 保持檔案時間資訊(stat命令檢視檔案時間,a/m/ctime)
-o 保持檔案屬主資訊
-g 保持檔案屬組資訊
-p 保持檔案許可權
-l 保留軟連線
-P 顯示同步的過程及傳輸時的進度等資訊
-D 保持裝置檔案資訊
-L 保留軟連線指向的目標檔案
-e 使用的通道協議,指定替代rsh的shell程式
--append 指定檔案接著上次傳輸中斷處繼續傳輸(斷點續傳)
--append-verify 使用引數續傳(在斷點續傳之後,驗證一下檔案,如果不同,修復檔案)
--exclude=PATTERN 指定排除不需要傳輸的檔案
--exclude-from=[檔案路徑] 按照檔案指定內容排除
--bwlimit=100 限速傳輸(單位:MB)
--delete 讓目標目錄和源目錄資料保持一致
--password-file=[密碼檔案路徑] 使用密碼檔案
--port 指定埠傳輸

案例

# -v :詳細模式輸出, 列印速率, 檔案數量等
[root@m01 ~]# rsync -v ./b.txt root@172.16.1.41:/opt/
root@172.16.1.41's password: 
b.txt

sent 88 bytes  received 35 bytes  82.00 bytes/sec
total size is 6  speedup is 0.05
[root@backup opt]# ll
total 4
-rw-r--r-- 1 root root 6 Dec 29 16:22 b.txt

# -z :傳輸時進行壓縮以提高效率
[root@m01 ~]# rsync -vz ./b.txt  root@172.16.1.41:/opt/

# -r :遞迴傳輸目錄及子目錄,即目錄下得所有目錄都同樣傳
[root@m01 opt]# rsync -vzr ./a/ root@172.16.1.41:/opt/
root@172.16.1.41's password: 
sending incremental file list
b/
b/c/
b/c/test.txt

sent 151 bytes  received 43 bytes  129.33 bytes/sec
total size is 0  speedup is 0.00

# -t:保持檔案時間資訊
[root@m01 opt]# rsync -trvz ./a root@172.16.1.41:/opt/

# -o :保持檔案屬主資訊
# -g :保持檔案屬組資訊
[root@m01 opt]# rsync -trvzgo ./a root@172.16.1.41:/opt/

# -p:保持檔案許可權
[root@m01 opt]# chmod 000 a/b/c/test.txt
[root@m01 ~]# rsync -vzrtgop  ./a/b/c/test.txt  root@172.16.1.41:/opt/

# -l:保留軟連線
[root@m01 ~]# rsync -vzrtgopl  ./*  root@172.16.1.41:/opt/

# -P :顯示同步的過程及傳輸時的進度等資訊
[root@m01 opt]# rsync -vzrtgoplP /root root@172.16.1.41:/opt/

# -D:保持裝置檔案資訊
[root@m01 dev]# rsync -vzrtgDopl /dev/tty1  root@172.16.1.41:/opt/

# -t -r -o -p -g -D -l引數可以用-a來替換
[root@m01 opt]# rsync -avzP ./* root@172.16.1.41:/opt/
root@172.16.1.41's password: 
sending incremental file list
1.txt
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=6/7)
a/
a/1.txt -> 1.txt
a/b/
a/b/c/
a/b/c/test.txt
              0 100%    0.00kB/s    0:00:00 (xfr#2, to-chk=0/7)
b/

sent 304 bytes  received 81 bytes  256.67 bytes/sec
total size is 5  speedup is 0.01

rsync守護程式模式

image

服務端

  1. 安裝rsync
[root@backup ~]# yum install -y rsync
  1. 修改配置檔案

模組用於備份

[root@m01 ~]# vim /etc/rsyncd.conf 
uid = rsync      # 啟動服務的使用者id
gid = rsync			# 啟動服務的使用者的組id
port = 873         # 服務預設監聽埠
fake super = yes		# 無須使用root使用者啟動
use chroot = no			# 安全機制
max connections = 200		# 最大連線數
timeout = 600				# 超時時間	
ignore errors				# 忽略錯誤
read only = false			# 只讀許可權
list = false				# 檢視模組列表
auth users = rsync_backup		# 定義虛擬使用者(rsync傳輸過程使用的使用者)
secrets file = /etc/rsync.passwd  # 定義虛擬使用者的密碼
log file = /var/log/rsyncd.log    # 日誌檔案
#####################################
[backup]         				# 模組
comment = welcome to backup!	# 模組備註
path = /backup					# 路徑
[linux]
comment = welcome to linux!
path=/tmp/linux
  1. 建立系統使用者
[root@backup opt]# groupadd rsync -g 666
[root@backup opt]# useradd rsync -u 666 -g 666 -M -s /sbin/nologin -r
  1. 建立密碼檔案
# 密碼自定義
[root@backup opt]# echo "rsync_backup:123456" > /etc/rsync.passwd
  1. 授權(必須授權為600)
[root@backup opt]# chmod 600 /etc/rsync.passwd
  1. 建立備份目錄
[root@backup opt]# mkdir /backup
[root@backup opt]# mkdir /tmp/linux
  1. 目錄授權
[root@backup opt]# chown rsync.rsync /backup/
[root@backup opt]# chown rsync.rsync /tmp/linux/
  1. 關閉防火牆和selinux
[root@backup opt]# systemctl disable --now firewalld
[root@backup opt]# setenforce 0
  1. 啟動rsyncd服務
[root@backup opt]# systemctl start rsyncd

客戶端

客戶端傳輸的方式有以下三種,任選其一

方法一:自己輸入密碼
[root@m01 ~]# rsync -avzP ./* rsync_backup@172.16.1.41::backup

# 注:
# 1、rsync_backup : 虛擬使用者,只在資料傳輸時使用
# 2、172.16.1.41  : backup服務端的IP
# 3、backup       : 模組名稱

方法二:設定密碼檔案,執行時讀取
1、編寫密碼檔案
[root@m01 ~]# echo "123456" > /etc/rsyncd.passwd

2、授權
[root@m01 ~]# chmod 600 /etc/rsyncd.passwd

3、連線
[root@m01 ~]# rsync -avzP --password-file=/etc/rsyncd.passwd  ./* rsync_backup@172.16.1.41::linux


方法三:新增環境變數
1、定義環境變數
[root@m01 ~]# export RSYNC_PASSWORD=123456
	
2、同步
[root@m01 ~]# rsync -avzP  ./* rsync_backup@172.16.1.41::linux

rsync實時同步傳輸

rsync是不支援實時同步的,通常我們藉助於inotify這個軟體來實時監控檔案變化,一旦inotify監控到檔案變,則立即呼叫rsync進行同步。

  1. 安裝inotify(裝在客戶端)
[root@m01 ~]# yum -y install inotify-tools
  1. inotify引數介紹
引數 作用
-m 持續監控
-r 遞迴
-q 靜默,僅列印時間資訊
--timefmt 指定輸出時間格式
--format 指定事件輸出格式
格式如?
格式: 1、 %Xe 事件
2、%w 目錄
3、%f 檔案
-e 指定監控的事件 access 訪問
modify 內容修改
attrib 屬性修改
close_write 修改真實檔案內容
open 開啟
open 開啟
delete 刪除
umount 解除安裝
  1. 開始監控

在m01中建立檔案,修改檔案和刪除等都會被監控到

[root@m01 ~]# /usr/bin/inotifywait  -mrq  --format '%Xe  %w  %f' -e create,modify,delete,attrib,close_write  /root
  1. 實時監控並同步

在m01中執行以下命令,會同步建立,到172.16.1.41中檢視

[root@m01 ~]# /usr/bin/inotifywait  -mrq  --format '%Xe  %w  %f' -e create,modify,delete,attrib,close_write  /root | while read line;do
	cd  /root
	rsync -avzP --delete --password-file=/etc/rsyncd.passwd ./* rsync_backup@172.16.1.41::backup
done

相關文章