- A+
所属分类:linux技术
任务背景
客户端需求
客户端需求:
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 #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 #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