5.7 云厂商锁定与迁移

一句话

锁定不是 “用了某家云”,而是某天想走时走不掉;它分六层(API / 数据 / 身份 / 网络 / 计费 / 技能),每层都要单独定价——可以接受锁定,但不能有未定价的锁定。

六层锁定:分开看,才知道哪层最贵

层 锁定长什么样 迁移代价 缓解手段
① API / 服务 专有数据库引擎、专有消息语义、SDK 深度耦合 代码改造,最大项 标准协议优先;专有调用集中在薄封装里
② 数据 专有存储格式、导出要工单、全量导出按 GB 收费 搬迁时间 + 出口费 每月演练一次全量导出与恢复
③ 身份 IAM 角色、策略语法、SSO 依赖 重建权限模型与审计 用 OIDC 联邦,身份源自己掌握
④ 网络 VPC 拓扑、专线、DNS、证书、私网地址规划 重新规划与割接 拓扑文档化 + IP 规划留余量
⑤ 计费 预留承诺、出口费、迁移期双付 现金流压力 承诺期与迁移窗口错开
⑥ 技能 团队只会这一家的抽象与工具链 学习曲线 + 招聘 保留一套通用技能底座(K8s / SQL / OTel)

最容易低估的是 ⑥ 技能层:它不出现在合同里,也不出现在账单上,但决定了 “换一家要多久才恢复战斗力”。通常前五层 6 个月能迁完,第六层要 12 个月。

把锁定算成钱:迁移成本公式

迁移成本 ≈ 数据搬迁(GB ÷ 有效带宽 × 出口单价)
         + 代码改造(人日 × 人日成本)
         + 双跑期成本(通常为稳态成本的 30%–40%)
         + 业务中断风险(概率 × 损失)
         + 知识重建(培训 + 效率下降)

一个可复算的例子:50 TB 数据、出口 0.5 元/GB,光流量就是 2.5 万元;但 50 TB 在 1 Gbps 有效带宽下要搬约 5 天,再算双跑与改造,真实项目通常落在 6–12 人月。教训很直接:迁移成本里人力占大头,流量费只是零头——只算流量的退出方案,会低估一个数量级。

由此得到一条决策规则:迁移成本 ÷ 年节省 ≥ 2 年时,不要迁移,去议价。 换供应商的收益是每年 10%–20% 的单价差,而迁移是一次性的大额投入,多数情况下 “议价 + 逐步解耦” 比 “整体搬迁” 更划算。

可迁移性设计:八条可验证的动作

动作 做法 怎么验证
标准协议优先 对象存储用 S3 API、数据库用 PostgreSQL 兼容、可观测用 OTLP 换一个实现,业务代码不改
专有能力集中隔离 所有厂商特有调用放在一个 vendor/ 模块 打开该目录就知道锁定面有多大
数据可导出 全量导出脚本 + 校验和 每月跑一次,记录耗时与体积
基础设施即代码 Terraform / Pulumi,不用控制台点击 空账号能从代码重建整套环境
身份自己掌握 OIDC 联邦,用户目录在自己手里 换 IdP 不改业务
网络拓扑文档化 子网、路由、专线、DNS 画成图并入库 新人能按图复现
出口流量进预算 把出口费当项目成本项 迁移/多活的账能提前算出来
退出演练 见下一节 有演练记录与通过标准

八条里最容易糊弄的是 “数据可导出”:导出脚本存在 ≠ 能恢复。验证方式必须是 “在另一个环境里恢复到可用状态,并对比行数与校验和”,而不是 “点了一次导出按钮”。

迁移的四种形态:先选形态,再排计划

形态 做什么 工作量 风险 什么时候选
Rehost(lift & shift) 原样搬 VM / 容器 最小 中(隐含依赖会暴露) 时间压力大、先搬再优化
Replatform 换托管形态(自建 MySQL → 托管 MySQL) 中 中(参数与行为差异) 想顺手降运维成本
Refactor 按目标平台重构(如改 Serverless) 最大 高 架构本来就要改
Retire 先下线不再需要的系统 负成本 低 迁移前必做的一步

顺序建议:先 Retire(能删的删掉),再 Rehost(把必须搬的搬走),最后对少数核心做 Replatform / Refactor。很多迁移项目失败,是因为把 30% 的精力花在了 “本来可以下线的系统” 上。

时间与双跑:给自己的项目留出余量

系统类型 迁移时间量级 说明
小服务(< 5 万行、无状态) 1–3 个月 主要是联调与回归
中型核心(有状态、跨 3–5 个团队) 6–12 个月 双跑 + 灰度切流
核心交易 / 账务 12–24 个月 对账、审计、合规签字

这些是量级判断而非统计值;真正的经验值是 双跑期占项目总时长的 30%–40%,且双跑期的成本要按 “两套都在跑” 计——这部分现金流经常被漏掉。决策 “迁 / 不迁 / 什么时候迁” 的记录方式见 4.6 决策框架与决策记录:把迁移成本、失效条件、owner 一起写进去。

退出演练:读演练、写演练、计费演练

类型 做什么 频率 通过标准
读演练 全量导出 + 在测试环境恢复 + 校验 每半年 行数与校验和一致,耗时在窗口内
写演练 切 1% 流量到备用实现,观察 24 小时 每年 错误率不高于基线,可切回
计费演练 算一次 “如果明天搬走,出口费 + 双跑费 + 人力是多少” 每年 得到一个可写进预算的数

没有演练的退出方案,在出事当天会退化成聊天记录。这与灾备演练是同一个道理:方案的价值 = 演练过的部分。灾备侧的演练方法见 36.7 演练与验证。

反模式

反模式 后果
“我们做了多云” = 两套锁定 成本翻倍,共同依赖(DNS、CI、IAM)没隔离
抽象层过厚 自造了一个功能更差、没人维护的 PaaS
只备份不恢复 真要用时才发现导出不全、格式不可读
把合同条款当退出方案 条款能追责,不能恢复服务
迁移只做技术,不做组织 权限、审批、审计流程没搬,上线即卡住
为 “避免锁定” 放弃合适服务 过度设计,付出了 3 年复杂度换一个可能不发生的迁移
迁移成本只算流量费 低估一个数量级,预算超支
迁移不做 Retire 把该下线的系统也搬了过去,永久背上

三条铁律

🔑 锁定可以接受,但必须定价:迁移成本写进决策记录,才有资格说 “我们考虑过”。

🔑 退出方案必须演练过;没演练的退出方案与没有退出方案等价。

🔑 先算 “迁移成本 ÷ 年节省”,再决定迁移还是议价;多数场景议价 + 解耦更划算。

自检

Q1 团队说 “我们用的是标准 PostgreSQL,没有锁定”。这个判断漏了哪几层?

▸ 答案:至少漏了三层:① 数据层(备份格式、全量导出速度、跨大版本升级);② 身份与网络层(IAM 角色、VPC 拓扑、私网 DNS);③ 技能层(只会这家控制台与工具链)。引擎标准只解决了 “①API 层” 的一部分,SQL 方言、扩展与运维习惯仍会带来迁移成本。

Q2 迁移成本算出来 400 万,每年能省 120 万。该迁吗?

▸ 答案:按 “迁移成本 ÷ 年节省 ≥ 2 年就不迁” 的经验规则,400 ÷ 120 ≈ 3.3 年,不建议整体迁移。更优的组合是:把省钱目标拆开——议价(用迁移意向换折扣)、局部解耦(把最贵的那部分换成标准实现)、以及 Retire 掉不再需要的系统。迁移是最后手段,不是第一反应。

Q3 为什么说 “数据导出脚本存在” 不等于 “可以迁走”?

▸ 答案:因为迁移要求的是可恢复,不是可导出。导出可能缺索引、缺权限、缺触发器,或格式只有原厂工具能读;真正的验证是 “在另一个环境里恢复到可用状态,并对比行数与校验和”。这一步没做过,锁定量化里的 “数据搬迁” 一项就是猜的。

Q4 双跑期为什么常被低估,它到底贵在哪?

▸ 答案:贵在 “两套都得是生产级”:双份资源、双份监控、双份值班,以及数据同步与对账的人力(这部分通常没人预先排期)。经验值是双跑占总时长 30%–40%,成本按 “两套稳态成本 + 对账人力” 计。只按 “迁移那几周的资源费” 估算,会低估 3–5 倍。

Q5 一个团队为了 “避免锁定”,把所有云能力都封装成自研抽象层。风险是什么?

▸ 答案:自造一个更差的 PaaS:抽象层要适配 N 家、每家的差异都要抹平,于是功能取交集、bug 自己修、升级自己跟,最终既没有得到任何一家的能力,又背上了长期的维护成本。正确做法是薄封装 + 专有能力集中隔离(第 ② 条),把锁定面控制在一个目录里,而不是消灭锁定。

跨篇相关:托管与自建的责任边界见 5.5 托管服务与自建的取舍;选型时的退出成本维度见 4.3 技术选型的评估维度;出口流量与承诺期的账单结构见 5.6 云成本结构;部署形态(公有 / 私有 / 混合)的选择见 5.2 部署模型:公有 / 私有 / 混合;迁移决策的记录与失效条件见 4.6 决策框架与决策记录;演练方法见 36.7 演练与验证。