1. 程式人生 > 實用技巧 >第三章 Rsync備份案例

第三章 Rsync備份案例

一、rsync備份模式

1.本地方式
2.遠端方式
3.守護程序模式

1.守護程序模式

1)安裝rsync

yum install -y rsync

2)配置rsync

[root@backup /backup]# vim /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

3)建立使用者

useradd rsync -s /sbin/nologin -M

4)建立虛擬使用者的密碼檔案

echo "rsync_backup:123456" > /etc/rsync.passwd

chmod 600 /etc/rsync.passwd

5)建立檔案目錄

mkdir /backup

chown -R rsync.rsync /backup

6)啟動服務

[root@backup ~]# systemctl start rsyncd

7)驗證

[root@web01 ~]# rsync -avz [email protected]::backup ./
[root@web01 ~]# rsync -avz file1 [email protected]::backup

2.守護程序模式語法

1)pull拉取資料命令

#語法
rsync [OPTION...] [USER@]HOST::SRC... [DEST]

#示例:
1.拉取rsync備份服務的"backup模組"資料至本地/mnt目錄
[root@nfs01 ~]# rsync -avz [email protected]::backup /mnt/
rsync             #命令
-avz		     #選項
rsync_backup      #遠端主機使用者(虛擬使用者)
192.172.16.1.41   #遠端主機地址  
::backup          #遠端主機模組(不是目錄)
/mnt/	          #將遠端主機資料備份至本地什麼位置     

#注意:
如果是拉取資料,遠端伺服器源資料目錄許可權可以為任意許可權

2)push推送資料命令

#語法
rsync [OPTION...] SRC... [USER@]HOST::DEST

#示例
1.將本地/mnt目錄推送至rsync備份伺服器的backup模組
[root@nfs01 ~]# rsync -avz /mnt/ [email protected]::backup
rsync             #命令
-avz		     #選項
/mnt/			 #本地檔案
rsync_backup      #遠端主機使用者(虛擬使用者)
192.172.16.1.41   #遠端主機地址  
::backup          #遠端主機模組(不是目錄)

#注意:
如果是推送資料,遠端接收檔案的目錄許可權必須是rsync許可權

3.rsync命令選項

1)常用選項

-a           #歸檔模式傳輸, 等於-tropgDl    -t -r -o -p -g -D -l
-v           #詳細模式輸出, 列印速率, 檔案數量等
-z           #傳輸時進行壓縮以提高效率
-r           #遞迴傳輸目錄及子目錄,即目錄下得所有目錄都同樣傳輸。
-t           #保持檔案時間資訊
-o           #保持檔案屬主資訊
-p           #保持檔案許可權
-g           #保持檔案屬組資訊
-l           #保留軟連線
-P           #顯示同步的過程及傳輸時的進度等資訊

-D           #保持裝置檔案資訊
-L           #保留軟連線指向的目標檔案
-e           #使用的通道協議,指定替代rsh的shell程式

--exclude=PATTERN   #指定排除不需要傳輸的檔案模式
--exclude-from=file #檔名所在的目錄檔案
--partial           #斷點續傳
--password-file=xxx #使用密碼檔案

2)限速演示

--bwlimit=100kb       #限速傳輸單位預設是kb (不用z選項)

[root@web01 /tmp]# rsync -avP --bwlimit 100 /tmp/ [email protected]::backup
sending incremental file list
./
data.txt
      5,537,792   1%  100.04kB/s

3)資料一致

--delete            #讓目標目錄和源目錄資料保持一致(不用*)放前後皆可

#推:資料與推送資料的源資料一致
[root@web01 /tmp]# rsync -avP --delete /tmp/ [email protected]::backup
sending incremental file list
deleting file2
deleting file1

sent 223 bytes  received 43 bytes  532.00 bytes/sec
total size is 0  speedup is 0.00

#推:資料與拉取資料的源資料一致
[root@web01 /tmp]# rsync -a -v -P [email protected]::backup /tmp --delete
receiving incremental file list
deleting file4
deleting file3
./
sent 32 bytes  received 203 bytes  470.00 bytes/sec

二、Rsync備份案例

1.需求

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

#服務端需求
1.服務端部署rsync,用於接收客戶端推送過來的備份資料
2.服務端需要每天校驗客戶端推送過來的資料是否完整
3.服務端需要每天校驗的結果通知給管理員
4.服務端僅保留6個月的備份資料,其餘的全部刪除

2.準備伺服器

主機 內網IP
web01 172.16.1.7
backup 172.16.1.41

3.客戶端

1)建立備份目錄

#備份目錄格式
/backup/web01_172.16.1.31_2018-09-02

#取主機名
[root@web01 ~]# hostname
web01

#取IP
[root@web01 ~]# ifconfig eth1 | awk 'NR==2 {print $2}'
172.16.1.7
[root@web01 ~]# hostname -I | awk '{print $2}'
172.16.1.7

#取時間
[root@web01 ~]# date +%F
2020-08-12

#建立目錄
[root@web01 ~]# mkdir -p /backup/`hostname`_`hostname -I | awk '{print $2}'`_`date +%F`

2)打包

[root@web01 ~]# cd /backup/web01_172.16.1.7_2020-08-12/

[root@web01 /backup/web01_172.16.1.7_2020-08-12]# tar zcf conf.tar.gz /etc/passwd /var/log/messages &> /dev/null

3)推送資料

[root@web01 ~]# rsync -avz /backup/web01_172.16.1.7_2020-08-12 [email protected]::backup
sending incremental file list
web01_172.16.1.7_2020-08-12/
web01_172.16.1.7_2020-08-12/conf.tar.gz

sent 62,567 bytes  received 47 bytes  125,228.00 bytes/sec
total size is 68,669  speedup is 1.10

4)將以上內容寫成指令碼

[root@web01 ~]# mkdir /scripts
[root@web01 ~]# vim /scripts/backup.sh
#!/bin/bash
#0.定義變數
SRC=/backup
HOST=`hostname`
IP=`hostname -I | awk '{print $2}'`
DATE=`date +%F`
DIR=${SRC}/${HOST}_${IP}_${DATE}

#1.建立目錄
mkdir -p $DIR

#2.進到目錄下並打包檔案
cd $DIR
tar zcf conf.tar.gz /etc/passwd /var/log/messages &> /dev/null

#3.推送
export RSYNC_PASSWORD=123456
rsync -avz $DIR [email protected]::backup

5)寫入定時任務

[root@web01 ~]# crontab -e
#每天凌晨1點進行檔案備份
00 01 * * * /bin/bash /scripts/backup.sh &> /dev/null

6)清理資料

#模擬生成一個月資料
[root@web01 ~]# for i in {1..30};do date -s 2020/08/$i;sh /scripts/backup.sh;done

#只保留七天的檔案
[root@web01 ~]# find /backup/ -type d -mtime +7 | xargs rm -rf
[root@web01 ~]# ll /backup/
total 0
drwxr-xr-x 2 root root 25 Aug 23 00:00 web01_172.16.1.7_2020-08-23
drwxr-xr-x 2 root root 25 Aug 24 00:00 web01_172.16.1.7_2020-08-24
drwxr-xr-x 2 root root 25 Aug 25 00:00 web01_172.16.1.7_2020-08-25
drwxr-xr-x 2 root root 25 Aug 26 00:00 web01_172.16.1.7_2020-08-26
drwxr-xr-x 2 root root 25 Aug 27 00:00 web01_172.16.1.7_2020-08-27
drwxr-xr-x 2 root root 25 Aug 28 00:00 web01_172.16.1.7_2020-08-28
drwxr-xr-x 2 root root 25 Aug 29 00:00 web01_172.16.1.7_2020-08-29
drwxr-xr-x 2 root root 25 Aug 30 00:00 web01_172.16.1.7_2020-08-30

7)完善指令碼

[root@web01 ~]# vim /scripts/backup.sh
#!/bin/bash
#0.定義變數
SRC=/backup
HOST=`hostname`
IP=`hostname -I | awk '{print $2}'`
DATE=`date +%F`
DIR=${SRC}/${HOST}_${IP}_${DATE}

#1.建立目錄
mkdir -p $DIR

#2.進到目錄下並打包檔案
cd $DIR
tar zcf conf.tar.gz /etc/passwd /var/log/messages &> /dev/null

#3.對檔案生成驗證檔案
md5sum $DIR/conf.tar.gz > $DIR/check.md5

#4.推送
export RSYNC_PASSWORD=123456
rsync -avz $DIR [email protected]::backup

#5.清理資料
find $SRC -type d -mtime +7 | xargs rm -rf

4.服務端

1)安裝郵件系統

[root@backup ~]# yum install -y mailx

#編輯郵件系統
[root@backup ~]# vim /etc/mail.rc 
set [email protected]
set smtp=smtps://smtp.qq.com:465
set [email protected]
set smtp-auth-password=授權碼
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

2)指令碼

[root@web01 ~]# vim /scripts/auth.sh
#!/bin/bash
#0.定義變數
SRC=/backup
HOST=`hostname`
IP=`hostname -I | awk '{print $2}'`
DATE=`date +%F`
DIR=${SRC}/${HOST}_${IP}_${DATE}

#1.驗證檔案的完整性sha1sum(1)
md5sum -c $DIR/check.md5 > $SRC/result.txt
md5sum -c /backup/*_`date +%F`/check.md5 >> /backup/result.txt

#2.把驗證結果傳送到QQ
mail -s "備份資料完整性" [email protected] < $SRC/result.txt

#3.清理資料
find $SRC -type d -mtime +180 | xargs rm -rf

三、Rsync結合inotify實現實時備份

1.安裝

[root@web01 ~]# yum -y install inotify-tools

2.命令測試

[root@web01 ~]# /usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write  /backup

3.引數詳解

-m 持續監控
-r 遞迴
-q 靜默,僅列印時間資訊
--timefmt 指定輸出時間格式
--format 指定事件輸出格式
    %Xe 事件
    %w 目錄
    %f 檔案
-e 指定監控的事件
    access 訪問
    modify 內容修改
    attrib 屬性修改
    close_write 修改真實檔案內容
    open 開啟
    create 建立
    delete 刪除
    umount 解除安裝

4.實時監控指令碼

1)粗糙版

[root@web01 /backup]# vim /scripts/rsync_inotify.sh 
#!/bin/bash
dir=/backup
/usr/bin/inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir | while read line;do
    cd $dir && rsync -az -R --delete . [email protected]::backup --password-file=/etc/rsyncd.password >/dev/null 2>&1
done  &