如何结合 Cloud Load Balancing 实现只读副本的自动故障剔除?

解读

国内面试官问这道题,核心想验证三件事

  1. 你是否真的在生产环境用过 Cloud SQL 只读副本,而不是只看过文档;
  2. 能否把 Google 原生组件(Load Balancing、Health Check、MIG)与 Cloud SQL 特性无缝拼装,做出“云原生”方案;
  3. 对“自动”二字有没有敬畏——故障判定、探活粒度、摘除速度、恢复后自动加回,每一步都要给出可量化的参数。

踩坑提示:Cloud SQL 只读副本本身不提供 VIP 或 Anycast IP,不能直接挂在 HTTP(S) LB 下;必须通过“自建反向代理 + 实例组 + 健康检查”这一公认套路,才能借助 Load Balancing 的流控能力完成故障剔除。

知识点

  1. Cloud SQL 只读副本的只读性:只接受 SELECTSHOW 语句,任何写操作都会永久中断复制;健康检查必须采用只读 SQLpg_is_in_recovery() 这类无害命令。
  2. 健康检查协议:GCP 内部 Health Check 支持 HTTP、HTTPS、HTTP/2、TCP、SSL、GRPC;反向代理必须暴露 HTTP 探活端点(如 /readiness),返回 200 表示可读,返回 503 表示复制延迟超限或线程异常。
  3. 托管实例组(MIG)与 NEG 的区别
    • MIG 适合自建虚拟机代理层,可配置自动修复、滚动替换;
    • NEG(Zonal NEG)适合 Cloud Run、GKE,但 Cloud SQL 副本没有 Sidecar 容器,国内主流仍选 MIG
  4. 故障判定阈值
    • 健康检查连续失败 3 次、间隔 5 s,15 s 内完成摘除;
    • 复制延迟>30 s 或线程状态≠streaming 即判死;
    • 恢复后连续成功 2 次才重新注册,防止抖动。
  5. 国内合规细节
    • 若走公网 LB,必须在北京/上海/深圳三地选就近 Premium Tier,且为代理层绑定已备案域名
    • 若走私网 LB,需使用VPC 内部代理型内网 LB,并开启Private Service Connect 做跨项目授权。

答案

步骤 1:架构抽象
客户端 → Cloud Load Balancer(TCP/SSL 代理型或内网 LB)→ 后端服务 → MIG(多 zone)→ 自建 HAProxy 容器(Sidecar 在 VM 内)→ Cloud SQL 只读副本私网 IP。

步骤 2:代理层配置

  • 每台 VM 运行 HAProxy 1.9+,监听 3306(MySQL)或 5432(PostgreSQL),后端只指向本 zone 的只读副本
  • 新增 listen stats :8080,暴露 /readiness 接口,脚本逻辑:
    – MySQL:SELECT 1 成功且 Seconds_Behind_Master < 30
    – PostgreSQL:SELECT pg_is_in_recovery()=true AND pg_last_wal_receive_lsn()=pg_last_wal_replay_lsn()
    任意条件失败则返回 HTTP 503。

步骤 3:Health Check 配置

  • 协议:HTTP,路径:/readiness,端口:8080
  • 检查间隔:5 s,超时:3 s,阈值:健康 2 次,不健康 3 次;
  • 把 MIG 的自动修复打开,VM 级故障 60 s 内自动重建。

步骤 4:负载均衡器配置

  • 对外选用TCP 代理型 LB(Layer 4),保留源 IP,后端服务指向上述 MIG;
  • 会话保持关闭,避免读副本间脏读差异;
  • 启用Cloud Armor 基础规则,防止国内 DDoS 突发流量。

步骤 5:验证故障剔除

  1. 手动 STOP 某个只读副本,HAProxy 探活失败 → MIG 实例被 LB 标记为 UNHEALTHY → 15 s 内流量归零;
  2. 启动副本,复制追平 → /readiness 返回 200 → LB 自动加回;
  3. 通过 gcloud logging read "resource.type=\"gce_instance_group\" severity=INFO" 可看到自动修复日志,满足审计。

关键参数总结

  • 摘除时间 = 5 s × 3 = 15 s;
  • 恢复时间 = 5 s × 2 = 10 s;
  • RPO 仍受主库备份策略控制,只读副本故障不影响 RPO。

拓展思考

  1. 多云场景:若企业同时在阿里云 RDS 只读实例与 Cloud SQL 之间做双云只读池,可在 LB 后端再挂一个跨云 Router 节点,通过Cloud VPN 私网互联,健康检查脚本里增加“到阿里云 DTS 延迟 API”的调用,实现统一剔除。
  2. 只读副本横向扩容:Cloud SQL 单主库最多 10 个只读副本,当读流量>10 万 QPS 时,可让 HAProxy 开启多端口监听,把不同业务库拆到不同端口,减少单端口连接数瓶颈;同时把 MIG 做成基于 CPU 80% 的自动扩容,VM 数可弹性到 50+。
  3. 零信任加固:国内金融客户要求双向 TLS + 国密算法,可在 HAProxy 前再串一层Istio Ingress Gateway,把 LB 做成PASSTHROUGH,由 Istio 完成国密 SSL 卸载,健康检查下沉到 Sidecar,实现政策合规自动故障剔除兼得。