1.
总体架构与前置准备
- 明确目标:高可用、可恢复、可扩容,并优先考虑台湾节点网络延迟与法遵(数据存放位置)。
- 准备工具:SSH key 管理(ssh-agent)、Ansible、Terraform、Prometheus(node_exporter)、Alertmanager、Restic 或 Borg、对象存储(S3 或 S3 兼容)、版本控制(Git)。
- 账户与权限:为自动化脚本建立 API key(VPS 提供商)、限制权限仅能创建/删除实例与快照,另建只读备份账户。
2.
备份策略设计(策略层)
- 分类备份:系统镜像(快照)、文件备份(配置、日志)、数据库备份(MySQL/PostgreSQL)三类分别处理。
- 频率与保留:系统快照(日间增量+每周全量保留 4 周)、文件每日差异备份保留 14 天、数据库每日全量+每小时增量(WAL)保留 7-30 天。
- 备份位置:本地先行备份 -> 同区域对象存储(S3) -> 跨区或者第三方(另一区域)做异地备份。
3.
数据库备份具体操作(MySQL)
- 小型/可停机场景:使用 mysqldump:mysqldump --single-transaction --routines --events -u root -p'密码' 数据库名 | gzip > /backup/db-$(date +%F).sql.gz
- 在线大库:使用 Percona xtrabackup:xtrabackup --backup --target-dir=/tmp/xbk && xtrabackup --prepare --target-dir=/tmp/xbk && tar czf /backup/xbk-$(date +%F).tar.gz -C /tmp/xbk .
- 增量/PITR:启用 binlog(MySQL)或 WAL(Postgres),并用 wal-e/wal-g 推送到对象存储,实现按时间点恢复。
4.
文件与系统级备份具体操作
- LVM 快照(系统盘支持 LVM):lvcreate -L1G -s -n snap01 /dev/vg0/data; mount -o ro /dev/vg0/snap01 /mnt/snap; rsync -a /mnt/snap/ /backup/snap-$(date +%F)/; lvremove /dev/vg0/snap01
- rsync 增量备份到对象存储网关:rsync -az --delete /etc/ backup@backup-host:/data/hosts/host1/;或者用 restic:restic -r s3:s3.example.com/bucket backup /etc --password-file /root/restic.pass
- 加密与校验:restic/borg 自动加密并支持校验,定期运行 restic check 或 borg check。
5.
备份自动化(Cron/Systemd)
- 使用系统定时执行脚本:/etc/cron.d/db-backup:0 2 * * * root /usr/local/bin/mysql-backup.sh
- 更稳健的方式:systemd timer + service,便于日志管理与失败重试。示例:/etc/systemd/system/db-backup.timer 与 db-backup.service,启用后 systemctl enable --now db-backup.timer。
- 异常报警:备份脚本执行后检查返回码并通过邮件/Slack/Webhook 上报失败。
6.
备份验证与恢复演练
- 定期演练:每月在隔离环境恢复一次全量系统镜像与数据库,记录时间与问题。
- 恢复步骤示例:1) 从对象存储下载最新备份;2) 挂载或解压到测试主机;3) 导入数据库并做完整性校验(select count(*)、对比表记录数)。
- 自动化验证:编写验证脚本(restore-verify.sh)执行常用查询并返回 0/1,结合 CI 触发周检。
7.
多 VPS 配置管理(Ansible 实践)
- 清单与分组:inventory.ini 按 role(web/db/cache)和 region(taiwan)分组。
- Playbook 示例:ansible-playbook -i inventory site.yml --limit taiwan-web --tags "deploy,config"。把秘钥、证书、监控 agent、logrotate 都统一模板化。
- 不可变基础镜像:使用 Packer 生成基础镜像(含安全补丁、监控 agent),用 Terraform 部署。
8.
监控与指标采集(Prometheus)
- 部署 node_exporter 与 cadvisor(容器使用),Prometheus 拉取指标并在 Alertmanager 设阈值(CPU>75% 5min、内存用完、磁盘 I/O)。
- 自定义指标:应用暴露 /metrics(例如 QPS、队列长度)用于扩容决策。
- 图表与日志:Grafana 可视化,ELK/EFK 收集日志以排查扩容/失败原因。
9.
自动扩容总体思路
- 原理:监控告警触发扩容策略 -> 调用基础设施接口(Terraform/Provider API)创建新 VPS -> Ansible/Cloud-init 配置 -> LB 注册并开始流量。
- 扩容触发器:Prometheus Alertmanager webhook 调用自建 autoscaler 服务(或使用云厂商的云函数)。
10.
自动扩容实现步骤(示例)
- 步骤 1:在 Terraform 中定义可伸缩模块(variable count)。例如用变量 instance_count 控制实例数量。
- 步骤 2:写一个 autoscale.sh:接收 action=up/down;修改 terraform.tfvars(更新 instance_count);terraform apply -auto-approve;完成后触发 ansible-playbook -i inventory dynamic.yml --limit newhosts。
- 步骤 3:新节点加入前进行健康检查脚本(检查服务端口、配置、证书),通过后再把它加入负载均衡(Nginx upstream / HAProxy / LB API)。
11.
无需中断的滚动扩容/缩容建议
- 对容器化:使用 Kubernetes + Cluster Autoscaler(若 VPS 提供商有支持),使用 PodDisruptionBudget 保护关键服务。扩容时先 scale up 新节点并调度 Pod;缩容时用 kubectl drain node 并等待 Pod 迁移。
- 对非容器:在 LB 前实现健康检查,扩容时先把新主机放入 LB;缩容时先把目标主机从 LB 下线,等待会话清空(或使用会话复制/Redis 作会话持久化)。
12.
安全与网络注意事项
- SSH 与密钥:所有服务器使用 deploy 用户并通过 Jump/Bastion 控制访问,禁止密码登录。
- 防火墙:用 ufw/iptables 限制管理端口,仅允许必要的入站。
- API Key 管理:把 API keys 存在 Vault 或加密的 CI 机密中,不要写死在脚本。
13.
问:如何在台湾多 VPS 之间同步备份最稳妥?
- 答:推荐使用对象存储 + restic/borg 做去重与加密的集中备份流程:每台 VPS 定时将数据备份到同一 S3 兼容桶(可选跨区复制到另一区域),结合数据库的 binlog/WAL 推送实现增量与PITR。对于系统镜像使用 VPS 提供商的快照 API 定期抓取并异地保留。关键是实现自动化上传、加密、校验(restic check)与恢复演练。
14.
问:如何实现自动扩容但不丢失会话/数据?
- 答:把会话从本地内存剥离到集中式存储(Redis、Memcached 或数据库),负载均衡器做健康检查并支持会话粘滞策略尽量短时间内迁移;扩容时新节点先完成配置并加入 LB;缩容时先从 LB 下线目标节点并等待 active 会话为 0 或超时后再回收。容器化场景下用 PodDisruptionBudget 与优雅关闭(preStop hook)保障不中断。
15.
问:如何定期演练恢复流程以确保备份可用?
- 答:建立恢复演练计划:每月至少一次在隔离网络中做一次全量恢复(系统镜像+数据库),记录恢复时间、遇到的问题并更新 runbook。自动化恢复演练可以用 CI/CD 驱动(定时触发恢复脚本并执行校验脚本),并用变更管理把结果纳入 SRE 指标档案。
来源:运维手册从备份到自动扩容针对台湾多vps的管理流程建议