如何评估源库慢查询对迁移延迟的影响?

解读

在国内金融、电商、政企上云项目中,源库慢查询往往是导致Cloud SQL 迁移窗口拉长、割接失败的“隐形杀手”。面试官想确认你是否能把“慢查询”这一单点问题,放到全链路延迟评估模型里量化,并给出可落地的 Google Cloud 解决方案。核心考点有三:

  1. 能否把慢查询拆成执行时长、锁等待、IO 延迟、网络往返四个维度,分别映射到DTS(Dataflow/Database Migration Service)复制延迟
  2. 能否用Cloud Monitoring + pg_stat_statements/Performance Schema抓指标,把“秒级慢查询”翻译成“毫秒级增量 Lag”;
  3. 能否给出降级预案:参数调优、索引补齐、并行复制、限流、割接窗口回退策略,让业务方敢签字。

知识点

  1. 源库侧指标

    • MySQL:slow_query_log、performance_schema.events_statements_summary_by_digest、innodb_trx、lock_wait_timeout
    • PostgreSQL:pg_stat_statements、pg_locks、pg_stat_activity、log_min_duration_statement
    • SQL Server:sys.dm_exec_query_stats、sys.dm_tran_locks、blocked process report
  2. Cloud SQL 迁移链路延迟分解

    • DMS 采集延迟:binlog/WAL 拉取频率受源库 IOPS 与网络带宽限制
    • 转化延迟:大事务、DDL、无主键表导致单线程回放
    • 写入延迟:Cloud SQL 实例 CPU/IO 配额、parallel replication 线程数
  3. 量化模型
    单条慢查询影响 ≈ (执行时间 + 锁等待时间) × 该查询在 binlog/WAL 中的事务大小 × 并发复制线程数倒数。
    总延迟 Lag = Σ(慢查询影响) + 网络 RTT + Cloud SQL 写入耗时。

  4. Cloud 工具链

    • Cloud SQL Insights 直接复用源库采样,无需装 agent
    • Cloud Monitoring custom metric:用 metricDescriptor 上报源库 QPS、95th 执行时间、lock_wait 均值
    • Dataflow 模板自带“Lag”指标,可设置 alert threshold=30 s 触发 Cloud Function 自动限流
  5. 国内合规补充
    若源库在本地 IDC 防火墙内,需提前申请Cloud VPN 专用通道带宽≥200 Mbps,否则网络抖动会把慢查询放大 2~3 倍;等保场景下,慢查询日志脱敏后再上传到 Cloud Storage,避免客户敏感字段泄露。

答案

评估流程分五步,每一步都给出可落地的国内交付脚本

  1. 基线采集(0.5 天)
    在源库开启long_query_time=0.1 s,用 pt-query-digest 或 pg_stat_statements 导出近 7 天 Top 20 SQL;同步把performance_schema.events_waits_summary_global_by_event_name中 “wait/io/table/sql/handler” 平均等待时间拉到 Excel,算出单条慢查询平均 IO 延迟

  2. 映射到复制延迟(0.5 天)
    用公式:
    Lag(ms) = (SlowQueryAvgExecTime + LockWaitTime) × RowChangeCount × 2
    其中系数 2 是国内 VPN 网络 RTT 均值 80 ms的经验放大值。把 Top 20 结果求和,得到理论最大延迟。例如:某电商大促慢查询平均 3 s,锁等待 0.5 s,单事务 5 k 行,Lag≈(3+0.5)×5000×2=35 s。

  3. Cloud 验证(1 天)
    非生产实例启用 DMS 连续复制,把上述慢查询回放 1 小时;通过 Cloud Monitoring 观察**“replication_lag”**指标,若实测 38 s 与理论 35 s 误差 <10%,则模型可信。

  4. 调优与限流(2 天)

    • 对缺少索引的表,用Cloud SQL Index Advisor生成 CREATE INDEX 语句,在源库维护窗口执行,执行时间从 3 s 降到 30 ms,Lag 降到 3.5 s;
    • 若源库为 MySQL 5.7,把binlog_group_commit_sync_delay从默认 0 调到 10000,提高组提交并行度,降低 20% 网络包数量
    • 对仍大于 10 s 的延迟,在 DMS 配置max_parallel_workers=16,并开启Cloud SQL 并行复制,Lag 再降 50%。
  5. 割接决策(0.5 天)
    把调优后 Lag 的 95 分位值写入割接报告,若 <5 s,业务可接受;否则触发回退阈值:Lag>10 s 立即中断割接,回滚到源库,保证国内监管要求的“可回退”条款

拓展思考

  1. Serverless 场景:若源库是阿里云 PolarDB Serverless,弹性扩容会把慢查询瞬间“吃掉”,但 binlog 位点跳跃会导致 DMS 回滚重试;此时应关闭源库自动扩容,固定规格跑完全量迁移,再打开弹性,避免位点失效。
  2. 双向复制:国内某证券客户要求云下↔Cloud SQL 双向同步做灰度,慢查询在反向链路同样放大延迟;需为反向通道单独建立Cloud SQL 只读实例,并用gtid_mode=on保证幂等,否则会出现数据漂移被监管通报。
  3. 成本权衡:把慢查询全部加索引后,Cloud SQL 存储空间增加 18%,每月费用多 3000 元;若业务只读场景,可用Cloud SQL 只读副本分担查询,保留原索引,延迟不变但节省 40% 费用,体现“用云原生架构而非单点调优”的面试加分思路。