如何基于 Istio 实现只读副本的流量镜像测试?

解读

在国内金融、电商等高并发场景下,Cloud SQL 只读副本常被用来做读写分离与报表查询。上线前,需要把线上真实流量“无损镜像”到副本,验证其延迟、执行计划与数据一致性,而 Istio 作为服务网格数据面,能在 Sidecar 层零侵入完成镜像,避免业务改代码。面试中,考官想确认你能否把 Cloud SQL 只读副本、Istio Traffic Mirroring、可观测性闭环与合规四者串起来,给出可落地的国内方案

知识点

  1. Cloud SQL 只读副本特性:异步复制、只读固定连接串、支持 Private IP 与 PSC(Private Service Connect),延迟通常在秒级;国内需备案跨区域 VPC 对等或 CEN 云企业网。
  2. Istio Traffic Mirroring:VirtualService 的 mirror 字段把指定比例流量异步复制到目标 Service,不回写响应,对主链路零影响;镜像流量携带 shadow: true 头。
  3. Sidecar 出站拦截:Istio 1.18+ 默认使用 iptables + Envoy,对 MySQL/PostgreSQL 的 TCP 流量做4 层透明转发,无需应用改造。
  4. 国内合规要点:镜像流量不得包含个人敏感信息,需先经过脱敏网关EnvoyFilter 做字段打码;日志需落OSS + 日志审计服务保存 180 天。
  5. 可观测性:使用 Cloud SQL Insights 对比主库与副本的 p99 延迟rows examined;Istio 侧用 Kiali + Prometheus 查看镜像流量 5xx、tail 延迟。

答案

步骤一:准备 Cloud SQL 只读副本
同一 VPC 子网内创建只读副本,命名为 cloudsql-read-01,勾选专用 IP,并授予 GKE 节点池 Cloud SQL Client 权限;通过 gcloud sql instances create-read-replica 完成,确保副本对外地址为 10.60.1.8:3306

步骤二:部署 Istio 1.19 与 Sidecar
阿里云 ACK 或腾讯云 TKE 集群安装 Istio,开启 CNI 插件避免 iptables 与 Terway 冲突;给业务命名空间打上 istio-injection=enabled,确保 Sidecar 能拦截 TCP 3306。

步骤三:定义内部 Service 指向副本
由于镜像目标必须是集群内 Service,创建 ExternalName Service:

apiVersion: v1
kind: Service
metadata:
  name: cloudsql-read-mirror
  namespace: prod
spec:
  type: ExternalName
  externalName: 10.60.1.8
  ports:
  - port: 3306
    protocol: TCP

步骤四:配置 VirtualService 镜像

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: cloudsql-main-vs
  namespace: prod
spec:
  hosts:
  - cloudsql-main.prod.svc.cluster.local
  tcp:
  - match:
    - port: 3306
    route:
    - destination:
        host: cloudsql-main.prod.svc.cluster.local
        port:
          number: 3306
      weight: 100
    mirror:
      host: cloudsql-read-mirror.prod.svc.cluster.local
      port:
        number: 3306
    mirrorPercentage:
      value: 100   # 全量镜像,也可灰度 10%

步骤五:脱敏与审计
编写 EnvoyFilterSIDECAR_OUTBOUND 阶段拦截 SQL,调用外部脱敏服务身份证号、手机号 做哈希;同时把镜像 SQL 写入 Kafka -> Logstash -> 阿里云 OSS,满足等保 2.0 审计要求。

步骤六:验证与回滚
使用 Sysbench 1.1.0 在主库压测 5000 QPS,通过 Cloud SQL Insights 观察副本 p99 延迟 < 200 ms、无 lock wait timeout;若指标异常,把 mirrorPercentage 改为 0 即可秒级回滚,无需重启 Pod。

拓展思考

  1. 双向 TLS 场景:若开启 Istio mTLS,需给 ExternalName Service 创建 DestinationRule 关闭 mTLS,否则 Sidecar 会尝试 TLS 握手导致 MySQL 协议失败。
  2. 只读副本延迟放大:国内跨地域(如上海到张家口)RTT 30 ms,可引入 Cloud SQL 快速故障转移副本(只读副本+并行复制)降低延迟;或把镜像比例降为 5%,采用采样日志回归模型评估。
  3. 成本优化:镜像流量会双倍计费(主库出流量 + 副本入流量),可通过 Private Service Connect 内网转发节省 30% 流量费;对大数据包 SQL 开启 VPC 流日志采样率 1/1000,避免日志存储爆炸。