译者 | 李睿
审校 | 重楼
在分布式系统中,多个服务协同工作以完成既定任务,每个服务由不同的团队管理并独立发展。这往往催生了对依赖迁移的需求,例如数据库模式更新、外部服务升级或数据源更改。这些迁移是开发生命周期的关键部分,需要周密的计划和执行,以确保有效地防止回滚、数据不一致问题和运营中断等情况的发生。
软件迁移示例
在探索迁移策略之前,了解需要进行软件迁移的常见场景及其详细规划要求至关重要:
(1)数据源更改:应用程序当前从订单表中获取customerID以向客户收费。但是,现在需要进行迁移,并从待支付表中(pendingPayments)表中获取customerID。
(2)依赖版本更新:工作团队将他们的系统从V1版本更新到V2版本,其中新版本不向后兼容。应用程序必须适应新版本以保持无缝的功能。
软件迁移策略
在持续运行的系统中,必须设计迁移以避免服务中断并确保可靠性。为实现这一目标,应优先考虑两个关键目标:
(1)零停机时间:在整个迁移过程中,系统必须保持完全运行并可供客户端访问,确保不间断的可用性。
(2)数据完整性:迁移必须保持数据的准确性和一致性,确保输出保持可靠且不受迁移的影响。
成功指标
定义清晰且可衡量的指标是成功迁移的基础。这些指标确保迁移在不引入错误或不一致的情况下实现其目标:
- 对于数据源更改:通过验证新旧数据源是否提供相同的数据来衡量是否成功。这确保了迁移不会影响数据的完整性或准确性。
- 对于依赖项更改:通过确认依赖的旧版本和新版本的输出(例如,对象值)相同来定义成功,这保证了转换后的无缝功能。
迁移代码和A/B测试框架
在实施迁移代码时,对更改进行结构化以实现向新系统的平稳过渡至关重要。
最佳实践是将迁移代码置于控制和处理设置或A/B测试框架之后。这种方法允许开发人员在新旧系统之间无缝切换,而不需要额外的代码更改。它增强了测试、监控和风险管理,确保迁移过程可控,并在必要时易于逆转。
为了实现这一点,系统应设计为支持多种运营模式,这些模式包括:
(1)旧模式
- 说明:系统继续像以前一样运行,使用旧版实现。
- 目的:在引入新系统之前,作为基准并确保稳定性。
(2)影子模式
- 说明:新旧系统并行运行,但客户端只使用旧系统的结果。
- 目的:该模式允许在不影响最终用户的情况下比较新旧系统的输出。
- 行动:测量和记录新旧系统结果之间的任何差异,并发布指标进行分析,以验证新系统的准确性。
(3)反向影子模式
- 说明:旧系统和新系统都运行,但这次客户端使用新系统的结果。
- 目的:提供机会在实际条件下验证新系统的结果,同时保留旧系统作为备用。
- 行动:记录两个系统之间的差异,并发出指标来监控新系统的性能。
(4)新模式
- 描述:新系统全面投入运行,旧系统退役。
- 目的:这标志着迁移的完成,新系统已经过彻底的测试和验证,可以用于生产。
执行迁移
步骤1:准备迁移(旧模式)
迁移过程默认从系统以旧模式运行开始,这确保当前的实现在迁移准备期间保持运行和稳定。
步骤2:影子模式
切换到影子模式,在这种模式下,旧系统和新系统并行运行,但只有旧系统的结果返回给客户端。这是最关键的阶段,因为它允许在不影响生产功能的情况下对新系统进行广泛的测试和改进。使用指标和警报来监视差异,并调查和处理其根本原因。你应该进行必要的修复,以确保新系统的行为符合预期。在这一阶段应该分配充足的时间,在各种场景中收集足够的指标。
步骤3:反向影子模式
一旦对影子模式感到满意,就可以切换到反向影子模式。在该模式下,客户端使用新系统的结果,而旧系统继续在后台运行以进行验证。这种转换有助于识别新系统成为主要系统时可能出现的任何新问题或意外行为。例如,一个问题在影子模式下可能不会被发现,但在反向影子模式下可能会被检测到,即旧系统向数据库写入正确的值,而新系统只读取这些值而没有进行必要的更新。由于新系统现在在反向影子模式下驱动整个流程,因此任何此类差异都会变得显而易见。
如果识别出关键问题,重要的是切换回影子模式,以在实施必要修复的同时将风险降至最低。
步骤4:完全迁移(新模式)
一旦对反向影子模式下的性能充满信心,就过渡到新模式,在新模式下,旧系统将退役,新系统将开始全面运行。这样就完成了一个可靠的且经过彻底测试的新系统的迁移。
这种分阶段执行的方法确保了平稳过渡,实现风险最小化和全面测试,并在出现问题时采取回退策略。
潜在的缺点
对简单迁移采取过度措施
对于直接的或向后兼容的迁移来说,这种方法可能过于复杂。例如,升级Java版本或在兼容API之间转换等任务通常需要最少的努力,并且可以通过更简单的策略和不太详尽的计划来完成。
资源密集
在影子模式下运行并行系统可能在基础设施、计算和工程投入方面成本高昂。规模较小的团队或项目可能难以分配日志分析、指标检测和扩展测试所需的资源。
复杂性
管理多个运行模式(例如,旧模式、影子模式、反向影子模式)将会增加迁移过程的复杂性。它还可能导致协调方面的挑战,特别是当涉及多个团队来适应依赖关系更改或解决差异时。
结论
这种迁移策略在确保可靠性和效率方面具有显著的优势。通过使用影子模式和反向影子模式,可以及早发现新系统的潜在问题,从而在全面部署之前大幅降低风险。在新旧系统之间切换的灵活性确保了更平滑的回滚,从而提供了一个强大的安全网。此外,监视关键指标和记录差异有助于评估系统准备情况并指导必要的调整。
但是,重要的是要权衡该策略的潜在缺点,以确保不会在不适用的情况下采用它,毕竟有些迁移更适合采用更简单的方法。尽管存在这些考虑因素,但对于高风险或复杂的迁移任务来说,该策略提供了一种可控的增量方法,可以最大限度地减少中断,确保平稳的用户体验,同时谨慎地管理风险。
原文标题:Phased Migration Strategy for Zero Downtime in Systems,作者:Sandeep Kumar Gond