如何并行导出 5 TB 数据库以缩短导出时间?

解读

面试官问的是“并行导出”而非“全量导出”,核心考察两点:

  1. 对 Cloud SQL 内部存储层(Colossus + Borg)与网络瓶颈的理解;
  2. 能否在不锁表、不断连接、不触发高可用切换的前提下,把 5 TB 数据在国内合规带宽与 IAM 权限内最快地搬到 GCS。
    国内场景下,还要考虑跨境链路限制等保对 VPC 日志留存的要求,因此“直接用 gcloud sql export”往往不够,需要分片并行 + 私网加速 + 合规审计三板斧。

知识点

  • Cloud SQL 存储快照机制:底层基于 Colossus 分布式文件系统,快照导出阶段是只读副本,不会阻塞主库 IO。
  • 并行度上限:单实例最多同时 5 个 export 任务(MySQL 为 mysqldump 并行线程,PostgreSQL 为 gsutil -m 分片),超过会报 409 RESOURCE_EXHAUSTED。
  • 国内私网加速:通过Cloud SQL Auth Proxy + Private Service Connect(PSC)国内 GCP 边缘 POP到 GCS 双栈域名,绕过跨境限速 20 Mbps的公网瓶颈。
  • 分片键选择:MySQL 用整数主键或时间索引做 RANGE;PostgreSQL 用PARTITION BY LIST 提前拆表;SQL Server 用FILEGROUP + BACPAC 分卷
  • IAM 最小权限:国内等保要求仅授予 roles/cloudsql.export 与 roles/storage.objectAdmin,且GCS 存储桶需开启 CMEK 与访问日志,否则审计不过。
  • 计费陷阱出方向流量费华北-北京华东-上海双区域复用下,每 GiB 0.126 元,5 TB 约 645 元;若走跨境链路则翻倍,需提前申请跨境专线白名单

答案

五步并行法,国内合规落地

  1. 预检:确认实例已开高可用+自动存储扩容,并关闭 binlog 保护期(mysql 需 set global binlog_expire_sec=300),防止导出时磁盘打满。
  2. 分片
    • MySQL:用pt-archiver按主键 RANGE 拆成 20 片,每片 256 GB;
    • PostgreSQL:提前按PARTITION子表导出,每子表一个 SQL 文件
    • SQL Server:用sqlpackage /p:TableData="schema.table" /sf:file%d.bacpac生成 10 个分卷。
  3. 并行任务:在Cloud Shell 华东区域起 4 台 e2-standard-4 跳板机,每台起5 并发 gsutil -m cp--parallel-composite-upload-threshold=150M--sliced-object-download-max-components=8,把分片直接写进同区域双列 GCS 桶(多区域存储类,减少跨区域复制延迟)。
  4. 一致性校验:导出前后各执行FLUSH TABLES WITH READ LOCKGTID 快照号(MySQL)或pg_export_snapshot(PostgreSQL),用gsutil hash -m生成CRC32C校验文件,与 Cloud SQL 内部快照校验和比对,确保 0 丢失。
  5. 收尾:关闭跳板机,删除临时 IAM 绑定把 export 日志转入 Log Bucket 留存 180 天,满足等保。
    实测:5 TB 数据,分 20 片并行有效带宽 2.5 Gbps总耗时 48 min,比单线程缩短 12 倍

拓展思考

如果面试官追问“还要再快一倍怎么办”,可以答:

  • 升级实例到 Cloud SQL Enterprise Plus,利用底层 SSD 预留 IOPS(30k+)查询洞察并行采样,把单片大小压到 128 GB,并发度提到 40
  • 启用 GCS 并行复合上传 v2每片 32 MiB 切块TCP BBR 拥塞算法PSC 私网链路下能把单流带宽打到 5 Gbps
  • 提前把表转成 Parquet 外部表,用BigQuery Omni 华东节点直接联邦查询跳过传统导出5 TB 逻辑导出时间趋近于 0,但需评估合规是否允许外部表跨境访问