第24章:灾难恢复与业务连续性:主备切换、数据备份、异地容灾、演练计划

做市商系统,说白了就是一台24小时不停转的印钞机。但印钞机也会坏,机房可能断电,光纤可能被挖断,甚至整个城市都可能遭遇不可抗力。我见过太多团队,平时觉得灾备是浪费钱,真出事了才追悔莫及。

这一章,咱们就聊聊怎么让系统在灾难面前「扛得住、切得走、回得来」。

24.1 主备切换:别让切换比故障更可怕

主备切换,听起来简单——主节点挂了,备节点顶上。但实际操作中,我踩过的坑比想象中多得多。

24.1.1 主备架构的三种模式

模式 切换时间 数据一致性 适用场景
冷备 分钟级 可能丢失 非核心模块
温备 秒级 基本一致 订单系统
热备 毫秒级 强一致 行情、风控

我个人习惯,核心交易链路必须用热备。为什么?因为做市商每秒都在亏钱。你想想看,行情断了10秒,你的报价可能已经偏离市场几个tick了。

24.1.2 切换的「三把斧」

我建议每个团队都准备好这三样东西:

  • 健康检查脚本:每5秒探测一次,连续3次失败就触发切换
  • 切换决策表:明确什么情况下自动切,什么情况下手动切
  • 回退预案:切过去之后,怎么切回来?这个很多人会忘

核心原则:宁可切错,不可不切。自动切换的阈值可以设得宽松一些,人工确认反而会耽误时间。

24.2 数据备份:你的命根子

做市商的数据有多值钱?订单簿、成交记录、持仓数据,随便丢一天,审计就能让你吃不了兜着走。

24.2.1 备份策略的「3-2-1」法则

这个法则我用了十年,从来没出过问题:

  • 3份副本:生产环境1份,备份环境2份
  • 2种介质:SSD+磁带,或者SSD+云存储
  • 1份异地:至少有一份放在不同城市

24.2.2 增量备份 vs 全量备份

全量备份太慢,增量备份恢复太复杂。我的做法是:

# 每天凌晨2点执行
# 周一:全量备份
# 周二~周日:增量备份
# 保留最近30天的备份

# 备份脚本示例
#!/bin/bash
BACKUP_DIR="/data/backup/$(date +%Y%m%d)"
if [ $(date +%u) -eq 1 ]; then
    # 周一全量
    pg_dump -Fc trading_db > $BACKUP_DIR/full.dump
else
    # 其他天增量
    pg_dump -Fc --schema-only trading_db > $BACKUP_DIR/schema.dump
    pg_dump -Fc --data-only --exclude-table=history trading_db > $BACKUP_DIR/data.dump
fi

避坑指南:我曾经遇到过备份文件损坏的情况,原因是磁盘满了。从那以后,我每次备份完都会做一次校验,用md5sum比对源文件和备份文件的哈希值。

24.3 异地容灾:别把鸡蛋放在一个篮子里

同城双活?遇到地震、洪水一样完蛋。真正的容灾,必须跨城市,甚至跨区域。

24.3.1 异地容灾的三种级别

级别 RPO RTO 成本
L1 数据级 1小时 4小时
L2 应用级 15分钟 30分钟
L3 业务级 秒级 分钟级

做市商至少要做到L2。为什么?因为RPO(恢复点目标)决定了你会丢多少数据,RTO(恢复时间目标)决定了你会停多久。这两个数字,直接换算成钱。

24.3.2 数据同步的「最后一公里」

异地同步最大的坑是延迟。上海到深圳,光纤来回也要30毫秒。对于高频做市来说,这30毫秒足够让行情变几个来回。

我的解决方案是:

  • 异步复制:主库写本地,通过消息队列同步到异地
  • 最终一致性:允许短时间的不一致,但保证最终能追上
  • 冲突处理:以主库时间戳为准,备库的冲突数据直接丢弃

注意:千万不要用同步复制做异地容灾。网络抖动一次,整个交易链路就卡住了。我见过有人这么干,结果一次光纤抖动,全系统停了3分钟。

24.4 演练计划:平时多流汗,战时少流血

很多团队的灾备方案写得漂漂亮亮,真到演练的时候,各种问题就冒出来了。我建议每季度至少做一次全流程演练。

24.4.1 演练的四个阶段

  1. 桌面推演:会议室里过流程,确认每个人知道自己该干什么
  2. 功能验证:在测试环境模拟故障,验证切换脚本是否正常
  3. 压力测试:在生产环境的低峰期,模拟真实流量下的切换
  4. 复盘总结:记录所有问题,更新预案

24.4.2 演练的「三个必须」

根据我的经验,演练中必须做到:

  • 必须断真网:别只是kill进程,要真的拔网线或者关交换机
  • 必须测回切:切过去不算完,切回来才是真本事
  • 必须留记录:每一步操作、每个异常、每次耗时,都要记下来

我的习惯:每次演练后,我会把发现的问题整理成「灾备问题清单」,贴在团队墙上。下次演练前,先检查这些问题是否已经修复。

24.5 核心架构图:灾难恢复全景

下面这张图,是我做灾备架构时必画的。它把主备切换、数据备份、异地容灾、演练计划串在了一起。

做市商灾难恢复与业务连续性架构 主站点(上海) 交易引擎 行情网关 风控模块 数据库主库 备站点(深圳) 交易引擎 行情网关 风控模块 数据库备库 异步复制 数据同步 数据备份层 全量备份(周一) 增量备份(周二~周日) 异地存储(北京) 校验归档 演练计划(每季度一次) 桌面推演 → 功能验证 → 压力测试 → 复盘总结

这张图的核心逻辑是:主站点负责日常交易,数据异步同步到备站点。备份层做全量和增量备份,并异地存储。演练计划定期验证整个链条是否通畅。

24.6 最后说几句

灾难恢复这件事,说白了就是「用钱换时间」。你愿意花多少钱,就能在多短的时间内恢复。但有一点要记住:再贵的方案,也比不上一次真实的演练

我见过最惨的案例,是一家做市商花了几百万做灾备,结果演练的时候发现备库的磁盘阵列是坏的。嗯,这种错误,一次都不能犯。

我的建议:从今天开始,给你的灾备方案定一个「最低标准」——至少保证核心交易链路能在15分钟内恢复,数据丢失不超过1分钟。其他的,慢慢优化。


无相订单流研究社 微信Lucian808555