一、演练目标与判定口径
演练最容易流于形式的原因是没有明确的通过标准。切过去了算成功吗?业务方说能访问就算恢复吗?这些模糊的判断会让演练失去价值。稳妥的做法是事先约定量化口径:切换耗时按从触发到业务成功率恢复至阈值以上的时间计算,数据影响以丢失事务数与不一致记录数衡量,用户影响以失败请求数与重连次数统计。
口径确定后还要明确采集方式。切换过程中的指标必须由被切换系统之外的观测通道采集,否则系统自身故障时数据也随之丢失。常见做法是在第三方位置部署探测节点,持续发起业务级请求并记录结果,切换前后的曲线对比即为最直接的证据,事后复盘也有据可依。
演练还应当区分计划内切换与故障模拟。前者可以优雅地摘除流量、等待在途请求完成,后者则直接切断链路,考验的是系统在毫无准备情况下的表现。两种都要做,且故障模拟的结果更接近真实情况,通常也更能暴露那些被优雅流程掩盖起来的问题。
判定口径还要考虑依赖系统的表现。切换是否成功不仅看自身,还看它调用的下游服务在切换期间是否稳定,以及上游流量能否被正确引导。演练时应把相关依赖一并纳入观测范围,否则可能只验证了核心组件而忽略了链路上的薄弱环节。一次完整的演练报告,应当包含依赖系统的指标变化,哪怕它们并未参与切换动作本身。
二、会话保持的层次与取舍
会话保持在不同层次上有不同做法。最简单的是把会话状态放进共享存储,两侧都能读取,切换时天然连续,代价是每次访问都要跨节点读写,常态下的时延被抬高。另一种是在客户端保存状态,服务端无状态化,切换毫无压力,但状态体积受限且需要防篡改设计,敏感信息也不宜放在客户端。
折中方案是本地缓存加异步复制。会话主要在本地读写,变更异步同步到对侧,切换时可能丢失最近数秒的更新。这对多数业务是可接受的,但涉及资金操作或严格顺序要求的场景就不适用,那类场景只能接受同步复制带来的时延,或者在设计上规避有状态会话。
选择时要看会话内容的性质。纯粹的登录态丢失后重新登录即可,影响有限;购物车、编辑草稿这类用户已经投入了操作的内容,丢失体验很差,值得付出同步成本。把会话按重要性分级,不同级别采用不同策略,比一刀切更合理,也更容易在时延与可靠之间找到合适的位置。
会话保持还与客户端实现密切相关。即便服务端设计了完善的共享存储方案,若客户端不缓存必要的会话令牌或遇到网络分区时直接清空本地状态,切换仍会表现为重新登录。演练中应当模拟客户端在切换瞬间的真实行为,包括弱网与断线重连,验证端到端而非仅服务端到服务端的效果。这部分常被忽略,却是用户感知最直接的环节。
三、数据回追的比对与修复
切换之后,原主侧可能还有未同步到备侧的事务。这部分数据不能简单丢弃,尤其是涉及业务凭据的记录。回追的第一步是确定分歧点:以复制位点为界,找出原主侧超前的那部分变更,逐条提取出来。位点信息必须在切换前持久记录,否则事后几乎无从定位,只能靠全量比对硬找。
比对环节要谨慎。直接把超前数据写入新主侧可能造成主键冲突或覆盖新产生的记录。正确做法是先做一次差异分析,把变更分为三类:新主侧不存在的记录、两侧都有但内容不同的记录、仅新主侧存在的记录。第一类可以补写,第二类需要业务规则介入判断,第三类保持不动。
修复流程应当留下完整痕迹。每一条补写或人工裁决的记录都要登记,包括原始内容、处理方式与操作人。这不仅是审计要求,也是后续复盘的素材。经验上,回追阶段的人工判断量与切换时的业务繁忙程度直接相关,因此计划内切换尽量安排在低谷时段,能显著减少事后的工作量。
比对环节的工具链需要提前打磨。临时拼凑的比对脚本在演练压力下容易出错,而错误的回追动作本身就可能造成数据问题。建议在非演练环境用历史数据反复验证比对与补写逻辑,确认其在各种分歧形态下都能给出正确分类。把验证过的脚本固化下来,演练时直接调用,既能提速也能降低人为操作引入的风险。
四、演练脚本化与常态化
一次性的演练价值有限,只有反复执行才能发现偶发问题并保持团队熟练度。把演练流程写成脚本是常态化的前提:前置检查、流量摘除、切换执行、指标采集、回追比对、结果汇总,每一步都可自动执行并输出结构化结果,人工只在真正需要决策的节点介入。
脚本要具备中止能力。演练过程中若发现异常超出预期,应当能一键停止并回到演练前状态,这条路径本身也需要事先验证。否则演练就变成了真实事故,团队会因为畏惧风险而不再演练,最终形成越不练越不敢练的恶性循环。
常态化还意味着把演练结果纳入度量。每次演练的切换耗时、数据影响与人工介入次数都记录下来,形成趋势曲线。指标持续改善说明架构与流程在进步,某次突然劣化则提示近期的变更引入了问题。把这条曲线放在团队看得见的地方,比任何口头要求都更能推动改进。
脚本化还带来知识沉淀的好处。每一次演练发现的边界条件、踩过的坑、临时处置的办法,都应回写到脚本的注释与检查清单里。随着时间推移,脚本承载的不仅是执行步骤,更是团队对这套架构的理解。新人参与演练时按脚本走一遍,就能掌握大部分要点,不必依赖个别老成员的口口相传,连续性因此更有保障。
结语:双活的价值只有在真正切换时才兑现,而能否顺利切换取决于日常演练的扎实程度。明确判定口径、按重要性分级处理会话、把数据回追的流程走通并留痕,再把整套动作脚本化反复执行,才能让方案从文档变成能力。演练暴露问题不是失败,恰恰是它最大的意义所在。