数据冻结与停写窗口是什么
割接需要一段写冻结期:应用停止写入、定时任务暂停、对外接口改为只读或排队。冻结的难点几乎都不在主站,而在那些容易被忽略的写入路径——批处理、后台补录、报表回写、消息队列消费者、第三方回调与运维手工执行的 SQL。判断冻结是否完成只有一个标准:源端写入速率归零并且保持住,而不是我们已经通知业务方了。
基本信息
| 冻结对象 | 应用写入口、批处理与调度任务、MQ 消费者、后台补录、外部回调 |
|---|---|
| 技术手段 | 维护页与写开关、网关层拦截、数据库只读账号、暂停消费 |
| 确认方法 | 采样源端写入计数,连续多个间隔不增长 |
| 边界约定 | 冻结期内允许执行的例外操作白名单 |
| 典型时长 | 按追平耗时决定,从十几分钟到数小时,需与业务方预约低峰时段 |
| 超时处理 | 达到约定时限仍未追平则放弃本次割接,恢复写入并复盘 |
典型使用场景
- 数据库迁移割接:全量完成后停写,等增量追平再切换
- 存储后端切换:冻结写入后做最后一次块级同步再切挂载点
- 版本升级:升级前冻结写操作,保证备份与升级基线一致
- 机房搬迁:先把写入切到只读,再搬运数据与设备
- 对账窗口:财务或结算类业务在固定时点冻结,避免统计口径漂移
停写确认(MySQL 侧)
停写确认(MySQL 侧)
SHOW PROCESSLIST; # 观察是否仍有处于执行中的写入会话
SHOW GLOBAL STATUS LIKE 'Com_insert'; # 记录基数,间隔 30 秒再采一次比较
SHOW GLOBAL STATUS LIKE 'Com_update';
SHOW GLOBAL STATUS LIKE 'Com_delete';
SHOW GLOBAL STATUS LIKE 'Innodb_rows_inserted';
# 连续多次采样都不增长,才认为写入已真正停止;只采一次看不出趋势写入路径与冻结手段
| 写入路径 | 常见遗漏 | 冻结手段 |
|---|---|---|
| 应用接口 | 只停主站,开放平台与内部接口仍在写 | 网关层统一拦截,或打开全站维护开关 |
| 批处理与调度 | 忘记暂停定时任务与对账作业 | 关闭调度器并确认下次触发时间晚于冻结期 |
| 消息队列 | 消费者仍在消费并写库 | 暂停消费,或让消息在队列中堆积待恢复后再处理 |
| 后台管理 | 运营补录、客服改单在冻结期继续提交 | 收回写权限或通过维护页限制入口 |
| 数据库直连 | DBA 手工 SQL 与运维脚本绕过应用层 | 冻结期暂停执行写语句,例外操作列入白名单并记录 |
冻结窗口要提前与业务方预约并说明最长时长:客服、运营与财务的临时需求必须走白名单,否则冻结期会被零星写入打断,追平永远不归零。
冻结期内不要做与割接无关的变更(发版、扩缩容、索引调整):出问题时无法区分是割接操作还是额外变更导致的。