如何并行导出 5 TB 数据库以缩短导出时间?
解读
面试官问的是“并行导出”而非“全量导出”,核心考察两点:
- 对 Cloud SQL 内部存储层(Colossus + Borg)与网络瓶颈的理解;
- 能否在不锁表、不断连接、不触发高可用切换的前提下,把 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 元;若走跨境链路则翻倍,需提前申请跨境专线白名单。
答案
五步并行法,国内合规落地:
- 预检:确认实例已开高可用+自动存储扩容,并关闭 binlog 保护期(mysql 需 set global binlog_expire_sec=300),防止导出时磁盘打满。
- 分片:
- MySQL:用pt-archiver按主键 RANGE 拆成 20 片,每片 256 GB;
- PostgreSQL:提前按PARTITION子表导出,每子表一个 SQL 文件;
- SQL Server:用sqlpackage /p:TableData="schema.table" /sf:file%d.bacpac生成 10 个分卷。
- 并行任务:在Cloud Shell 华东区域起 4 台 e2-standard-4 跳板机,每台起5 并发 gsutil -m cp,--parallel-composite-upload-threshold=150M,--sliced-object-download-max-components=8,把分片直接写进同区域双列 GCS 桶(多区域存储类,减少跨区域复制延迟)。
- 一致性校验:导出前后各执行FLUSH TABLES WITH READ LOCK拿GTID 快照号(MySQL)或pg_export_snapshot(PostgreSQL),用gsutil hash -m生成CRC32C校验文件,与 Cloud SQL 内部快照校验和比对,确保 0 丢失。
- 收尾:关闭跳板机,删除临时 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,但需评估合规是否允许外部表跨境访问。