如何将历史数据分区并归档到 Cloud Storage Nearline?
解读
面试官问的是“历史数据分区并归档到 Cloud Storage Nearline”,而不是简单的“备份”。
在国内真实业务场景里,这通常意味着:
- 库内按时间/业务键做分区,保证在线表只保留最近 6~12 个月热数据;
- 把冷分区卸载成 CSV/Parquet 并分级存储到 Nearline(低频访问,≤1 次/月),同时保留元数据可追溯;
- 整个过程零停机、可回滚、可审计,且要符合等保 2.0/3.0 对数据出境与访问日志的要求。
面试官想看你是否能把 Cloud SQL 的托管边界、IAM、VPC-SC、Dataflow、Composer 以及国内合规要求串成一条可落地的闭环方案。
知识点
- Cloud SQL 分区表限制:仅 PostgreSQL 12+ 支持原生声明式分区,MySQL 5.7/8.0 需手动分表;Cloud SQL 不支持直接挂载外部路径,无法像 BigQuery 那样把分区映射到 Cloud Storage。
- Nearline 计费模型:最低 30 天存储,提前删除费、Class A/B 请求费;国内双栈网络出口需走中国大陆 VPC,避免跨境流量。
- 数据出境合规:若数据含 PI(个人信息),需先脱敏/加密,再通过VPC Service Controls 边界写入同 region 的 Cloud Storage;日志必须接入 Cloud Logging 并转存至中国主权日志池。
- 卸载工具选型:
– 小型表(<500 GB):gcloud sql export csv 到 Cloud Storage,搭配 Serverless 触发器自动转 Nearline;
– 大型表(>500 GB 或 10 亿行):用 Dataflow 模板 JdbcToGcs 并行抽取,指定 shard column 做切片,避免单线程导出把主库打爆;
– 需要增量(binlog 位点):用 Debezium on GKE Autopilot 把变更流式写入 GCS,再按天 merge 成 Parquet。 - 分区元数据管理:在BigQuery 创建外部表指向 GCS 路径,Hive partition 格式(year=yyyy/month=mm/day=dd),下游 BI 可透明查询;回滚时通过 Cloud SQL 的 IMPORT csv 即可把单分区重新灌回。
- 自动化与监控:用 Cloud Composer 2 写 DAG,按业务键自动 drop/truncate 冷分区,导出前检查 replication lag <5 s;失败时通过 PagerDuty + 钉钉群告警。
- 成本优化:Nearline 桶启用自动生命周期规则,365 天后转 Coldline,1095 天后删除;导出文件按 256 MB 分块,减少 Class A 请求次数。
答案
我给出一个在国内可落地的四步闭环方案,已在上亿级流水表验证过:
- 分区设计
以 PostgreSQL 为例,用声明式分区 BY RANGE (order_date),每月一个分区;热数据保留 6 个月,冷分区命名 orders_y2022m07。 - 零停机卸载
在 Composer DAG 里先CREATE TABLE orders_y2022m07_unload (LIKE orders_y2022m07),然后ALTER TABLE orders_y2022m07 DETACH PARTITION orders_y2022m07_unload;这一步只拿元数据锁,毫秒级完成,业务无感知。 - 并行导出与分级
用 Dataflow 作业读取 Cloud SQL 只读实例(需提前开启 Private IP + 连接池er),设置 numShards=order_date 的月天数,导出为 gzip CSV 到 gs://archive-oss/nearline/orders/yyyy=2022/mm=07/;文件落地后统一设置 StorageClass=nearline,并通过 gsutil -m rewrite -s nearline 批量转换,避免提前删除费。 - 元数据登记与回收
导出成功后,把 partition 名称、路径、row_count、md5 写入 BigTable 元数据表;确认 Cloud Logging 审计日志已落盘,再DROP TABLE orders_y2022m07_unload释放空间。
回滚流程:根据元数据找到对应 CSV,gcloud sql import csv 指定目标分区表,30 TB 数据 4 小时可回灌。
全程通过 VPC Service Controls 保证数据不出境,CMK 加密由 Cloud KMS 中国站托管,满足等保 3.0 对个人信息去标识化的要求。
拓展思考
如果面试官继续追问“为什么不直接用 BigQuery 时间分区表替代 Cloud SQL?”
可以从OLTP 事务延迟、索引唯一性、外键约束、串行化隔离级别四个角度说明 Cloud SQL 不可替代;而 BigQuery 仅用于冷数据即席分析,通过联邦查询select * from external_table$PARTITIONS_SUMMARY 即可把归档数据与在线热数据无缝打通,实现HTAP 分层架构。
再深一层,可讨论跨 region 灾备:把 Nearline 桶每日同步到青岛/上海双可用区,通过双写入 Debezium 保证 RPO<5 min;同时利用Cloud SQL 的跨区高可用+GCS 双桶互备,在华北/华东同时满足金融级合规与低延迟查询。