如何配置 Datastream 以仅同步指定表?

解读

在国内金融、零售、物流等行业的云原生改造面试中,面试官常把“仅同步指定表”作为 Datastream 实操的必考题,核心目的是验证候选人是否真正踩过“全表拉宽导致费用爆炸”与“敏感表泄露”的坑。问题背后隐含三层考察:

  1. 能否在源端(Cloud SQL)与流端(Datastream)两侧同时做最小权限收敛;
  2. 是否熟悉国内网络合规要求(如跨境数据需走跨境专线审批),因此过滤条件必须提前在境内完成
  3. 是否具备灰度验证意识,能在单表级别做回溯与重放,避免一次同步全库造成凌晨告警轰炸

知识点

  • Datastream 对象模型:Connection Profile → Stream → 包含**“表级包含/排除规则”**(PostgreSQL 用 publication,MySQL 用 binlog filter)。
  • Cloud SQL 源端配置
    – MySQL:需提前创建REPLICATION CLIENT权限账号,并通过--replicate-do-table=db.tbl--replicate-wild-do-table自定义标志位中限定;
    – PostgreSQL:必须创建逻辑复制槽publication,语法CREATE PUBLICATION p1 FOR TABLE ONLY schema1.tbl1, schema1.tbl2;,否则 Datastream 会拉取全库。
  • Datastream 控制台过滤:在“Backfill and CDC objects”步骤,选择“指定表”并填写schema.table列表,支持通配符schema_.*__tmp;同时勾选“Exclude unwanted tables”以正则黑名单二次兜底。
  • 国内费用优化:Datastream 按GB 拉取量计费,未做表级过滤时,一次全库 backfill 可能产生TB 级跨境流量,触发阿里云/腾讯云对等账单告警;因此务必在测试项目中先跑--dry-run估算。
  • IAM 最小权限:源端 Cloud SQL 实例需授予 Datastream 服务账号roles/cloudsql.clientroles/cloudsql.instanceUser;若实例开启Private Service Connect,还需在VPC-SC 边界规则中显式放行googleapis.cn网段。
  • 国内灰度技巧:利用Datastream 的“单表初始快照+CDC”模式,先选1 张最小表(如参数表)验证字符集(utf8mb4 → AL32UTF8)与时区(Asia/Shanghai)映射,再批量添加业务表,避免全库锁表导致电商大促订单写入失败

答案

  1. 源端收敛
    MySQL:在 Cloud SQL 实例的标志位里添加--replicate-do-table=retail.orders并重启;创建专用复制账号datastream@'%'授权REPLICATION CLIENT, REPLICATION SLAVE, SELECT
    PostgreSQLCREATE PUBLICATION retail_pub FOR TABLE ONLY retail.orders; SELECT pg_create_logical_replication_slot('retail_slot', 'pgoutput');
  2. 创建 Connection Profile
    选择Private IP方式,绑定国内 VPC 子网(如vpc-cn-shanghai),确保VPC-SC 边界已放行googleapis.cn;服务账号授予roles/cloudsql.client
  3. 创建 Stream
    – 源选择上述 Connection Profile,目标选 BigQuery 或 Cloud Storage;
    – 在“Backfill and CDC objects”页面,选择“指定表”,输入retail.orders
    – 在“Extra conditions”可附加WHERE created_at >= '2023-01-01'实现时间切片,减少历史数据;
    – 勾选“Exclude unwanted tables”并填正则(retail\.)?tmp_.*作为黑名单兜底
  4. 验证与灰度
    先启动**“单表 backfill only”任务,观察 Cloud Monitoring 指标datastream/streamed_bytes是否<= 表物理大小×1.2**;确认无**“Lock wait timeout”告警后,再切换为CDC 模式**并批量追加其余表。
  5. 费用兜底
    Terraform模板里为 Stream 增加max_concurrent_backfill_tasks = 1max_concurrent_cdc_tasks = 2,防止国内小带宽专线突发打满;同时配置预算告警alert_threshold = 80%,币种选CNY,对接钉钉群机器人

拓展思考

  • 双向级联场景:若国内多地域都有只读实例,可在源实例级联复制--replicate-do-table过滤,再在每个地域独立建 Datastream Stream,避免跨境回源;但需注意GTID 一致性,否则主键冲突会导致BigQuery DML 失败
  • Schema 变更兼容性:国内开发习惯夜间加字段,若未把binlog_row_metadata = FULL打开,Datastream 会出现**“Column index out of range”错误;建议把Cloud SQL 参数模板纳入GitOps**,强制 MR 审批才能改配置。
  • 数据脱敏:对身份证、手机号字段,可在 Datastream 的**“Transformation”(预览版)里配置SHA256 掩码**,或让Dataflow 后续清洗;但跨境场景必须先脱敏再出境,否则触发网信办数据出境安全评估