在现代云原生架构中,数据库迁移已成为技术团队无法回避的挑战。随着业务规模扩大,从 MySQL 5.7 升级到 8.0、从托管数据库迁移到 Serverless 架构、或在云厂商之间进行多云布局,都涉及数据迁移的工程实践。传统迁移方式往往意味着数小时甚至数天的停机窗口,这对于追求高可用的现代应用而言是不可接受的。
本文从多云对比视角出发,深入分析 PlanetScale VReplication、Neon Branching 与 Supabase 逻辑复制三种主流零停机迁移方案的技术架构差异,为工程团队在多云数据库选型时提供系统性的工程参考。
零停机迁移的核心挑战
在探讨具体技术方案之前,有必要明确零停机迁移需要解决的核心问题。首先是一致性保证:迁移过程中必须确保源数据库与目标数据库的数据始终保持同步,任何数据丢失或不一致都将直接影响业务正确性。其次是可回滚性:迁移过程中的任何环节都应具备回滚能力,以便在出现问题时能够快速恢复到迁移前的状态。第三是透明度:迁移过程应对应用层透明,应用不应感知到底层数据库的切换。最后是性能隔离:迁移操作本身不应显著影响生产环境的查询性能。
这四个维度构成了评估零停机迁移方案的基准框架,也是后续对比分析的理论基础。
PlanetScale VReplication 深度解析
PlanetScale 的零停机迁移能力构建在 Vitess 项目的 VReplication 组件之上,这是一套专为大规模数据迁移设计的分布式复制引擎。与传统的 MySQL 复制不同,VReplication 工作在逻辑复制层面,能够跨越不同的存储引擎和数据库版本进行数据同步。
PlanetScale 迁移流程的核心是 MoveTables 工作流。该工作流将迁移划分为七个关键阶段:初始快照复制、持续变更捕获、数据校验、流量预切换、透明切换以及反向复制建立。在初始快照阶段,系统通过非锁定方式获取源数据库的一致性快照,同时记录 GTID 位置信息。这一设计的关键在于:快照获取过程仅需极短的表级读锁(用于获取 GTID 位置),之后立即释放锁,整个数据复制过程对生产负载零影响。
在持续变更捕获阶段,VReplication 通过 MySQL 的二进制日志(binlog)进行增量数据同步。每个目标分片都有对应的流组件,持续从源数据库获取并重放变更事件。值得注意的是,VReplication 实现了自动断点续传机制:当复制因网络波动或其他临时故障中断时,系统能够从上次中断的位置恢复,而非重新开始全量复制。这对于 TB 级甚至 PB 级数据迁移至关重要,因为迁移过程可能持续数天甚至数周,期间遇到各类临时性故障的概率极高。
VDiff 是 PlanetScale 迁移方案中的数据校验组件。它通过在源数据库和目标数据库上同时创建一致性快照,然后逐行比对数据,识别任何不一致的记录。VDiff 的设计同样考虑了生产环境的稳定性:默认情况下它使用 REPLICA 副本执行数据拉取,避免对 PRIMARY 节点造成额外负载。更重要的是,VDiff 支持增量执行和断点续传,这意味着工程团队可以在迁移前的任意时间点启动校验,并在迁移截止日期前恢复校验进度。
切换阶段的实现体现了 PlanetScale 对可用性的极致追求。切换命令执行时,系统首先会暂停写入并缓冲 incoming queries,然后等待 VReplication 流完全追平所有变更,最后在毫秒级时间窗口内完成路由规则切换。整个过程对应用的影响被控制在 1 秒以内,且切换完成后会立即建立反向复制通道,使得在切换后的一定时间内(如数周),团队仍可根据实际情况决定是否回滚到源数据库。
Neon Branching 的分支驱动迁移模式
Neon 采用了与 PlanetScale 截然不同的技术路径,其核心创新在于存储层实现的 Copy-on-Write 分支机制。Neon 将无状态的 Postgres 计算节点与持久的存储层分离,分支创建在存储层面完成,而非在计算节点层面。当创建一个分支时,系统实际上是在特定 WAL(Write-Ahead Log) LSN 位置建立一个新的时间线,这个时间线起始于父数据库的数据状态,但采用了写时复制策略 —— 只有当分支上的数据发生变更时,才会真正复制对应的存储页面。
这种架构设计带来了一个显著优势:分支创建几乎是瞬时完成的,无论父数据库的规模有多大。这是因为分支在创建时并不需要复制全部数据,而仅是建立一个指向现有数据快照的指针。这与传统的数据库克隆或备份恢复方式形成了鲜明对比,后者在大型数据库上可能需要数小时才能完成。
Neon 将分支机制应用于零停机迁移的典型工作流程是:首先从生产数据库创建一个分支,该分支在创建瞬间便包含了最新的 schema 和数据;然后在分支上执行完整的迁移脚本(包括 DDL 变更和数据回填);接着在分支上运行完整的应用测试套件和负载测试,验证迁移的正确性和性能表现;最后在确认无误后,将相同的迁移步骤应用到生产数据库。
这种模式的核心理念是将迁移风险从生产环境转移到隔离的分支环境。由于分支可以快速创建且几乎零成本,工程团队可以在没有任何时间压力的情况下充分验证迁移脚本的正确性。分支在这里扮演了「预演场」的角色 —— 它不是自动化的迁移管道,而是一个安全的验证环境。
对于跨平台迁移场景(如从 AWS RDS 迁移到 Neon),Neon 建议结合使用分支与逻辑复制。具体做法是:首先在源数据库和 Neon 之间建立逻辑复制连接,持续捕获源数据库的变更;然后在 Neon 上创建分支,在分支环境中验证应用与目标数据库的兼容性;当验证通过后,执行一个极短的切换窗口(通常仅需几秒),停止源数据库写入、等待复制追平、然后将应用流量切换到 Neon。这种组合策略既利用了分支的验证能力,又通过逻辑复制实现了真正的零停机切换。
需要特别指出的是,Neon 当前并不提供自动将分支变更合并回主数据库的机制。分支上验证通过的迁移脚本仍需手动应用到生产数据库。这意味着 Neon 的方案更多是降低了迁移的风险,而非实现了全自动化的迁移管道。
Supabase 逻辑复制的工程实践
Supabase 作为建立在 PostgreSQL 之上的开源替代品,其迁移能力完全依赖于 PostgreSQL 原生的逻辑复制机制。与 Neon 的分支模式或 PlanetScale 的 VReplication 不同,Supabase 并不提供专门的迁移工具或 UI,而是指导用户直接配置 PostgreSQL 的发布 - 订阅模型来实现零停机迁移。
Supabase 迁移的标准流程包含五个阶段:环境准备、初始数据加载、逻辑复制配置、复制追赶和切换执行。在环境准备阶段,需要确保源 PostgreSQL 数据库满足逻辑复制的前提条件:wal_level 参数必须设置为 logical,同时 max_replication_slots 和 max_wal_senders 需要配置足够的值。这一步骤通常需要数据库管理员权限,对于使用托管 RDS 等服务的团队而言,可能需要通过控制台或 API 修改数据库参数组。
初始数据加载阶段通常使用 pg_dump 和 pg_restore 工具完成。这一步骤可以在应用仍在向源数据库写入的情况下进行,因为后续的逻辑复制会捕获这一阶段之后的所有变更。对于超大型数据库,可以利用 pg_restore 的并行选项(-j 参数)来加速加载过程,同时确保迁移 VM 与 Supabase 项目在地理位置上尽可能接近,以减少网络传输延迟。
逻辑复制的配置是整个流程的技术核心。在源数据库上,需要创建一个发布(Publication),指定需要迁移的表列表;在目标数据库(Supabase)上,则需要创建一个订阅(Subscription),指向源数据库的发布连接字符串。订阅创建成功后,Supabase 会立即开始从源数据库拉取变更数据,并在本地重放。这一过程可以通过 pg_stat_subscription 系统视图监控,包括 restart_lsn(已处理的位置)、last_msg_send_time(最新消息发送时间)等关键指标。
切换阶段是整个迁移过程中唯一需要「停机」的环节。标准的做法是:首先将应用置于只读模式或临时停止写入;然后等待复制 lag 降至零或低于预设阈值;在确认追赶完成后,禁用订阅并修改应用的数据库连接字符串指向 Supabase;最后恢复应用的读写操作。如果应用架构支持通过环境变量或密钥管理服务动态调整连接字符串,这个切换窗口可以压缩到秒级。
Supabase 迁移方案有几个关键的工程注意事项。首先是序列(Sequences)和自增列的处理:初始数据加载后,目标数据库的序列值可能落后于源数据库的最大值,需要手动调整否则后续插入会失败。其次是高变动表(如日志表、缓存表)的处理建议将其排除在发布范围之外,在切换时单独处理或直接清空重建。第三是外键和触发器的兼容性:迁移过程中应保持两边 schema 的一致性,如果必须进行 schema 变更,应采用向后兼容的方式(如先添加新列再删除旧列)。
三种方案的核心差异对比
通过对三种方案的技术解析,可以归纳出以下几个核心差异维度。
复制机制层面:PlanetScale VReplication 基于 MySQL binlog 的流式复制,支持实时捕获源数据库的增量变更;Neon 本身不提供持续复制能力,其分支机制仅用于验证,跨平台迁移需额外配置 PostgreSQL 逻辑复制;Supabase 完全依赖 PostgreSQL 逻辑复制的发布 - 订阅模型。
迁移自动化程度:PlanetScale 提供了端到端的迁移管道,从快照获取到切换执行几乎完全自动化,仅需少量人工干预;Neon 的分支机制是纯手动流程,分支上的验证通过后仍需手动在生产环境执行相同操作;Supabase 提供了清晰的步骤指南,但每个步骤都需要 DBA 手动执行和监控。
回滚能力:PlanetScale 在切换后仍保持双向复制能力,可以在任意时间点回滚流量到源数据库;Neon 通过分支机制保留了迁移前的数据快照,但回滚需要重新执行原始数据库的切换操作;Supabase 的回滚能力取决于切换前是否保留了源数据库的完整复制链路。
数据规模适应性:PlanetScale 的 VReplication 经过 PB 级迁移的生产验证,天然支持分片迁移;Neon 的分支机制对数据规模无感知,但逻辑复制部分受限于 PostgreSQL 本身的复制能力;Supabase 的逻辑复制方案在超大型数据库上可能面临 WAL 积压和复制延迟的挑战。
跨数据库类型支持:PlanetScale 支持 MySQL 到 MySQL 的迁移以及跨存储类型的迁移(通过逻辑备份方式);Neon 和 Supabase 均限于 PostgreSQL 生态内部迁移。
多云场景下的选型建议
在多云数据库架构的背景下进行选型时,工程团队需要综合考虑多个因素。
如果现有基础设施以 MySQL 为主,且迁移目标包含从非分片架构向分片架构的演进,PlanetScale VReplication 是最为成熟的选项。其内置的 MoveTables 工作流能够将分片作为迁移过程的一部分自动完成,这对于即将进入大规模增长阶段的业务具有重要价值。
如果团队的优先需求是在正式迁移前对迁移脚本进行充分的集成测试,且源数据库和目标数据库均为 PostgreSQL,Neon 的分支机制能够提供近乎零成本的验证环境。这种模式特别适合那些对数据完整性要求极高、愿意投入时间进行充分预演的业务场景。
如果团队具备较强的 PostgreSQL 运维能力,且迁移的主要驱动力是成本优化或获得更现代的开发体验(如 Serverless、实时 API 等),Supabase 的逻辑复制方案提供了足够的灵活性,且不引入额外的专有锁定机制。
需要强调的是,三种方案并非相互排斥。在复杂的迁移场景中,完全可以组合使用:例如使用 Neon 分支验证迁移脚本,使用 Supabase 的逻辑复制进行跨平台同步,最终根据业务特点选择最适合的切换策略。这种组合式方法能够在不同阶段发挥各方案的优势,同时规避单一方案的局限性。
参考资料
- PlanetScale 官方博客:Zero downtime migrations at petabyte scale
- Neon 官方文档:Neon data migration guides
- Supabase 官方文档:Migrate from Postgres to Supabase