项目:利用rsync备份全网服务器数据

项目描述

某公司里有一台Web服务器,里面的数据很重要,但是如果硬盘坏了数据就会丢失,现在领导要求把数据做备份,这样Web服务器数据丢失在可以进行恢复

要求如下: 每天晚上00点整在Web服务器A上打包备份系统配置文件、网站程序目录及访问日志并通过rsync命令推送到服务器B上备份保留(备份思路可以是先在本地按日期打包,然后再推到备份服务器B上)。

环境说明

已知3台服务器主机名分别为Web01、BACKUP、NFS01,主机信息建下表。

服务器说明 IP OS 主机名称
Nginx web服务器 172.16.90.111 CentOS 7.9 web01
NFS存储服务器 172.16.90.112 CentOS 7.9 nfs01
Rsync备份服务器 172.16.90.113 CentOS 7.9 backup
  1. 备份要求 每天晚上00点整在Web服务器上打包备份系统配置文件、网站程序目录及访问日志并通过rsync命令推送到备份服务器BACKUP上备份保留。
  2. 备份思路 可以是先在本地按日期打包,然后再推送到备份服务器BACKUP上;NFS存储服务器和Web服务器在实际工作中就是运维主要管理的全部服务器。

项目备份需求

1)所有服务器的备份目录必须都为/backup。

2)要备份的系统配置文件包括但不限于:

  • 定时任务服务的配置文件(/var/spool/cron/root) (适合Web和NFS服务器)。

  • 开机自启动的配置文件(/etc/rc.local) (适合Web和NFS服务器)。

  • 日常脚本的目录 (/server/scripts)。

3)Web服务器站点目录假定为/var/www/html/,如果没有,可以先模拟创建。

4)Web服务器访问日志路径假定为/app/logs,如果没有,可以先模拟创建。

5)Web服务器本地保留打包后的7天备份数据即可(本地留存不能多于7天,因为数据太多硬盘会满)。

6)备份服务器BACKUP上,保留最近7天所有备份数据,保留6个月内每周一的所有数据副本。

7)备份服务器上,要按照备份数据服务器内网IP为目录保存备份,备份的文件按照时间、名称保存。

8)需要确保备份的数据尽量完整准确,在备份服务器上对备份的数据是否完整进行检查。

9)备份服务器BACKUP上,每天早晨8:00把备份成功或失败结果信息发送到系统管理员邮箱里。

服务器说明 备份目录 目录说明 备注
all server /backup 备份目录 统一服务器本地备份目录,便于管理
all server /var/spool/cron/root 定时任务服务配置文件
all server /etc/rc.local 开机自启动配置文件
all server /server/scripts 日常脚本目录 统一服务器本地脚本目录,便于管理
Web server /var/www/html web服务器站点目录 mkdir -p /var/www/html
Web server /app/logs web服务器访问日志路径 mkdir -p /app/logs

项目逻辑架构

项目实施

任务一:服务器创建

初始化3台服务器并将其作为全网备份方案测试服务器

按照规划,最小化部署系统,关闭防火墙,禁用SELinux,确保能够联网。

任务二:服务器部署

(1)搭建备份服务器

  • rsync服务器搭建部署。

  • 开发脚本实现校验、删除、报警。

  • 配置实时任务每天6点实时执行。

(2)Web服务器搭建部署

  • 验证Rsync服务能否推送成功。

  • 开发脚本实现打包备份、推送、校验、删除。

  • 配置定时任务每天0点定时推送(0时是时间的一个分割点)。

(3)NFS服务器搭建部署

  • 验证Rsync服务能否推送成功。

  • 开发脚本实现打包备份、推送、校验、删除。

  • 配置定时任务每天0点定时推送(0时是时间的一个分隔点)。

配置脚本和web服务器类似,过程略。

1、在BACKUP上部署Rsync服务

复制代码
[root@node3 ~]# hostnamectl --static set-hostname backup
​
# 1、安装rsync
​
[root@backup ~]# yum install -y rsync
​
# 2、配置文件
​
[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync                         # 用户
gid = rsync                         # 组
use chroot = no                     # 程序安全设置
max connections = 200               # 客户端连接数
timeout = 300                       # 超时时间
pid file = /var/run/rsyncd.pid      # 进程号文件位置
lock file = /var/run/rsync.lock     # 进程锁
log file = /var/log/rsyncd.log      # 日志文件
fake super = yes                    # 无需rsync以root身份运行,允许接受数据
​
[backup]
        path = /backup                      # 目录
        ignore errors                       # 有错误时忽略
        read only = false                   # 可读可写
        list = false                        # 阻止远程列表(不让通过远程方式看服务端有啥)
        hosts allow = 172.16.90.0/24        # 允许IP
        hosts deny = 0.0.0.0/32             # 禁止IP
        auth users = rsync_backup           # 虚拟用户
        secrets file = /etc/rsync.password  # 存放用户和密码的文件
​
# 3、创建rsync账户及共享目录并修改目录属主为rsync
​
[root@backup ~]# useradd -M -s /sbin/nologin rsync
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync /backup
​
# 4、启动服务
​
[root@backup ~]# systemctl enable --now rsyncd
[root@backup ~]# ps -ef | grep rsync
root      1233     1  0 11:25 ?        00:00:00 /usr/bin/rsync --daemon --no-detach
root      1236  1121  0 11:25 pts/0    00:00:00 grep --color=auto rsync
​
# 5、创建rsync虚拟账户名和密码,并赋予密码文件600权限
​
[root@backup ~]# echo "rsync_backup:123456" > /etc/rsync.password
[root@backup ~]# chmod 600 /etc/rsync.password

2、客户端本地开发打脚本

Nginx webserver,NFS dataserver本地打包备份脚本实现。

1)Web01服务器待备份信息。

  • /var/spool/cron/root、/etc/rc.local、/server/scripts

  • /var/html/www、/app/logs

    2)NFS01服务器待备份信息 Rsync客户端(Nginx NFS)上进行信息备份压缩脚本编写 进行备份压缩脚本编写前,需要进行Web站点目录与日志目录的创建(在web01上执行),以及创建模拟数据。

    1、模拟web站点

    [root@node1 ~]# hostnamectl --static set-hostname web01

    [root@web01 ~]# mkdir /var/html/www -p
    [root@web01 ~]# touch /var/html/www/{1..3}.txt
    [root@web01 ~]# mkdir /app/logs -p
    [root@web01 ~]# touch /app/logs/{a..c}.log
    [root@web01 ~]# tree /var/html/www
    /var/html/www
    ├── 1.txt
    ├── 2.txt
    └── 3.txt

    0 directories, 3 files
    [root@web01 ~]# tree /app/logs/
    /app/logs/
    ├── a.log
    ├── b.log
    └── c.log

    0 directories, 3 files

    2、编写备份脚本

    [root@web01 scripts]# vim backup.sh
    #!/bin/bash
    Date=(date +%F_Week0%w) # 定义时间方式 Host_IP=(ifconfig eth0 | awk '/inet / {print 2}') # 可以有多种方法,能获取IP即可 Backup_Dir="/backup/" # 本地备份路径 Backup_Server_IP=172.16.90.113 # 备份服务器的IP ​ [ ! -d Backup_Dir/Host_IP ] && mkdir -p Backup_Dir/Host_IP # 创建指定目录和IP的目录 ​ echo {Backup_Dir}{Host_IP}/sys_file_bak_{Date}_tar.gz

    按要求打包备份所有本地重要文件

    cd / &&
    tar cf {Backup_Dir}{Host_IP}/sys_file_bak_{Date}_tar.gz var/spool/cron/root &&\ tar rf {Backup_Dir}{Host_IP}/sys_file_bak_{Date}tar.gz etc/rc.d/rc.local &&
    tar rf {Backup_Dir}{Host_IP}/sys_file_bak
    {Date}_tar.gz server/scripts/ &&\ tar zcf Backup_DirHost_IP/www_{Date}tar.gz var/html/www/ &&
    tar zcf Backup_DirHost_IP/app_logs
    ${Date}_tar.gz app/logs/ &&\

    提示:在NFS服务器客户端上不用编写压缩Web服务器的程序与日志目录

    给所有备份的压缩文件建立指纹,放入指纹库flag,后面会验证完整性

    find {Backup_Dir:-/tmp} -type f -name "*{Date}_tar.gz" |xargs md5sum >Backup_Dir/Host_IP/${Date}.flag

    把备份推送到备份服务器

    rsync -az Backup_Dir rsync_backup@{Backup_Server_IP}::backup --password-file=/etc/rsync.password

    删除7天以前的所有本地备份数据

    find ${Backup_Dir:-/tmp} -type f -name "*.tar.gz" -a -name "flag" -mtime +7|xargs rm -f

3、配置定时任务

复制代码
# 3、配置定时任务
1)编辑定时任务,实现每天00:00定时备份本地数据,并推送到备份数据Rsync服务器上。
[root@web01 scripts]# crontab -e    ---编辑定时任务,添加如下内容
#crond-od-002:data backup
00 00 * * * /bin/sh /server/scripts/backup.sh >/dev/null 2>&1
​
2)编辑服务端删除文件脚本文件,删除180天前的所有备份数据,但保存每周一的。
[root@backup ~]# mkdir -p /server/scripts
[root@backup ~]# cd /server/scripts/
[root@backup scripts]# vim /server/scripts/del_bak_data.sh
​
#!/bin/bash
Backup_Dir="/backup/"
#删除7天前的压缩包和flag文件,但是每周一的不删
find ${Backup_Dir:-/tmp} -type f  -name "*tar.gz*" ! -name "*Week01*" -o -name "*flag*" -mtime +7|xargs rm -f
#删除180天前的所有压缩包和flag文件
find ${Backup_Dir:-/tmp} -type f -name "*tar.gz*" -name "*flag*" -mtime +180|xargs rm -f
​
3)配置定时任务,实现服务端180天前数据自动删除。
[root@backup scripts]# crontab -e
#crond-id-002:data backup
00 00 * * * /bin/sh /server/scripts/del_bak_data.sh >/dev/null 2>&1

4、数据传输完整性验证与监控告警

复制代码
服务端针对客户端备份时的md5指纹数据,利用MD5命令进行验证,完成数据传输过程完整性验证。
[root@backup scripts]# vim send_mail.sh 
​
#!/bin/bash
Date=$(date +%F_Week0%w)
Backup_Dir="/backup/"
Check_Log="/tmp/bak.log_$(date +%F)"    # 定时检查备份结果的文件
Admin_Mail=esen_monitor@163.com    # 管理员邮箱,建议使用163
​
find $Backup_Dir -type f -name "${Date}.flag"|xargs md5sum -c >>$Check_Log
​
​
if [ -n "cat $Check_Log" ]
then
    mail -s "$Date backup data info" $Admin_Mail <$Check_Log
else
    echo "$Date backup data error,pls check it." >$Check_Log    # 如果结果文件不存在,日志信息变化,报错
    mail -s "$Date backup data info" $Admin_Mail <$Check_Log
fi
cp $Check_Log{,.ori} && >$Check_Log
复制代码

5、配置mail使用外部SMTP发邮件

复制代码
安装mailx
[root@backup ~]# yum install -y mailx
​
编辑/etc/mail.rc配置文件
​
[root@backup ~]# vim /etc/mail.rc    # 在最后一行加入如下内容
set from=esen_monitor@163.com
set smtp=smtp.163.com
set smtp-auth-user=esen_monitor@163.com
set smtp-auth-password=授权码
set smtp-auth=login
​
各命令参数的含义说明如下:
​
from 是服务器外发邮件的邮件地址,通过注册163邮箱获得。
smtp 是发生的外部SMTP服务器的地址,需要使用相应的SMTP地址。
smtp-auth-user 是外部SMTP服务器认证的用户名,注册时的用户名。
smtp-auth-password 是外部SMTP服务器认证的用户密码(注意是授权码)。
smtp-auth 是邮件认证方式。
​
测试发送邮件
[root@backup ~]# echo "邮件正文" | mail -s "邮件主题" esen_monitor@163.com
相关推荐
Scott9999HH2 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
zzqssliu3 小时前
煤炉自动代拍系统的队列设计与超时控制机制
git·github
Yana.nice3 小时前
Linux 只保留 30 天内日志(find命令删除日志文件)
linux·运维·chrome
码智社3 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海3 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖4 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
fthux5 小时前
“装闭”,让装修套路“装”不下去
人工智能·ai·开源·github·open source
2601_960567966 小时前
电商套图自动化效率的工程量化分析——从逐张生成到批量套图的架构演进
运维·架构·自动化
吳所畏惧7 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh