文章目录
- 一、环境规划
- 1.1 网络拓扑
- 1.2 目录结构规划
- 1.3 备份策略
- 二、部署实施
- 2.1 备份服务器配置
- 2.1.1 安装必要软件
- 2.1.2 创建备份用户和目录
- 2.1.3 配置rsync服务端 `/etc/rsyncd.conf`
- 2.1.4 创建认证文件
- 2.1.5 配置systemd服务
- 2.1.6 启动服务
- 2.2 客户端配置(LAMP/LNMP机器)
- 2.2.1 创建备份脚本
- 2.2.2 创建LNMP备份脚本
- 2.2.3 配置定时任务
- 2.3 批量部署脚本
- 2.3.1 使用Ansible批量部署
- 2.4 监控和日志收集
- 三、测试方案
- 3.1 单元测试
- 3.2 集成测试
- 3.3 压力测试
- 四、交付文档
- 4.1 系统架构图
- 4.2 操作手册
- 五、日常运维
- 5.1 监控告警
- 5.2 定期维护任务
- 5.3 性能优化
- 六、应急预案
- 6.1 故障恢复流程
- 6.2 演练计划
基于CentOS 7.9系统的全网备份方案,以下是完整的实施流程:
一、环境规划
1.1 网络拓扑
┌─────────────────────────────────────────────────┐ │ 备份服务器 │ │ IP: 10.0.0.100 │ │ Hostname: backup-server │ │ OS: CentOS 7.9 │ │ Rsync版本: 3.1.2 │ └─────────────┬───────────────────────────────────┘ │ │ ┌─────────┴─────────┐ │ │ ▼ ▼ ┌──────┐ ┌──────┐ │LAMP │ │LNMP │ │机器组│ │机器组│ │(50台)│ │(50台)│ └──────┘ └──────┘1.2 目录结构规划
/backup/ # 备份根目录 ├── lamp/ # LAMP备份 │ ├── web-01/ # 按主机名区分 │ │ ├── web/ # 网站文件 │ │ ├── config/ # 配置文件 │ │ ├── database/ # 数据库备份 │ │ ├── logs/ # 日志文件 │ │ └── metadata/ # 元数据 │ └── web-02/ ├── lnmp/ # LNMP备份 ├── scripts/ # 备份脚本 ├── logs/ # 备份日志 ├── temp/ # 临时目录 └── rsync.pid # PID文件1.3 备份策略
- 频率:每天凌晨2:00全量备份
- 保留策略:保留最近7天备份
- 异地备份:每周同步到异地存储
- 完整性检查:MD5校验
二、部署实施
2.1 备份服务器配置
2.1.1 安装必要软件
# 安装rsync和相关工具yuminstall-yrsyncrsync-daemon inotify-tools tree yuminstall-y mariadb-client# 用于数据库备份2.1.2 创建备份用户和目录
# 创建备份用户groupaddbackupuseradd-g backup -s /sbin/nologin -M rsyncbackupecho"rsyncbackup:StrongPass@2024"|chpasswd# 创建目录结构mkdir-p /backup/{lamp,lnmp,scripts,logs,temp}mkdir-p /etc/rsync.dchown-R rsyncbackup:backup /backupchmod750/backup2.1.3 配置rsync服务端/etc/rsyncd.conf
# /etc/rsyncd.conf uid = rsyncbackup gid = backup use chroot = no max connections = 100 timeout = 300 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 = 10.0.0.0/16 hosts deny = * # 全局排除列表 exclude = lost+found/ exclude = .tmp/ exclude = .cache/ exclude = .Trash-*/ # LAMP备份模块 [lamp_backup] path = /backup/lamp auth users = rsyncbackup secrets file = /etc/rsync.passwd comment = LAMP Server Backup Area dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz *.7z # LNMP备份模块 [lnmp_backup] path = /backup/lnmp auth users = rsyncbackup secrets file = /etc/rsync.passwd comment = LNMP Server Backup Area dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz *.7z2.1.4 创建认证文件
# 服务端密码文件echo"rsyncbackup:BackupServerPass123">/etc/rsync.passwdchmod600/etc/rsync.passwd# 客户端密码文件(分发到各机器)echo"BackupServerPass123">/etc/rsync.client.passwdchmod600/etc/rsync.client.passwd2.1.5 配置systemd服务
# /etc/systemd/system/rsync-backup.service [Unit] Description=Fast remote file copy program daemon After=network.target [Service] Type=forking ExecStart=/usr/bin/rsync --daemon --config=/etc/rsyncd.conf ExecReload=/bin/kill -HUP $MAINPID ExecStop=/bin/kill -QUIT $MAINPID PrivateTmp=true Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target2.1.6 启动服务
systemctl daemon-reload systemctlenablersync-backup systemctl start rsync-backup systemctl status rsync-backup# 开放873端口firewall-cmd --permanent --add-port=873/tcp firewall-cmd --reload2.2 客户端配置(LAMP/LNMP机器)
2.2.1 创建备份脚本
#!/bin/bash# /usr/local/bin/backup_lamp.shBACKUP_SERVER="10.0.0.100"MODULE_NAME="lamp_backup"BACKUP_DIR="/backup/lamp/$(hostname)"PASSWD_FILE="/etc/rsync.client.passwd"LOG_FILE="/var/log/backup_$(date+%Y%m%d).log"DATE=$(date+%Y%m%d_%H%M%S)TEMP_DIR="/tmp/backup_$DATE"# 创建临时目录mkdir-p$TEMP_DIR/{web,config,database,logs,metadata}echo"=== 开始备份$(hostname)at$(date)===">>$LOG_FILE# 备份Web文件echo"备份Web文件...">>$LOG_FILEif[-d"/var/www/html"];thentar-zcf$TEMP_DIR/web/web_$DATE.tar.gz -C /var/www html md5sum$TEMP_DIR/web/web_$DATE.tar.gz>$TEMP_DIR/web/web_$DATE.md5fi# 备份Apache配置echo"备份Apache配置...">>$LOG_FILEif[-d"/etc/httpd"];thentar-zcf$TEMP_DIR/config/apache_$DATE.tar.gz -C /etc httpdfi# 备份PHP配置if[-d"/etc/php"];thentar-zcf$TEMP_DIR/config/php_$DATE.tar.gz -C /etc phpfi# 备份MySQLecho"备份MySQL数据库...">>$LOG_FILEMYSQL_DUMP=$TEMP_DIR/database/mysql_$DATE.sql mysqldump --all-databases --single-transaction>$MYSQL_DUMP2>>$LOG_FILEif[$?-eq0];thengzip$MYSQL_DUMPmd5sum${MYSQL_DUMP}.gz>${MYSQL_DUMP}.gz.md5echo"MySQL备份成功">>$LOG_FILEelseecho"MySQL备份失败">>$LOG_FILEfi# 生成元数据echo"生成系统元数据...">>$LOG_FILE{echo"Hostname:$(hostname)"echo"IP Address:$(hostname-I)"echo"OS:$(cat/etc/redhat-release)"echo"Kernel:$(uname-r)"echo"Backup Time:$(date)"echo"Disk Usage:"df-hecho"Installed Packages:"rpm-qa|sort}>$TEMP_DIR/metadata/system_info_$DATE.txt# 同步到备份服务器echo"同步到备份服务器...">>$LOG_FILErsync-avz --password-file=$PASSWD_FILE\--delete\--timeout=300\--progress\$TEMP_DIR/\rsyncbackup@$BACKUP_SERVER::$MODULE_NAME/$(hostname)/\>>$LOG_FILE2>&1SYNC_STATUS=$?# 清理临时文件rm-rf$TEMP_DIR# 保留最近7天的日志find/var/log/ -name"backup_*.log"-mtime +7 -deleteif[$SYNC_STATUS-eq0];thenecho"备份完成: SUCCESS">>$LOG_FILEexit0elseecho"备份完成: FAILED">>$LOG_FILEexit1fi2.2.2 创建LNMP备份脚本
#!/bin/bash# /usr/local/bin/backup_lnmp.sh# 与LAMP脚本类似,主要修改以下部分:# 备份Nginx配置if[-d"/etc/nginx"];thentar-zcf$TEMP_DIR/config/nginx_$DATE.tar.gz -C /etc nginxfi# 备份PHP-FPM配置if[-d"/etc/php-fpm.d"];thentar-zcf$TEMP_DIR/config/php-fpm_$DATE.tar.gz -C /etc php-fpm.dfi2.2.3 配置定时任务
# 编辑crontabcrontab-e# 添加以下内容(每天凌晨2:00执行)02* * * /usr/local/bin/backup_lamp.sh>>/var/log/cron_backup.log2>&12.3 批量部署脚本
2.3.1 使用Ansible批量部署
# deploy_backup.yml----name:部署备份客户端hosts:allvars:backup_server:10.0.0.100rsync_password:"BackupServerPass123"tasks:-name:安装必要软件yum:name:-rsync-mariadb-treestate:present-name:创建备份脚本目录file:path:/usr/local/binstate:directorymode:0755-name:创建认证文件copy:dest:/etc/rsync.client.passwdcontent:"{{ rsync_password }}"owner:rootgroup:rootmode:0600-name:分发备份脚本template:src:"backup_{{ server_type }}.sh.j2"dest:/usr/local/bin/backup.shmode:0755-name:配置定时任务cron:name:"Daily Backup"minute:"0"hour:"2"job:"/usr/local/bin/backup.sh >> /var/log/backup_cron.log 2>&1"user:root2.4 监控和日志收集
# 备份服务器监控脚本#!/bin/bash# /usr/local/bin/backup_monitor.shBACKUP_DIR="/backup"LOG_DIR="/backup/logs"ALERT_EMAIL="admin@example.com"THRESHOLD_DAYS=2# 超过2天无备份告警check_backup(){forserver_typeinlamp lnmp;doforserverin$(ls$BACKUP_DIR/$server_type/2>/dev/null);doLAST_BACKUP=$(find$BACKUP_DIR/$server_type/$server -name"*.tar.gz"-type f -execstat-c %Y{}\;2>/dev/null|sort-nr|head-1)CURRENT_TIME=$(date+%s)DIFF_DAYS=$(((CURRENT_TIME-LAST_BACKUP)/86400))if[$DIFF_DAYS-gt$THRESHOLD_DAYS];thenecho"警告:$server_type/$server超过${DIFF_DAYS}天无备份">>$LOG_DIR/alert_$(date+%Y%m%d).log send_alert"$server_type/$server备份异常"fidonedone}send_alert(){localmessage="$1"echo"$(date):$message"|mail -s"备份系统告警"$ALERT_EMAIL}# 检查磁盘空间check_disk_space(){USAGE=$(df-h $BACKUP_DIR|awk'NR==2 {print$5}'|sed's/%//')if[$USAGE-gt90];thensend_alert"备份磁盘使用率超过90%:${USAGE}%"fi}check_backup check_disk_space三、测试方案
3.1 单元测试
# 1. 测试rsync连接rsync--list-only rsyncbackup@10.0.0.100::lamp_backup --password-file=/etc/rsync.client.passwd# 2. 测试备份脚本bash-n /usr/local/bin/backup_lamp.sh /usr/local/bin/backup_lamp.sh --dry-run# 3. 测试恢复流程# 从备份中恢复一个文件rsync-avz rsyncbackup@10.0.0.100::lamp_backup/web-01/web/web_20240101.tar.gz /tmp/3.2 集成测试
# 创建测试环境# 1. 模拟LAMP机器# 2. 执行完整备份# 3. 验证备份完整性# 4. 执行恢复测试3.3 压力测试
# 使用多个客户端同时备份foriin{1..20};do/usr/local/bin/backup_test.sh&done四、交付文档
4.1 系统架构图
┌─────────────────────────────────────────────────────────┐ │ 备份管理系统 │ ├─────────────────────────────────────────────────────────┤ │ 监控告警 │ 日志分析 │ 策略管理 │ 恢复管理 │ 报表系统 │ └─────────────────────────────────────────────────────────┘ │ ┌─────────────────────────────────────────────────────────┐ │ Rsync服务器 │ ├─────────────────────────────────────────────────────────┤ │ 认证模块 │ 传输模块 │ 日志模块 │ 配额管理 │ 加密传输 │ └─────────────────────────────────────────────────────────┘ │ ┌─────────────────────┼─────────────────────┐ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ LAMP集群 │ │ LNMP集群 │ │ 其他服务 │ │ (50台) │ │ (50台) │ │ │ └─────────────┘ └─────────────┘ └─────────────┘4.2 操作手册
# 备份系统操作手册 ## 1. 日常维护 ### 1.1 查看备份状态 $ systemctl status rsync-backup $ tail -f /var/log/rsyncd.log ### 1.2 清理旧备份 $ /usr/local/bin/clean_old_backup.sh ## 2. 故障处理 ### 2.1 服务重启 $ systemctl restart rsync-backup ### 2.2 连接问题排查 1. 检查端口:nc -zv 10.0.0.100 873 2. 检查认证:cat /etc/rsync.client.passwd 3. 查看日志:tail -f /var/log/backup_*.log ## 3. 数据恢复 ### 3.1 完整恢复 $ /usr/local/bin/restore_full.sh web-01 20240101 ### 3.2 文件级恢复 $ rsync -avz rsyncbackup@10.0.0.100::lamp_backup/web-01/path/to/file ./五、日常运维
5.1 监控告警
# 配置Zabbix监控# 监控项:# 1. 备份成功率# 2. 备份文件大小变化# 3. 备份耗时# 4. 磁盘使用率# 5. 网络带宽使用5.2 定期维护任务
# 每周清理脚本#!/bin/bash# /usr/local/bin/weekly_maintenance.sh# 清理30天前的备份find/backup -name"*.tar.gz"-mtime +30 -deletefind/backup -name"*.log"-mtime +30 -delete# 生成周报generate_weekly_report(){echo"=== 备份系统周报 ==="echo"生成时间:$(date)"echo"总备份数:$(find/backup -name"*.tar.gz"|wc-l)"echo"总大小:$(du-sh /backup)"echo"最近7天备份成功率:$(calculate_success_rate)"}5.3 性能优化
# /etc/rsyncd.conf 优化 # 增加以下配置: [optimization] rsync daemon = yes socket options = SO_KEEPALIVE compress = yes compress level = 6 bwlimit = 10240 # 限制带宽 10MB/s timeout = 600 refuse options = checksum dry-run六、应急预案
6.1 故障恢复流程
# 1. 备份服务器故障# 切换到备用备份服务器# 修改客户端配置指向备用服务器# 2. 网络中断# 启用本地临时备份# 网络恢复后增量同步# 3. 磁盘满# 清理旧备份# 扩展磁盘空间# 启用异地备份6.2 演练计划
每月第一个周六凌晨: 1. 模拟服务器故障恢复 2. 模拟数据恢复测试 3. 检查备份完整性 4. 更新应急预案这个方案提供了完整的备份系统实施框架,包括规划、部署、测试和维护。在实际实施时,需要根据具体环境调整IP地址、目录路径和备份策略。