1. 程式人生 > 其它 >linux rsync檔案備份

linux rsync檔案備份

第1章 Rsync本地模式和遠端模式

1.命令說明

純通過rsync的命令,來實現,資料目錄A 拷貝到資料目錄B

也就是模擬cp的用法 很簡單

1,安裝
yum install rsync -y

[root@rsync-41 ~]#yum install rsync -y


語法命令,分為幾個模式
本地模式

rsync  引數  源路徑  目標路徑

rsync  -avzP  /var/log   /tmp


遠端模式,推送方式,把自己的資料推送到另一臺機器上(上傳)
語法1,rsync預設走ssh協議
rsync 引數  源路徑  root@ip:目標路徑

rsync -avzP  /var/log/   [email protected]:/opt

語法2
rsync 引數  源路徑  root@ip::目標路徑

遠端模式,拉取方式,拉取別人機器的資料到自己機器上(下載)
rsync  引數  root@ip:源路徑  目標路徑
rsync  引數  root@ip::源路徑目標路徑

rsync -avzP  [email protected]:/var/log/   /tmp/



引數解釋
    -v        詳細模式輸出
    -a        歸檔模式,遞迴的方式傳輸檔案,並保持檔案的屬性,等同於 -rlptgoD
    -r        遞迴拷貝目錄
    -l        保留軟連結
    -p        保留原有許可權
    -t         保留原有時間(修改)
    -g        保留屬組許可權
    -o         保留屬主許可權
    -D        等於--devices  --specials    表示支援b,c,s,p型別的檔案
    -R        保留相對路徑
    -H        保留硬連結
    -A        保留ACL策略
    -e         指定要執行的遠端shell命令
    -E         保留可執行許可權
    -X         保留擴充套件屬性資訊  a屬性


 比較常用的組合引數
 rsync -avzP
-a    保持檔案原有屬性
-v    顯示傳輸細節情況
-z    對傳輸資料壓縮傳輸
-P    顯示檔案傳輸的進度資訊


你在命令列裡,執行命令,喜歡看到命令的執行過程 
-avzP

腳本里面?
bash xxx.sh
rsync -az  

2.本地模式

linux機器本身,資料來回傳送

以後cp命令可以放一邊了,用rsync當cp使用就行

建立兩個測試資料夾
[root@rsync-41 ~]#mkdir /666
[root@rsync-41 ~]#mkdir /777

在測試資料夾裡寫入測試資料 1G的檔案的小
[root@rsync-41 ~]#dd bs=100M count=10 if=/dev/zero of=/666/1G.log
10+0 records in
10+0 records out
1048576000 bytes (1.0 GB) copied, 4.37126 s, 240 MB/s
[root@rsync-41 ~]#ll -h /666/
total 1000M
-rw-r--r-- 1 root root 1000M Apr 20 15:25 1G.log


# 用rsync,支援增量備份
[root@rsync-41 ~]#rsync -avzP /666/ /777
sending incremental file list
./
1G.log
  1,048,576,000 100%  117.57MB/s    0:00:08 (xfr#1, to-chk=0/2)

sent 1,019,848 bytes  received 38 bytes  119,986.59 bytes/sec
total size is 1,048,576,000  speedup is 1,028.13
[root@rsync-41 ~]#ls /777/
1G.log

[root@rsync-41 ~]#touch /666/12.log
[root@rsync-41 ~]#rsync -avzP /666/ /777
sending incremental file list
./
12.log
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)

sent 127 bytes  received 38 bytes  330.00 bytes/sec
total size is 1,048,576,000  speedup is 6,355,006.06




對檔案同步
[root@rsync-41 ~]#yum install rsync -y
把本地的/777/1G.log 檔案 拷貝到/777下

拷貝單個檔案

[root@rsync-41 ~]#rsync -avzP /666/1G.log  /777
sending incremental file list
1G.log
  1,048,576,000 100%  121.58MB/s    0:00:08 (xfr#1, to-chk=0/1)

sent 1,019,826 bytes  received 35 bytes  107,353.79 bytes/sec
total size is 1,048,576,000  speedup is 1,028.16


拷貝單個大檔案,拷貝大檔案時,要注意限速,否則佔用磁碟IO太多
--bwlimit=10 就是限制速度為10M每秒

生成一個2G的檔案
[root@rsync-41 ~]#dd bs=100M count=20 if=/dev/zero of=/666/2G.log
20+0 records in
20+0 records out
2097152000 bytes (2.1 GB) copied, 2.31622 s, 905 MB/s


iotop檢視磁碟的讀寫IO情況

限制單個大檔案的傳輸,速度只給他20M每秒
[root@rsync-41 ~]#rsync -avzP --bwlimit=20 /666/2G.log  /777
sending incremental file list
2G.log
    659,816,448  31%   20.16MB/s    0:01:09


對目錄同步(注意語法的區別)

拷貝都得資料,是否攜帶該目錄本身
[root@rsync-41 ~]#rsync -avzP /var/log    /opt

不拷貝目錄本身,拷貝目錄下的資料
[root@rsync-41 ~]#rsync -avzP /var/log/    /opt


測試資料夾的增量拷貝
[root@rsync-41 ~]#rsync -avzP /666/  /777
sending incremental file list

sent 108 bytes  received 12 bytes  240.00 bytes/sec
total size is 3,145,728,000  speedup is 26,214,400.00
[root@rsync-41 ~]#echo "123" >/666/12.log 
[root@rsync-41 ~]#rsync -avzP /666/  /777
sending incremental file list
12.log
              4 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=2/4)

sent 157 bytes  received 35 bytes  384.00 bytes/sec
total size is 3,145,728,004  speedup is 16,384,000.02




無差異化拷貝
使用--delete引數,將目標目錄資料清空,保證完全和源目錄資料一致
rsync -avzP --delete /666/ /777/

[root@rsync-41 ~]#ls /666
12.log  1G.log  2G.log  作業1.log  作業2.log
[root@rsync-41 ~]#ls /777/
12.log  1G.log  2G.log


[root@rsync-41 ~]#rsync -avzP --delete /666/ /777/
sending incremental file list
./
作業1.log
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/6)
作業2.log
              0 100%    0.00kB/s    0:00:00 (xfr#2, to-chk=0/6)

sent 234 bytes  received 57 bytes  582.00 bytes/sec
total size is 3,145,728,004  speedup is 10,810,061.87


[root@rsync-41 ~]#ls /666/
12.log  1G.log  2G.log  作業1.log  作業2.log
[root@rsync-41 ~]#ls /777/
12.log  1G.log  2G.log  作業1.log  作業2.log




rsync拷貝資料夾,攜帶目錄本身
把666目錄本身,連帶這資料,都拷貝到777下
[root@rsync-41 ~]#rsync -avzP /666  /777/
最終會生成
/777/666/ 該資料夾的資料,和源資料目錄/666是一樣的
[root@rsync-41 ~]#ls /777
12.log  1G.log  2G.log  666  作業1.log  作業2.log



對rsync限速,因為rsync在傳輸資料時,會佔用大量的磁碟IO,以及如果時網路傳輸的話,佔用網路寬頻,會導致其他程式受影響
所以rsync這樣的備份服務,都是在夜裡,凌晨操作,別影響其他程式


--delete
實現/666 和 /777 完全一樣
[root@rsync-41 ~]#rsync -avzP --delete /666/ /777
[root@rsync-41 ~]#ls /666 /777
/666:
12.log  1G.log  2G.log  作業1.log  作業2.log

/777:
12.log  1G.log  2G.log  作業1.log  作業2.log





3.遠端模式

把/666下的資料,拷貝到 /999下

把rsync-41   /666下的資料

拷貝到 nfs-31   /888下

實現如scp的作用

PUSH  推送模式 上傳模式
把rsync-41  /666下的資料,拷貝到 nfs-31  /888下

登入rsync-41
用ip的形式,再用主機名的形式
新增無差異化引數,該引數,慎用!,搞清楚了你在幹什麼!


[root@rsync-41 ~]#rsync -avzP --delete /666/  [email protected]:/888/
輸入nfs-31的密碼

[root@nfs-31 ~]#ls /888/
12.log  2G.log  作業1.log  作業2.log


PULL  拉取模式(要琢磨,資料最終放在了哪裡)
把rsync-41  /666下的資料,拷貝到nfs-31  /888下

[root@nfs-31 ~]#rsync -avzP [email protected]:/666/   /888/

[root@nfs-31 ~]#ls /888
12.log  2G.log  作業1.log  作業2.log

拉取rsync-41的/etc/passwd檔案到 nfs-31的 /888下,使用主機名通訊

[root@nfs-31 ~]#rsync -avzP root@rsync-41:/etc/passwd  /888/
[root@nfs-31 ~]#ls /888
12.log  2G.log  passwd  作業1.log  作業2.log

傳輸整個目錄,包含目錄本身

[root@nfs-31 ~]#rsync -avzP [email protected]:/666  /888/

只傳輸目錄下的檔案,不包含目錄本身

[root@nfs-31 ~]#rsync -avzP [email protected]:/666/  /888/

不同主機之間同步資料 --delete
rsync -avzP --delete  [email protected]:/root   /tmp/

坑:如果和一個空目錄進行完全同步,那麼效果和刪庫,刪根一樣
坑:傳輸過程不限速導致寬頻被佔滿,--bwlimit=30

遠端傳輸  nfs-31下的/888/2G.log  備份到rsync-41的/777下
[root@nfs-31 ~]#rsync -avzP --bwlimit=30 /888/2G.log  [email protected]:/777
[email protected]'s password: 
sending incremental file list
2G.log
  2,097,152,000 100%   30.81MB/s    0:01:04 (xfr#1, to-chk=0/1)

sent 2,039,554 bytes  received 35 bytes  28,930.34 bytes/sec
total size is 2,097,152,000  speedup is 1,028.22


[root@rsync-41 ~]#ls /777
2G.log

-a   保持檔案原有屬性
-v   顯示傳輸過程
-z   壓縮傳輸資料
-P   顯示傳輸進度
遠端備份檔案,且改名
[root@nfs-31 ~]#rsync -avzP /888/作業1.log  [email protected]:/777/420作業

[root@rsync-41 ~]#ls /777
2G.log  420作業

遠端傳輸 nfs-31下的 /888/  備份到 rsync-41的 /777下,且是無差異化備份
等於清空原有的 /777 下的資料
原有資料
[root@rsync-41 ~]#ls /777
2G.log  420作業

[root@nfs-31 ~]#ls /888
12.log  2G.log  passwd  作業1.log  作業2.log


[root@nfs-31 ~]#rsync -avzP --delete /888/  [email protected]:/777

[root@rsync-41 ~]#ls /777
12.log  2G.log  passwd  作業1.log  作業2.log

第2章 Rsync服務模式-服務端配置

0.為什麼需要服務模式
Rsync 藉助 SSH 協議同步資料存在的缺陷:
1.使用系統使用者(不安全) /etc/passwd
2.使用普通使用者(會導致許可權不足情況)
3.守護程序傳輸方式: rsync 自身非常重要的功能(不使用系統使用者,更加安全)

1.安裝rsync

yum install rsync -y

2.修改配置檔案

複製貼上如下程式碼即可

[root@rsync-41 ~]#cat > /etc/rsyncd.conf << 'EOF'
> uid = www 
> gid = www 
> 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 = yuchaoit.cn about rsync
> path = /backup
> 
> [data]
> comment = this is secord backup dir,to website data..
> path = /data
> EOF

3.建立使用者以及資料目錄

根據你的配置檔案中定義的資訊,建立對應的使用者,備份的目錄
該無法登入的使用者,只是用於執行程序的賬戶
[root@rsync-41 ~]#useradd -u 1000 -M -s /sbin/nologin www

建立配置檔案中定義的2個備份目錄
[root@rsync-41 ~]#mkdir -p /data/  /backup


修改備份目錄的許可權
[root@rsync-41 ~]#chown -R www:www /data/
[root@rsync-41 ~]#chown -R www:www /backup/
[root@rsync-41 ~]#ll -d /data   /backup/
drwxr-xr-x 2 www www 6 Apr 20 16:53 /backup/
drwxr-xr-x 2 www www 6 Apr 20 16:53 /data


4.建立rsync專用的賬戶密碼(這一步很重要,有錯基本也是來這裡排查)

1.建立密碼檔案,寫入賬戶和密碼,用於和客戶端連線時候的認證
[root@rsync-41 ~]#vim /etc/rsync.passwd

2.寫入賬戶密碼
[root@rsync-41 ~]#cat /etc/rsync.passwd 
rsync_backup:123456

3.待會客戶端向rsync伺服器推送資料,就得用這個賬號密碼!!!

4.這一步,非常重要,rsync要求降低密碼檔案的許可權,且必須是600
[root@rsync-41 ~]#chmod 600 /etc/rsync.passwd 
[root@rsync-41 ~]#ll /etc/rsync.passwd 
-rw------- 1 root root 20 Apr 20 16:58 /etc/rsync.passwd

5.加入開機自啟

設定rsyncd服務,執行,且開機自啟
[root@rsync-41 ~]#systemctl start rsyncd  啟動
[root@rsync-41 ~]#systemctl enable  rsyncd  開機自啟


檢查rsyncd服務是否執行,以及該服務的執行日誌
先備份
[root@rsync-41 ~]#cp /etc/rsync.passwd{,.ori} 
[root@rsync-41 ~]#ls /etc/rsync.passwd*
/etc/rsync.passwd  /etc/rsync.passwd.ori

[root@rsync-41 ~]#systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
   Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-04-20 17:06:57 CST; 4min 27s ago
 Main PID: 2364 (rsync)
   CGroup: /system.slice/rsyncd.service
           └─2364 /usr/bin/rsync --daemon --no-detach

Apr 20 17:06:57 rsync-41 systemd[1]: Started fast remote file copy program daemon.
Apr 20 17:06:57 rsync-41 systemd[1]: Starting fast remote file copy program da.....
Apr 20 17:06:57 rsync-41 rsyncd[2364]: params.c:Parameter() - Ignoring badly f...rs
Apr 20 17:06:57 rsync-41 rsyncd[2364]: rsyncd version 3.1.2 starting, listenin...73
Hint: Some lines were ellipsized, use -l to show in full.



6.檢查服務是否執行

[root@rsync-41 ~]#systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
   Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-04-20 17:06:57 CST; 4min 27s ago
 Main PID: 2364 (rsync)
   CGroup: /system.slice/rsyncd.service
           └─2364 /usr/bin/rsync --daemon --no-detach

Apr 20 17:06:57 rsync-41 systemd[1]: Started fast remote file copy program daemon.
Apr 20 17:06:57 rsync-41 systemd[1]: Starting fast remote file copy program da.....
Apr 20 17:06:57 rsync-41 rsyncd[2364]: params.c:Parameter() - Ignoring badly f...rs
Apr 20 17:06:57 rsync-41 rsyncd[2364]: rsyncd version 3.1.2 starting, listenin...73
Hint: Some lines were ellipsized, use -l to show in full.


無論是學習期間還是上班了,都養成好習慣
給別人啟動了某程式後,給自己啟動某程式
務必去檢查,驗證是否正確

[root@rsync-41 ~]#ps -ef |grep 'rsync' |grep -v 'grep'
root       2364      1  0 17:06 ?        00:00:00 /usr/bin/rsync --daemon --no-detach


[root@rsync-41 ~]#netstat -tunlp |grep rsync
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      2364/rsync          
tcp6       0      0 :::873                  :::*                    LISTEN      2364/rsync          

第3章 Rsync服務模式-客戶端配置

1.安裝rsynv

yum install rsync -y

2.配置密碼檔案以及授權

此時rsync客戶端,需要把資料推送到rsync服務端
但是需要賬戶認證,這個賬戶密碼,是服務端指定好的
賬號:rsync_backup
密碼:123456

客戶端需要做的操作有2個,提供密碼認證

1.生成密碼檔案,每次連線都指定這個密碼檔案

2.生成密碼變數,讓當前系統中存在叫做 RSYNC_PASSWORD 這個變數,以及變數的指,是配置檔案中的密碼即可

進行客戶端資料傳送

下載,服務端rsync-41的資料

賬號:rsync_backup

密碼:123456

推送,備份,傳送nfs-31的資料到rsync-41

把客戶端的資料,傳送給服務端的backup備份模組下

語法,不一樣了,注意語法的寫法!!!

把客戶端的 /tmp/200M.log  備份,傳送到rsync-41機器上的backup模組下

rsync -avzP /tmp/200M.log   賬戶@主機名::模組名

預設無密碼變數,也無密碼檔案,需要你自己輸入該rsync_backup虛擬使用者的密碼
需要互動式的輸入密碼,無法在指令碼中使用rsync同步命令
rsync基本都是和指令碼結合使用

[root@nfs-31 ~]#rsync -avzP /tmp/200M.log rsync_backup@rsync-41::backup

[root@rsync-41 ~]#ls /backup/
200M.log


非互動式密碼的操作,如下2個方法
1.生成密碼檔案,每次連線都指定這個密碼檔案(在客戶端生成)
[root@nfs-31 ~]#echo '123456' > /etc/my_rsync.pwd
還必須降低密碼檔案的許可權才行,必須是600
[root@nfs-31 ~]#chmod 600 /etc/my_rsync.pwd 
[root@nfs-31 ~]#ll /etc/my_rsync.pwd 
-rw------- 1 root root 7 Apr 20 17:47 /etc/my_rsync.pwd

此時可以傳輸資料了,往data模組下傳輸
[root@nfs-31 ~]#rsync -avzP --password-file=/etc/my_rsync.pwd /tmp/200M.log rsync_backup@rsync-41::data

[root@rsync-41 ~]#ls /data
200M.log


如果是指令碼中的話,去掉vP顯示過程的引數去掉
[root@nfs-31 ~]#rsync -az --password-file=/etc/my_rsync.pwd /tmp/200M.log rsync_backup@rsync-41::data


2.生成密碼變數,讓當前系統中存在叫做 RSYNC_PASSWORD 這個變數 ,以及變數的值,是配置檔案中的密碼即可
[root@nfs-31 ~]#export RSYNC_PASSWORD='123456'


[root@nfs-31 ~]#rsync -avzP  /tmp/200M.log rsync_backup@rsync-41::backup

[root@rsync-41 ~]#ls /backup/
200M.log



下載備份伺服器的資料

[root@nfs-31 ~]#rsync -avzP rsync_backup@rsync-41::backup   /888/
receiving incremental file list
./
200M.log
            200 100%  195.31kB/s    0:00:00 (xfr#1, to-chk=0/2)

sent 50 bytes  received 141 bytes  382.00 bytes/sec
total size is 200  speedup is 1.05


[root@nfs-31 ~]#ls /888
200M.log


要輸入密碼
1.的確沒指定密碼檔案
2.是否有密碼變數呢?

如何需要輸入密碼呢
撤銷這個密碼變數
[root@nfs-31 ~]#unset RSYNC_PASSWORD 
或者重新登入,只要密碼變數失效,就必須輸入密碼了,或者使用密碼檔案

rsync -avzP rsync_backup@rsync-41::backup   /tmp/


非互動式的密碼認證方式
1.使用密碼變數
[root@nfs-31 ~]#export RSYNC_PASSWORD='123456'


2.指定密碼檔案
[root@nfs-31 ~]#rsync -avzP --password-file=/etc/my_rsync.pwd rsync_backup@rsync-41::backup /tmp/


[root@nfs-31 ~]#ls /tmp/
200M.log  ks-script-U3fLGb  vmware-root  yum.log



錯誤,檔名不對,示範
[root@nfs-31 ~]#rsync -avzP --password-file=/etc/my_rsync.pwd rsync_backup@rsync-41::backup/200M.logggggggggg  /tmp/
receiving incremental file list
rsync: link_stat "200M.logggggggggg" (in backup) failed: No such file or directory (2)

sent 8 bytes  received 106 bytes  228.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1651) [Receiver=3.1.2]

關於rsync的常見錯誤

rsync由於配置步驟比較細節,比較坑多,較多,可能會遇見各種錯誤

遇見問題,遇見錯誤

看日誌
看日誌
看日誌
看日誌
看日誌
思路一:看服務指定的日誌檔案在哪

思路二:檢查是否運行了,以及它的執行日誌部分資訊

檢查是否開機執行
systemctl is-enabled

systemctl restart  重啟服務
systemctl status  檢視服務狀態
systemctl start  啟動服務
systemctl enable 設定服務開機自啟
systemctl disable 禁止開機自啟