備份任務實戰

你名字呢?!發表於2024-10-04

今天的任務主要以實際備份任務入手,完成綜合練習,完成對rsync的綜合運用。

先看需求
再講解
再次動手實踐
客戶端需求
客戶端需求:
1.客戶端每天凌晨1點在伺服器本地打包備份(/etc目錄和/var/log目錄)
2.客戶端備份的資料必須存放至以 "主機名_ip地址_當前時間" 命名的目錄中
3.客戶端最後透過rsync推送本地已經打包好的備份檔案至backup伺服器
4.客戶端伺服器本地保留最近7天的資料,避免浪費磁碟空間
服務端需求
服務端需求:
1.服務端部署rsync,用於接收客戶端推送過來的備份資料
2.服務端需要每天校驗客戶端推送過來的資料是否完整
3.服務端需要每天校驗的結果通知給管理員
4.服務端僅保留6個月的備份資料,其餘的全部刪除
注意:所有伺服器的備份目錄必須都為/backup
客戶端需求拆解
先把大需求,拆分為每一個小需求,思考出解決辦法,然後再綜合操作,也可以寫成指令碼。

1.打包備份
客戶端每天凌晨1點在伺服器本地打包備份(/etc目錄和/var/log目錄)

  • 注意tar命令打包,儘量以相對路徑去打包
  • /etc目錄是為了備份系統配置檔案、應用配置檔案
  • /var/log是為了備份所有應用程式的日誌

/etc備份

[root@nfs-31 ~]#mkdir /backup
[root@nfs-31 ~]#cd / && tar -zcf /backup/etc.tgz etc
[root@nfs-31 ~]#ll /backup/etc.tgz -h
-rw-r--r-- 1 root root 9.4M Apr 19 16:48 /backup/etc.tgz

/var/log備份
[root@nfs-31 ~]#cd / && tar -zcf /backup/log.tgz var/log
[root@nfs-31 ~]#
[root@nfs-31 ~]#ll -h /backup/log.tgz
-rw-r--r-- 1 root root 492K Apr 19 16:50 /backup/log.tgz
2.資料夾命名要求
2.客戶端備份的資料必須存放至以"主機名_ip地址_當前時間"命名的目錄中

期望的結果是,如nfs-31_10.0.0.31_2022-04-19

1.提取主機名
[root@nfs-31 ~]#hostname
nfs-31

2.提取ip地址
[root@nfs-31 ~]#ifconfig eth0 |awk 'NR==2{print $2}'
10.0.0.31

3.時間設定
[root@nfs-31 ~]#date +%F
2022-04-19

4.拼接在一起,資料夾命名的命令如下
[root@nfs-31 ~]#echo "$(hostname)$(ifconfig eth0 |awk 'NR==2{print $2}')$(date +%F)"
nfs-31_10.0.0.31_2022-04-19

5.建立資料夾,你也可以用內網ip操作
要求,在備份目錄下,建立以格式要求的資料夾
mkdir -p /backup/$(hostname)$(ifconfig eth1 |awk 'NR==2{print $2}')$(date +%F)

6.檢查最終的rsync備份目錄
[root@nfs-31 /]#tree /backup/
/backup/
└── nfs-31_172.16.1.31_2022-04-19
├── etc.tgz
└── log.tgz

1 directory, 2 files
3.檔案傳輸
3.客戶端最後透過rsync推送本地已經打包好的備份檔案至backup伺服器

注意rsync服務的搭建,以及認證方式到底是什麼,是密碼檔案,還是變數
export RSYNC_PASSWORD=yuchao666

[root@nfs-31 /]#rsync -avzP /backup/ rsync_backup@172.16.1.41::backup
sending incremental file list
./
nfs-31_172.16.1.31_2022-04-19/
nfs-31_172.16.1.31_2022-04-19/etc.tgz
9,809,921 100% 37.45MB/s 0:00:00 (xfr#1, to-chk=1/4)
nfs-31_172.16.1.31_2022-04-19/log.tgz
507,599 100% 1.85MB/s 0:00:00 (xfr#2, to-chk=0/4)

sent 10,105,838 bytes received 73 bytes 20,211,822.00 bytes/sec
total size is 10,317,520 speedup is 1.02
4.刪除過期檔案
4.客戶端伺服器本地保留最近7天的資料,避免浪費磁碟空間

find /backup/ -mtime +7 -delete
5.整合指令碼
把上述拆解的過程,寫成一個指令碼、批次執行。

當然這個指令碼還可以有多的最佳化。

!/bin/bash

1.建立目錄,注意目錄名字規則

mkdir -p /backup/$(hostname)$(ifconfig eth1|awk 'NR==2{print $2}')$(date +%F)

2.打包備份資料

cd / && tar -zcf /backup/$(hostname)$(ifconfig eth1|awk 'NR==2{print $2}')$(date +%F)/etc.tgz etc
cd / && tar -zcf /backup/$(hostname)$(ifconfig eth1|awk 'NR==2{print $2}')$(date +%F)/log.tgz var/log

3.傳輸客戶端備份資料到,rsync備份伺服器上,別忘記是如何驗證密碼的

export RSYNC_PASSWORD=yuchao666
rsync -az /backup/$(hostname)$(ifconfig eth1|awk 'NR==2{print $2}')$(date +%F) rsync_backup@172.16.1.41::backup

4.刪除過期檔案

find /backup/ -mtime +7 -delete
6.除錯指令碼
只顯示執行過程,而不會真的執行,發生修改,用於除錯程式 -x引數

[root@nfs-31 /]#bash -x rsync_test.sh
服務端需求拆解
1.指令碼化部署rsyncd服務端
1.服務端部署rsync,用於接收客戶端推送過來的備份資料

配置rsyncd服務端的的全流程,也可以寫成指令碼,一鍵安裝了

!/bin/bash

yum install rsync -y

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 = chaoge rsync backup!
path = /backup
EOF

useradd -u 1000 -M -s /sbin/nologin www
mkdir -p /{backup,data}
chown -R www:www /{backup,data}
echo "rsync_backup:yuchao666" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
systemctl start rsyncd
2.校驗資料完整性
2.服務端需要每天校驗客戶端推送過來的資料是否完整

透過md5sum命令即可生成檔案的唯一校驗值,等於新增了一個防偽標記。

此時需要修改客戶端的指令碼了,多一個對檔案校驗的過程

!/bin/bash

1.建立目錄,注意目錄名字規則

mkdir -p /backup/$(hostname)$(ifconfig eth1|awk 'NR==2{print $2}')$(date +%F)

2.打包備份資料

cd / && tar -zcf /backup/$(hostname)$(ifconfig eth1|awk 'NR==2{print $2}')$(date +%F)/etc.tgz etc
cd / && tar -zcf /backup/$(hostname)$(ifconfig eth1|awk 'NR==2{print $2}')$(date +%F)/log.tgz var/log

2.1 新增檔案校驗

md5sum /backup/$(hostname)$(ifconfig eth1|awk 'NR==2{print $2}')$(date +%F)/*.tgz > /backup/md5_tgz.txt

3.傳輸客戶端備份資料到,rsync備份伺服器上,別忘記是如何驗證密碼的

這裡注意,要把該目錄所有的檔案資料發過去了

export RSYNC_PASSWORD=yuchao666
rsync -az /backup/ rsync_backup@172.16.1.41::backup

4.刪除過期檔案

find /backup/ -mtime +7 -delete
此時在rsync服務端,可以透過命令校驗檔案完整性

[root@rsync-41 ~]#md5sum -c /backup/md5_tgz.txt
/backup/nfs-31_172.16.1.31_2022-04-19/etc.tgz: OK
/backup/nfs-31_172.16.1.31_2022-04-19/log.tgz: OK
3.郵件通知
3.服務端需要每天校驗的結果通知給管理員

這裡你就照抄就好,固定步驟而已,更換為你自己的qq郵箱即可

然後需要開啟qq郵箱的smtp伺服器的授權碼,自己去獲取

注意授權碼別洩露給別人

1.安裝配置mailx:

yum install mailx -y

2.郵箱配置檔案

cat > /etc/mail.rc << 'EOF'
set from=877348180@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=877348180@qq.com
set smtp-auth-password=beedsjswqcdfbaje
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
EOF

3.服務端生成校驗結果檔案:

md5sum -c /backup/md5_tgz.txt > /backup/check_md5_result.txt

4.校驗傳送命令,把校驗結果,發給於超老師的qq郵箱

語法 mail -s "郵件主題" 郵箱 < 郵件正文

mail -s "check-rsync-$(date +%F)" 877348180@qq.com < /backup/check_md5_result.txt
image-20220419174846743

4.過期檔案刪除
4.服務端僅保留6個月的備份資料,其餘的全部刪除

find /backup -mtime +180 -delete
5.彙總指令碼(服務端、客戶端)
5.1 客戶端指令碼

!/bin/bash

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
export RSYNC_PASSWORD=yuchao666

1.建立客戶端備份資料的目錄

mkdir -p /backup/$(hostname)$(ifconfig eth1|awk 'NR==2{print $2}')$(date +%F)

2.打包備份etc配置檔案,var/log 日誌目錄

cd / && tar -zcf /backup/$(hostname)$(ifconfig eth1|awk 'NR==2{print $2}')$(date +%F)/etc.tgz etc

cd / && tar -zcf /backup/$(hostname)$(ifconfig eth1|awk 'NR==2{print $2}')$(date +%F)/log.tgz var/log

3.生成校驗檔案,確保備份的資料完整性

md5sum /backup/$(hostname)$(ifconfig eth1|awk 'NR==2{print $2}')$(date +%F)/*.tgz > /backup/md5_result.txt

4.傳輸到備份伺服器

export RSYNC_PASSWORD=yuchao666
rsync -az /backup/ rsync_backup@172.16.1.41::backup

5.刪除過期檔案

find /backup -mtime +7 |xargs rm -rf
5.2 服務端指令碼

!/bin/bash

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

1.校驗資料完整性

md5sum -c /backup/md5_result.txt > /backup/check.txt

2.傳送郵件

mail -s "check-rsync-$(date +%F)" 877348180@qq.com < /backup/check.txt

3.刪除過期檔案

find /backup -mtime +180 |xargs rm -rf
6.定時任務
服務端要求是每天校驗

0 0 * * * /bin/bash /scripts/server_rsync.sh > /tmp/backup.log 2>&1
客戶端是每天凌晨一點

00 01 * * * /bin/bash /scripts/client_rsync.sh > /tmp/backup.log 2>&1
測試指令碼,服務端、客戶端的指令碼,改為每分鐘試一下,也可以直接執行該指令碼,檢視結果。


注意測試順序是

先客戶端
再服務端
學習作業
1.理解任務需求

2.拆解任務需求、一步步思考,應該如何敲命令

3.整合所有操作,寫成shell指令碼

4.完成最終正確的備份、定時任務效果,確保正確性。

於超老師的筆記作為參考,自己可以嘗試先自己寫,最後不懂了再來看筆記

相關文章