全网 Rsync 备份解决方案 项目需求 对本项目中 web01、web02 服务器重要数据定时备份推送至后端 backpack 服务器 上。
要求如下 每天晚上 00 点整在 web 服务器上打包备份系统配置文件、网站程序目录及访问日 志并通过 rsync 命令推送到服务器 backup 上备份保留(备份思路可以是先在本地按日 期打包,然后再推到备份服务器 B 上)
服务器主机名分别为 web01、web02、backup 、nfs01,主机信息见下表:
服务器说明
外网 IP(NAT) SSH 用
内网 IP(NAT)交换数据用
主机名
Nginx web 服务器
10.0.0.7/24
172.16.1.7/24
web01
Nginx web 服务器
10.0.0.7/24
172.16.1.8/24
web02
NFS 存储服务器
10.0.0.31/24
172.16.1.31/24
nfs01
Rsync 备份服务器
10.0.0.41/24
172.16.1.41/24
backup
备份要求 每天晚上 00 点整在 Web 服务器上打包备份系统配置文件、网站程序目录及访问 日志并通过 rsync 命令推送备份服务器 backup 上备份保留
具体备份需求
所有服务器的备份目录必须都为 /backup
要备份的系统配置文件包括但不限于:
a) 定时任务服务的配置文件(/var/spool/cron/root
)(适合web和nfs服务器)。
b) 开机自启动的配置文件(/etc/rc.local
)(适合 web 和 nfs 服务器)。
c) 日常脚本的目录(/server/scripts
)。
Web 服务器站点目录假定为/var/html/www
,如果没有可以先模拟创建。
Web 服务器访问日志路径假定为/app/logs
,如果没有可以先模拟创建。
Web 服务器本地保留打包后的 7 天备份数据即可(本地留存不能多于 7 天,因为太多硬盘会满)。
备份服务器 backup 上,保留最近 7 天的备份数据,同时保留 6 个月内每周一的所有数据副本。
备份服务器上,要按照备份数据服务器的内网 IP 为目录保存备份,备份的文件按照时间名字保存。
需要确保备份的数据尽量完整正确,在备份服务器上对备份的数据是否完整进行检查。
每天早晨 8:00 把备份成功或失败结果信息发给系统管理员邮箱中。
项目逻辑架构图
解决思路
1)搭建 backup 服务器
i.部署 rsync 服务
2)搭建 web01 服务器
i.验证 rsync 服务能否推送成功
ii. 开发脚本实现打包、备份、推送、校验、删除
3)配置定时任务每天 8 点定时执行
4)backup 服务器
i.开发脚本实现校验、删除、报警
ii. 配置定时任务每天 00 点定时推送
5)同理搭建存储 web02 服务器
项目实施 搭建 backup 服务器 (虚拟机模拟)
安装服务软件 1 2 [root@backup ~] rsync version 3.1.2 protocol version 31
备份并配置配置文件 /etc/rsyncd.conf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 cp /etc/rsyncd.conf{,.ori} cat >/etc/rsyncd.conf<<EOF #rsync_config_start #created by bincheng #site: https://cakepanit.com uid = rsync gid = rsync use chroot = no fake super = yes max connections = 200 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log ignore errors read only = false list = false hosts allow = 172.16.1.0/24 hosts deny = 0.0.0.0/32 auth users = rsync_backup secrets file = /etc/rsync.password [backup] comment = welcome to oldboyedu backup! path = /backup/ EOF
创建用户和备份目录 1 2 3 4 5 6 7 [root@backup ~] [root@backup ~] uid=1001(rsync) gid=1001(rsync) groups =1001(rsync) [root@backup ~] [root@backup ~] [root@backup ~] drwxr-xr-x 2 rsync rsync 6 4 月 15 12:12 /backup/
启动和检查 1 2 3 4 5 6 7 8 9 10 11 12 systemctl start rsyncd systemctl enable rsyncd systemctl status rsyncd [root@backup ~] root 7521 1 0 11:39 ? 00:00:00 /usr/bin/rsync --daemon --no-detach [root@backup ~] tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN7521/rsync tcp6 0 0 :::873 :::* LISTEN7521/rsync [root@backup ~] COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsync 7521 root 3u IPv4 41439 0t0 TCP *:rsync (LISTEN) rsync 7521 root 5u IPv6 41440 0t0 TCP *:rsync (LISTEN)
配置密码文件 1 2 3 4 5 6 [root@backup ~] [root@backup ~] [root@backup ~] rsync_backup:oldboy [root@backup ~] -rw------- 1 root root 20 4月 15 11:51 /etc/rsync.password
web01 客户端 rsync 部署 1 2 3 4 5 6 [root@web01~] [root@web01 ~] export RSYNC_PASSWORD=123456[root@web01 ~] [root@web01 ~] 123456
验证验证 web01 客户端 rsync 服务能否推送成功 1 2 3 4 5 [root@web01 ~] sending incremental file list hosts sent 89 bytes received 49 bytes 276.00 bytes/sec total size is 332 speedup is 2.41
开发脚本实现打包、备份、推送、校验、删除 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 touch /server/scripts/bak.sh IP=`ifconfig eth1 |awk -F "[ ]+" 'NR==2{print $3}' ` [ -d /backup/$IP ] || mkdir -p /backup/$IP if [ $(date +%w) -eq 2 ] then date =$(date +%F -d "-1day" )_Monday else date =$(date +%F -d "-1day" ) fi cd / &&\tar zcfh /backup/$IP /sysconfig_${date} .tar.gz var/spool/cron/root etc/rc.local server/scripts &&\ tar zcf /backup/$IP /webdata_${date} .tar.gz var/html/www &&\ tar zcf /backup/$IP /accesslog_${date} .tar.gz app/logs &&\ find /backup -type f -name "*.tar.gz" | xargs md5sum >/backup/$IP /check_${date} &&\rsync -az backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password &&\ find backup/ -type f -name "*.tar.gz" -mtime +7 |xargs rm –rf
配置定时任务每天 00 点定时推送 1 2 3 4 [root@web01 /server/scripts] */5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null 00 00 * * * /bin/bash /server/scripts/bak.sh &>/dev/null
backup 服务器开发脚本实现校验、删除、报警 1 2 3 4 5 6 7 touch /server/scripts/bakup.shexport LANG="en" find /backup/ -type f -name "check_${date} *" | xargs md5sum -c >>/tmp/mail_$(date +%F).txt IP=`ifconfig eth1 |awk -F "[ ]+" 'NR==2{print $3}' ` find /backup/ -type f -name "*.tar.gz" -mtime +180|xargs rm -rf find /backup/ -type f ! -name "*_Monday.tar.gz" -mtime +7|xargs rm -rf mail -s "备份校验_$date " 18947117523@163.com </tmp/mail_$(date +%F).txt
配置定时任务每天 8 点执行校验、删除、发送邮件 1 2 3 4 [root@backup /server/scripts] */5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null 00 08 * * * /bin/bash /server/scripts/backup.sh >&/dev/null
校验脚本对比 方案一 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/bin/bash IP=`ifconfig eth1 |awk -F "[ ]+" 'NR==2{print $3}' ` find /backup/ -type f -name "*.tar.gz" -mtime +180|xargs rm -rf find /backup/ -type f ! -name "*_Monday.tar.gz" -mtime +7|xargs rm -rf i=`/usr/bin/ls -l /backup/ |awk -F '[ ]' 'NR>1{print $NF}' `;echo $i &>/dev/null for n in $i do cd /backup/$n [ -f check* ] if [ $? -eq 0 ] then /usr/bin/md5sum -c /backup/$n /check* >>/tmp/mail_$(date +%F).txt if [ $? -ne 0 ] then echo "$n 校验失败" >>/tmp/mail_$(date +%F).txt else echo "$n 校验成功" >>/tmp/mail_$(date +%F).txt fi else echo "没有 $n 的校验文件 " >>/tmp/mail_$(date +%F).txt fi let j++ done echo "总共有$j 个客户端推送成功" >>/tmp/mail_$(date +%F).txtmail -s "备份校验_$date " 244713047@qq.com </tmp/mail_$(date +%F).txt
方案二 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/bin/sh if [ $(date +%w) -eq 2 ];then date ="$(date +%F -d "-1day" ) _week1" else date ="$(date +%F -d "-1day" ) " fi LANG=en find /backup -type f -name "*${date} *.log" |xargs md5sum -c >>$Path /${date} _result.log 2>&1 mail -s "$date bak result" oldboytraining@163.com <$Path /${date} _result.log find /backup/ -type f -mtime +7 ! -name "*week1*" |xargs rm -f find /backup/ -type f -mtime +180|xargs rm -f mail -s "result.log" xxxxx@xx.com </$Path /${date} _result.log
#待更新