1.1 目标:保证美国站群(多台VPS)在单点故障时可在30分钟内恢复主要业务;数据丢失小于最后一次备份点。
1.2 组件:N台应用VPS、独立数据库(或DB在主机上)、负载均衡/反向代理、DNS(建议Route53/Cloudflare)、备份对象存储(S3/Backblaze)和监控告警。
2.1 采用3-2-1原则:3份数据、2种介质、1份异地。
2.2 分类:静态文件用增量文件备份(rsync/restic/borg),快照用于系统盘完整恢复,数据库使用逻辑或物理备份(mysqldump/xtrabackup)。
2.3 保留策略:最近7天每日,7天后按周保留4周,按月保留6个月。
3.1 在运维主机生成密钥:ssh-keygen -t ed25519 -C "ops@company"。
3.2 将公钥分发到每台VPS:ssh-copy-id -i ~/.ssh/id_ed25519.pub root@vps-ip或将公钥追加到~/.ssh/authorized_keys,禁止密码登录并限制root通过/ etc/ssh/sshd_config设置。
3.3 在每台主机安装必要工具:apt-get update && apt-get install -y rsync cron jq awscli(或使用yum)。
4.1 目录结构:本地/备份服务器/backend/backups/www_www.example.com/。
4.2 初始全量:远程VPS执行 rsync -aAX --delete --numeric-ids /var/www/ ops@backup:/backups/www/20250601/。
4.3 增量保留(硬链接):在备份主机上使用脚本(示例):
prev=/backups/www/last; dest=/backups/www/$(date +%F); mkdir -p $dest; rsync -a --link-dest=$prev root@vps:/var/www/ $dest/; ln -snf $dest /backups/www/last
4.4 将备份上传到S3:aws s3 sync /backups/www/ s3://bucket-name/www/ --storage-class STANDARD_IA
5.1 逻辑备份(小库/可停机窗口):
mysqldump -u backup -p'P@ss' --single-transaction --routines --events --triggers --databases db1 db2 | gzip > /backups/db/db_$(date +%F).sql.gz
5.2 大库建议使用Percona XtraBackup进行物理备份并支持增量,基本流程:备份全量->增量->上传到对象存储。参考:xtrabackup --backup --target-dir=/data/xb/20250601。
5.3 校验:上传后用md5sum记录并比对,确保完整性。
6.1 使用提供商快照(AWS/Ec2、DigitalOcean、Vultr等)做系统盘恢复点。示例AWS CLI:aws ec2 create-snapshot --volume-id vol-xxxx --description "daily-$(date +%F)"。
6.2 自动化:将快照流程写成脚本并用cron或Lambda(云函数)触发,保存快照ID并设置生命周期(删除过旧快照)。
6.3 注意:在生产做快照前建议停止写操作或对数据库执行FLUSH TABLES WITH READ LOCK,防止一致性问题。
7.1 使用restic/borg做加密增量备份并上传对象存储,restic示例:restic init -r s3:s3.amazonaws.com/bucket; RESTIC_PASSWORD=xxx restic backup /var/www。
7.2 密钥管理:备份密码与加密key要单独保管(KMS或密码管理器),确保可以在灾难恢复时读取。
7.3 将元数据/索引也同步到异地,避免单点损坏。
8.1 简单任务用cron或systemd timer调度;示例crontab每天2点全库备份:0 2 * * * /usr/local/bin/backup-db.sh >> /var/log/backup-db.log 2>&1。
8.2 配置管理与批量执行用Ansible:写playbook分发备份脚本、配置监控agent、更新防火墙规则。示例任务:- hosts: vps\n tasks:\n - name: copy backup script\n copy: src=backup-db.sh dest=/usr/local/bin/ mode=0755。
8.3 在Ansible中也可触发备份并收集状态,做集中告警。
9.1 恢复优先级:1)DNS指向健康节点、2)数据库恢复、3)文件恢复、4)应用回滚配置。
9.2 恢复步骤示例:
步骤A:确认故障原因并从监控获取最后健康时间点;
步骤B:如果整机不可用,从快照或S3下载最近备份并在新VPS上还原(解压db,restic restore或rsync);
步骤C:恢复数据库:gunzip < db_20250601.sql.gz | mysql -u root -p或按xtrabackup流程恢复物理备份;
步骤D:切换DNS(Route53)权重或更新A记录,监控流量并验证应用正常;
9.3 定期演练:每季度进行一次完整的恢复演练并记录耗时与失败点。
Q:站群中某台美国VPS被攻击后,如何快速把流量切到健康节点?
A:先通过监控确认不可恢复,使用DNS提供商(如Route53或Cloudflare)将故障节点A记录切到健康IP或使用预配置的加权/冗余记录;若使用Cloudflare,启用"Under Attack"或切换到备用负载均衡。确保DNS TTL设置较短(如60-300s)以加快切换。
Q:数据库备份是否只用mysqldump就够了?什么时候必须用物理备份?
A:小型、可暂停的数据库mysqldump足够且易恢复;大库或要求低恢复时间/事务一致性(尤其InnoDB大量写入)建议用物理备份工具如Percona XtraBackup或基于文件系统快照的备份,以减少停机时间与保证一致性。
Q:如何验证备份有效性并降低恢复失败风险?
A:建立自动化校验流程:每次备份后校验md5/sha256,定期从备份中随机恢复到隔离环境并运行基础健康检查(应用启动、数据库完整性、页面响应)。同时记录恢复时间与问题并在Runbook中更新改进措施。