|
|
这几年折腾 Xiuno,我对“数据备份与灾备恢复演练”越来越看重。不是危言耸听,真出过事故:一次磁盘 SMART 报警被我当成小题大做,结果半夜盘挂了,幸亏前一天手动导出过一次 SQL 才没全军覆没。那之后我把备份这事当成运营的一部分,用约束和演练把风险降下来。
先说备份策略。Xiuno 的核心是数据库,其次是 upload 目录和 config 文件。我的做法是三层:每天全量数据库导出,每小时增量 binlog(或用 mysqldump 搭配 --single-transaction + 逻辑时间点),每周做一次冷备镜像(含站点代码与附件)。全量放对象存储(S3/OSS/又拍都行),增量放同区域热存,冷备拉去异地。这么分层的意义是——平时小问题靠增量回滚,大事故靠全量+冷备重建。别迷信“RAID=备份”,那只是容错,不是历史点回溯。
备份完整性要校验。很多人只“有文件”就心安,我吃过“0 字节备份”的亏。现在每次导出生成 SHA256 校验和,落库存档;对象存储开生命周期与版本控制,防止误删与勒索型篡改。数据库备份加上 --routines --triggers,字符集统一为 utf8mb4,避免恢复后表情变问号。附件目录打包时排除临时缓存,压缩用 zstd,既快又省空间。
说说灾备恢复演练。纸面方案不等于可用方案,至少季度演练一次:在干净的测试机上,从零开始复盘流程——部署相同版本的 PHP/MySQL,导入最近一次全量,再按时间点回放增量,最后同步附件包。演练时记录耗时、报错、版本不匹配点,比如某次 Nginx 配置里没带大文件上传参数导致发帖失败,这种问题不上演
的时候根本想不到。把这些坑写进复盘文档,下次演练先对照检查。另一个要点是“可用性验证”,不仅仅看后台能开、页面能刷,而是挑几条典型业务链:注册登录、发帖回帖、搜索、上传下载附件,逐一走一遍。只有业务跑通,恢复才算完成。
备份频率别拍脑袋,基于RPO/RTO来定。Xiuno 贴文频繁的社区,RPO我一般定在15分钟以内(允许最多丢15分钟数据),因此需要binlog或近实时的增量;RTO则控制在1-2小时,意味着你的对象存储带宽、测试机性能、自动化脚本都要跟上。算一笔账:数据库10GB、附件60GB,异地拉取和解压的总时长是多少?中间卡在哪个环节?演练中把这些数字量化,才能和老板或自己做期望管理。
自动化能省掉很多低级错误。我用简单的脚本把“导出-校验-上传-清理”串起来,日志打到本地和监控端,异常通过邮件/飞书提醒;对象存储用服务端KMS加密,备份机只保留最小权限的AK/SK。恢复脚本也要写,别到时候还在百度命令参数。尤其是时间点恢复:先建干净实例,设置只读,按binlog position或GTID回放到目标时间,再切只读为读写,对外切流。流程明确,执行不慌。
还有几个细节常被忽略。其一,版本漂移:备份的是MySQL 5.7,恢复到8.0可能触发SQL模式不兼容,演练时要锁定镜像或写清升级路径。其二,时区与时钟:数据库、应用、备份机的时区和NTP要统一,否则按“时间点”恢复会对不齐。其三,社区量大时,搜索索引(如 Sphinx/Elastic)的重建要纳入RTO评估,必要时先恢复核心功能,索引后台重建。其四,权限与密钥:config里的密钥、第三方登录回调、对象存储凭证在测试环境要替换为安全的占位,防止误向生产写数据。
最后,别把备份当作“做过就行”的仪式。备份是为了恢复,恢复是为了业务连续。把备份结果定期抽样恢复校验,把演练当成发布流程的一环,把文档写给“未来的自己或同事”。当你哪天半夜被电话叫醒,能在昏昏沉沉里按着清单把站点拉起来,那才叫靠谱的灾备。 |
|