Skip to content

表切换与灰度切流(双写 → 对账 → 切读 → 停旧) ​

难度与前置

难度:架构
前置:能在测试环境跑通新旧两套表任务;理解覆盖写幂等与 ADS 发布门禁。
读完能做什么:按「双写 → 对账 → 切读 → 停旧」完成一次可回滚的表切换/灰度切流,并留下数字验收与回滚条件,而不是厂商控制台「蓝绿」话术。

适用场景 ​

  • 主键/分区/口径重构,不能停写直接替换生产表
  • ADS 或服务层要从旧表切到新表,需灰度读流量
  • 需要影子表(shadow)并行验证,再切 current 视图或读路由
  • 切流必须能在分钟级回滚到旧读路径

不适用:

  • 云厂商蓝绿发布产品对比与控制台点击课
  • 仅加列/加分区且无读路径切换(走常规变更即可)
  • 对账规则设计长文(见 对账、对账失败分诊)
  • 变更窗口政策本身(见 变更窗口)

真实场景(一条) ​

短剧投放组要把 ads_campaign_roi_1d 从「活动维度旧主键」切到「活动+素材」新粒度。有人周五直接 ALTER 后改下游 SQL,周一看板炸:

  • 无双写,旧分区无法对比
  • 无影子表,业务读到一半新一半旧
  • 回滚只能再改 SQL,耗时 2 小时

按本清单:在 变更窗口 常规窗开双写 → 影子表与旧表对账 diff 入阈 → 视图 current 切 5%→50%→100% 读 → 观察窗无 P0 → 停旧写。回滚条件预先写明「diff 超阈或错误率>约定则切回旧视图」。同迭代对外错数工单 0。

怎么做(步骤清单) ​

1. 切换对象与成功标准(先写单) ​

text
切流单(最小)
对象:旧 ____ → 新 ____  视图/路由:________
变更窗类型:□常规 □专窗(禁冻结日,见 change-window)
影响面:lineage 单号 ____(下游表/看板/API)
成功标准:对账 diff ≤ ____;样例门禁 PASS;观察 ____ 分钟无 P0
回滚触发:________  回滚动作:切回旧读路径,耗时目标 ≤ ____ min
owner / 值班:________

破坏性切流必须先做 影响评估;样例与回归对接 测试样例集。

2. 主链四步:双写 → 对账 → 切读 → 停旧 ​

步骤做什么退出条件(数字)
双写旧写不停;新表/影子表并行写同一业务窗新表分区连续 N 天任务成功;写入 幂等
对账旧 vs 新(或源 vs 新)按约定粒度diff 入阈;原因码可解释;失败走 分诊
切读视图/current/读路由灰度 5%→50%→100%每档观察窗无 P0;ADS 走 ads-publish
停旧停旧写或旧任务;保留只读回滚期只读保留 ≥ ____ 天;过期再归档
text
灰度切读节奏(示例,按主题改数字)
□ 5%  观察 ____ min   指标:错误率/空窗/投诉
□ 50% 观察 ____ min
□ 100% 观察 ____ min  后进入停旧评估
任一步触发回滚条件 → 立即 100% 旧读,禁止继续放量

3. 影子表约定 ​

  1. 影子表命名与权限:仅仓内/分析只读,不对外部当正式口径
  2. 字段与粒度以「目标终态」为准;禁止影子表长期双口径并存无文档
  3. 影子表任务失败 = 切流暂停,不得靠「只切读旧」假装绿
  4. 影子表数据保留策略写进切流单,避免磁盘黑洞

4. 回滚条件(预先写死,不靠临场发挥) ​

text
回滚条件(满足任一即回滚)
□ 旧 vs 新对账 diff 连续 ____ 次超阈且非「延迟」原因码
□ 切读后对外错误率 / 空窗超过 ____
□ P0 告警与本切流对象相关且 15min 内无法解释
□ owner/值班判定业务不可接受(需留一句理由)
回滚动作:________(通常:视图指回旧表;停新写或保留双写)
回滚验证:旧读路径抽检 ____ 行/指标 OK;公告时刻 ____

回滚后:新写是否保留要明确——保留则继续修;停下则下次切流从双写重来。禁止「回滚了但新表仍对外」。

5. 与幂等、ADS、样例、变更窗的衔接 ​

环节要求
写入新旧均覆盖写/去重键;双跑 diff=0(幂等)
样例切前合入门禁 PASS(test-fixture)
ADS对外出口按 ads-publish 验收再切,不单切底表
日历L2/L3 切流进 变更窗口;冻结日禁常规切流
影响面下游清单与通知(lineage-impact)

常见坑(至少这些) ​

  1. 无双写直接改生产表名/视图
    无法对比,也无法快速回滚。

  2. 双写但新表非幂等,补数翻倍

  3. 对账未 PASS 就 100% 切读

  4. 灰度无观察窗,五分钟打满

  5. 回滚条件事后才想,现场扯皮

  6. 停旧过早,回滚期无旧数据

  7. 只切底表,ADS/API 仍读旧或混读

  8. 冻结日强行切流,与大促撞车

  9. 把本篇写成云厂商蓝绿功能介绍

如何验收(带数字的前后对比) ​

项改前(示例)改后(目标)
切流含双写+对账+灰度+停旧直接改 SQL四步均有时刻记录
对账 PASS 才切读否是;diff 有数字
回滚演练或书面回滚耗时未知 / 2h≤ 约定(如 15min)且可执行
切流导致对外错数工单≥ 1观察期 0
样例门禁跳过有0
冻结日违规切流有0
text
切流验收记录(可复制)
对象:旧 ____ → 新 ____
双写窗:____~____  对账 diff:____(阈 ____)
灰度:5%____ 50%____ 100%____(上海时刻)
回滚条件:已写 Y/N  是否触发回滚:Y/N
停旧时刻:____  旧只读保留至:____
样例门禁:PASS/FAIL  ADS 门禁:PASS/FAIL/N/A
签字(owner):________  值班:________  日期:________

Checklist:

  • [ ] 切流单含成功标准与回滚触发
  • [ ] 四步主链完整,灰度有观察窗
  • [ ] 链到 idempotent / ads-publish / lineage-impact / test-fixture / change-window
  • [ ] 非厂商蓝绿广告体
  • [ ] 验收含 diff、回滚耗时、错数工单数字

相关专篇(互链,不重写) ​

你要做的事看哪篇
双跑不翻倍离线幂等
对外发布验收ADS 出数验收
下游谁受影响改表前影响评估
合入前样例测试样例集
何时允许切变更窗口与发布日历
对账失败怎么分流对账失败分诊
本篇只定切流四步与回滚,不替代上述专篇

相关面试题 ​

题库小程序链接待定;先用站内锚点占位。

  • [ ] 题:表切换为何必须「双写→对账→切读→停旧」,跳过双写的风险是什么?(考察点:四步主链 + 可回滚)→ 占位:#todo-interview-cutover-four-steps
  • [ ] 题:灰度切读每档退出条件与回滚触发如何写进切流单?(考察点:回滚条件可执行)→ 占位:#todo-interview-cutover-rollback
  • [ ] 题:影子表与正式 ADS 发布门禁如何分工,避免「影子绿、对外脏」?(考察点:与 ads-publish 衔接)→ 占位:#todo-interview-cutover-shadow-ads
  • [ ] 题:冻结日能否做 100% 切读?例外要走哪条通道?(考察点:与 change-window 边界)→ 占位:#todo-interview-cutover-freeze