Linux備份任務綜合實驗

先ping發表於2024-11-20

任務背景

客戶端需求

客戶端需求:

1.客戶端每一個小時整點在伺服器本地打包備份(/etc目錄和/var/log目錄) 
2.客戶端備份的資料必須存放至以 "主機名_ip地址_當前時間" 命名的目錄中 
3.客戶端最後透過rsync推送本地已經打包好的備份檔案至backup伺服器 
4.客戶端伺服器本地保留最近2天的資料,避免浪費磁碟空間

服務端需求

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

主機列表

客戶端:172.16.1.110  client-110
服務端:172.16.1.241  rsync-test-241

實驗過程記錄

思路:先把大需求,拆分為每一個小需求,思考出解決辦法,然後再綜合操作,最後再寫成指令碼。

一、客戶端

1.打包備份

客戶端每一個小時整點在伺服器本地打包備份(/etc目錄和/var/log目錄)

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

1.1.建立備份目錄/backup

[root@client-110 ~]# mkdir /backup

1.2.打包/etc

[root@client-110 ~]# cd / && tar -czf /backup/etc.tgz etc
[root@client-110 /]# ll -h /backup/
總用量 10M
-rw-r--r-- 1 root root 10M 11月 20 14:48 etc.tgz

1.3.打包/var/log

[root@client-110 /]# cd / && tar -czf /backup/log.tgz var/log
[root@client-110 /]# ll -h /backup/log.tgz 
-rw-r--r-- 1 root root 391K 11月 20 14:57 /backup/log.tgz

2.資料夾命名要求

客戶端備份的資料必須存放至以"主機名_ip地址_當前時間"命名的目錄中,期望的結果是,如client-110_172.16.1.110_2024-11-20_16

2.1.獲取主機名

[root@client-110 /]# hostname
client-110

2.2.提取ip地址

檢視網路卡eth1地址

[root@client-110 /]# ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.1.110  netmask 255.255.255.0  broadcast 172.16.1.255
        inet6 fe80::5054:ff:fef4:86e2  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:f4:86:e2  txqueuelen 1000  (Ethernet)
        RX packets 735  bytes 46116 (45.0 KiB)
        RX errors 0  dropped 680  overruns 0  frame 0
        TX packets 34  bytes 2236 (2.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

透過awk命令提取ip地址

[root@client-110 /]# ifconfig eth1|awk 'NR==2{print $2}'
172.16.1.110

2.3.獲取當前時間

日期_小時

[root@client-110 /]# date +%F_%H
2024-11-20_15

2.4.拼接在一起,資料夾命名的命令如下

[root@client-110 /]# echo "$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F_%H)"
client-110_172.16.1.110_2024-11-20_15

2.5.建立符合要求的目錄

[root@client-110 /]# mkdir -p /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F_%H)
[root@client-110 /]# ls /backup/
client-110_172.16.1.110_2024-11-20_15  etc.tgz  log.tgz
[root@client-110 /]# ll -h /backup/
總用量 11M
drwxr-xr-x 2 root root    6 11月 20 15:29 client-110_172.16.1.110_2024-11-20_15
-rw-r--r-- 1 root root  10M 11月 20 14:48 etc.tgz
-rw-r--r-- 1 root root 391K 11月 20 14:57 log.tgz

2.6.將之前打包好的備份包移動到該目錄

[root@client-110 /]# mv /backup/*.tgz /backup/client-110_172.16.1.110_2024-11-20_15/
[root@client-110 /]# tree /backup/
/backup/
└── client-110_172.16.1.110_2024-11-20_15
    ├── etc.tgz
    └── log.tgz

1 directory, 2 files

3.檔案傳輸

客戶端最後透過rsync推送本地已經打包好的備份檔案至備份伺服器。
此處不展示服務端rysnc搭建,請參考1.在rsync-test-241伺服器上搭建rsync

3.1.1客戶端安裝rsync工具

[root@client-110 /]# yum install -y rsync
已載入外掛:fastestmirror
Loading mirror speeds from cached hostfile
軟體包 rsync-3.1.2-12.el7_9.aarch64 已安裝並且是最新版本
無須任何處理

3.1.2使用RSYNC_PASSWORD變數與rsync服務端同步檔案

[root@client-110 /]# export RSYNC_PASSWORD=mima666
[root@client-110 /]# rsync -avzP /backup/ rsync_backup@172.16.1.241::backup-nfs
sending incremental file list
./
client-110_172.16.1.110_2024-11-20_15/
client-110_172.16.1.110_2024-11-20_15/etc.tgz
     10,406,491 100%   21.32MB/s    0:00:00 (xfr#1, to-chk=1/4)
client-110_172.16.1.110_2024-11-20_15/log.tgz
        399,728 100%  809.87kB/s    0:00:00 (xfr#2, to-chk=0/4)

sent 10,602,412 bytes  received 65 bytes  21,204,954.00 bytes/sec
total size is 10,806,219  speedup is 1.02

4.刪除過期檔案

客戶端機器本地保留最近2天的資料,避免浪費磁碟空間

[root@client-110 /]# find /backup/ -mtime +2 -delete 

5.整合指令碼

把上述拆解的過程,寫成一個指令碼、批次執行。

[root@client-110 /]# vim /scripts/autorsync.sh
[root@client-110 /]# cat /scripts/autorsync.sh 
#!/bin/bash
#0.配置環境變數
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#1.建立符合要求的目錄
mkdir -p /backup/"$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F_%H)"/

#2.打包要備份的資料
cd / && tar -czf /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F_%H)/etc.tgz etc
cd / && tar -czf /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F_%H)/log.tgz var/log

#3.執行同步
export RSYNC_PASSWORD=mima666
rsync -az /backup/ rsync_backup@172.16.1.241::backup-nfs

#4.刪除超過2天的過期檔案
find /backup/ -mtime +2 -delete

6.除錯指令碼

[root@client-110 /]# bash -x /scripts/autorsync.sh 
++ hostname
++ ifconfig eth1
++ awk 'NR==2{print $2}'
++ date +%F_%H
+ mkdir -p /backup/client-110_172.16.1.110_2024-11-20_16/
+ cd /
++ hostname
++ ifconfig eth1
++ awk 'NR==2{print $2}'
++ date +%F_%H
+ tar -czf /backup/client-110_172.16.1.110_2024-11-20_16/etc.tgz etc
+ cd /
++ hostname
++ ifconfig eth1
++ awk 'NR==2{print $2}'
++ date +%F_%H
+ tar -czf /backup/client-110_172.16.1.110_2024-11-20_16/log.tgz var/log
+ export RSYNC_PASSWORD=mima666
+ RSYNC_PASSWORD=mima666
+ rsync -az /backup/ rsync_backup@172.16.1.241::backup-nfs
+ find /backup/ -mtime +2 -delete

二、服務端

1.指令碼化部署rsyncd服務端

服務端部署rsync,用於接收客戶端推送過來的備份資料
配置rsyncd服務端的的全流程請參考1.在rsync-test-241伺服器上搭建rsync,也可以寫成如下指令碼,一鍵安裝

#!/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-nfs]
comment = client backup!
path = /backup
EOF

useradd -u 1000 -M -s /sbin/nologin www
mkdir -p /backup
chown -R www:www /backup
echo "rsync_backup:mima666" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
systemctl start rsyncd

2.校驗資料完整性

服務端需要每次校驗客戶端推送過來的資料是否完整
透過md5sum命令即可生成檔案的唯一校驗值,等於新增了一個防偽標記。

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

[root@client-110 /]# vim autorsync.sh
[root@client-110 /]# cat autorsync.sh 
#!/bin/bash

#0.配置環境變數
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

#1.建立符合要求的目錄
mkdir -p /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F_%H)/

#2.打包要備份的資料
cd / && tar -czf /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F_%H)/etc.tgz etc
cd / && tar -czf /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F_%H)/log.tgz var/log

#2.1新增檔案校驗
md5sum /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F_%H)/*.tgz > /backup/md5_tgz.txt


#3.執行同步
export RSYNC_PASSWORD=mima666
rsync -az /backup/ rsync_backup@172.16.1.241::backup-nfs

2.2.客戶端client-110修改完指令碼後手動執行一次指令碼

[root@client-110 /]# bash  /scripts/autorsync.sh 

2.3.此時在rsync服務端rsync-test-241,可以透過命令校驗檔案完整性

[root@rsync-test-241 ~]# md5sum -c /backup/md5_tgz.txt 
/backup/client-110_172.16.1.110_2024-11-20_16/etc.tgz: 確定
/backup/client-110_172.16.1.110_2024-11-20_16/log.tgz: 確定
[root@rsync-test-241 ~]# 

3.郵件通知

服務端需要每次校驗的結果通知給管理員

這裡照抄就好,需要更換為你自己的qq郵箱即可
然後需要開啟qq郵箱的smtp伺服器的授權碼
注意授權碼別洩露給別人
#1.安裝配置mailx:
yum install mailx -y

#2.郵箱配置檔案

cat > /etc/mail.rc << 'EOF' 
set from=877348***0@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=877348***0@qq.com
set smtp-auth-password=be********aje
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)" 877348***0@qq.com < /backup/check_md5_result.txt

4.過期檔案刪除

服務端僅保留7天的備份資料,其餘的全部刪除

[root@rsync-test-241 ~]#  find /backup/ -mtime +7 -delete

5.將服務端的操作彙總為指令碼

[root@rsync-test-241 ~]# vim /scripts/checkrsync.sh
[root@rsync-test-241 ~]# cat /scripts/checkrsync.sh 
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#1.校驗資料完整性
md5sum -c /backup/md5_tgz.txt > /backup/check_md5_result.txt
#2.傳送郵件
mail -s "check-rsync-$(date +%F)" 877348***0@qq.com < /backup/check_md5_result.txt
#3.刪除過期檔案
find /backup/ -mtime +7 -delete

三、設定定時任務

1.客戶端要求每小時整點執行備份

[root@client-110 /]# crontab -e
crontab: installing new crontab
[root@client-110 /]# crontab -l
0 * * * * /bin/bash /scripts/autorsync.sh > /tmp/backup.log 2>&1

2.服務端要求每次同步後進行校驗

[root@rsync-test-241 ~]# crontab -e
crontab: installing new crontab
[root@rsync-test-241 ~]# crontab -l
30 * * * * /bin/bash    /scripts/checkrsync.sh > /tmp/backup.log 2>&1

相關文章