外观
表切换与灰度切流(双写 → 对账 → 切读 → 停旧)
难度与前置
难度:架构
前置:能在测试环境跑通新旧两套表任务;理解覆盖写幂等与 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. 影子表约定
- 影子表命名与权限:仅仓内/分析只读,不对外部当正式口径
- 字段与粒度以「目标终态」为准;禁止影子表长期双口径并存无文档
- 影子表任务失败 = 切流暂停,不得靠「只切读旧」假装绿
- 影子表数据保留策略写进切流单,避免磁盘黑洞
4. 回滚条件(预先写死,不靠临场发挥)
text
回滚条件(满足任一即回滚)
□ 旧 vs 新对账 diff 连续 ____ 次超阈且非「延迟」原因码
□ 切读后对外错误率 / 空窗超过 ____
□ P0 告警与本切流对象相关且 15min 内无法解释
□ owner/值班判定业务不可接受(需留一句理由)
回滚动作:________(通常:视图指回旧表;停新写或保留双写)
回滚验证:旧读路径抽检 ____ 行/指标 OK;公告时刻 ____回滚后:新写是否保留要明确——保留则继续修;停下则下次切流从双写重来。禁止「回滚了但新表仍对外」。
5. 与幂等、ADS、样例、变更窗的衔接
| 环节 | 要求 |
|---|---|
| 写入 | 新旧均覆盖写/去重键;双跑 diff=0(幂等) |
| 样例 | 切前合入门禁 PASS(test-fixture) |
| ADS | 对外出口按 ads-publish 验收再切,不单切底表 |
| 日历 | L2/L3 切流进 变更窗口;冻结日禁常规切流 |
| 影响面 | 下游清单与通知(lineage-impact) |
常见坑(至少这些)
无双写直接改生产表名/视图
无法对比,也无法快速回滚。双写但新表非幂等,补数翻倍
对账未 PASS 就 100% 切读
灰度无观察窗,五分钟打满
回滚条件事后才想,现场扯皮
停旧过早,回滚期无旧数据
只切底表,ADS/API 仍读旧或混读
冻结日强行切流,与大促撞车
把本篇写成云厂商蓝绿功能介绍
如何验收(带数字的前后对比)
| 项 | 改前(示例) | 改后(目标) |
|---|---|---|
| 切流含双写+对账+灰度+停旧 | 直接改 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