如何基于 Istio 实现只读副本的流量镜像测试?
解读
在国内金融、电商等高并发场景下,Cloud SQL 只读副本常被用来做读写分离与报表查询。上线前,需要把线上真实流量“无损镜像”到副本,验证其延迟、执行计划与数据一致性,而 Istio 作为服务网格数据面,能在 Sidecar 层零侵入完成镜像,避免业务改代码。面试中,考官想确认你能否把 Cloud SQL 只读副本、Istio Traffic Mirroring、可观测性闭环与合规四者串起来,给出可落地的国内方案。
知识点
- Cloud SQL 只读副本特性:异步复制、只读固定连接串、支持 Private IP 与 PSC(Private Service Connect),延迟通常在秒级;国内需备案跨区域 VPC 对等或 CEN 云企业网。
- Istio Traffic Mirroring:VirtualService 的
mirror字段把指定比例流量异步复制到目标 Service,不回写响应,对主链路零影响;镜像流量携带shadow: true头。 - Sidecar 出站拦截:Istio 1.18+ 默认使用
iptables + Envoy,对 MySQL/PostgreSQL 的 TCP 流量做4 层透明转发,无需应用改造。 - 国内合规要点:镜像流量不得包含个人敏感信息,需先经过脱敏网关或
EnvoyFilter做字段打码;日志需落OSS + 日志审计服务保存 180 天。 - 可观测性:使用 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%
步骤五:脱敏与审计
编写 EnvoyFilter 在 SIDECAR_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。
拓展思考
- 双向 TLS 场景:若开启 Istio mTLS,需给 ExternalName Service 创建
DestinationRule关闭 mTLS,否则 Sidecar 会尝试 TLS 握手导致 MySQL 协议失败。 - 只读副本延迟放大:国内跨地域(如上海到张家口)RTT 30 ms,可引入 Cloud SQL 快速故障转移副本(只读副本+并行复制)降低延迟;或把镜像比例降为 5%,采用采样日志回归模型评估。
- 成本优化:镜像流量会双倍计费(主库出流量 + 副本入流量),可通过 Private Service Connect 内网转发节省 30% 流量费;对大数据包 SQL 开启 VPC 流日志采样率 1/1000,避免日志存储爆炸。