如何结合 Cloud Load Balancing 实现只读副本的自动故障剔除?
解读
国内面试官问这道题,核心想验证三件事:
- 你是否真的在生产环境用过 Cloud SQL 只读副本,而不是只看过文档;
- 能否把 Google 原生组件(Load Balancing、Health Check、MIG)与 Cloud SQL 特性无缝拼装,做出“云原生”方案;
- 对“自动”二字有没有敬畏——故障判定、探活粒度、摘除速度、恢复后自动加回,每一步都要给出可量化的参数。
踩坑提示:Cloud SQL 只读副本本身不提供 VIP 或 Anycast IP,不能直接挂在 HTTP(S) LB 下;必须通过“自建反向代理 + 实例组 + 健康检查”这一公认套路,才能借助 Load Balancing 的流控能力完成故障剔除。
知识点
- Cloud SQL 只读副本的只读性:只接受
SELECT与SHOW语句,任何写操作都会永久中断复制;健康检查必须采用只读 SQL 或pg_is_in_recovery()这类无害命令。 - 健康检查协议:GCP 内部 Health Check 支持 HTTP、HTTPS、HTTP/2、TCP、SSL、GRPC;反向代理必须暴露 HTTP 探活端点(如
/readiness),返回 200 表示可读,返回 503 表示复制延迟超限或线程异常。 - 托管实例组(MIG)与 NEG 的区别:
- MIG 适合自建虚拟机代理层,可配置自动修复、滚动替换;
- NEG(Zonal NEG)适合 Cloud Run、GKE,但 Cloud SQL 副本没有 Sidecar 容器,国内主流仍选 MIG。
- 故障判定阈值:
- 健康检查连续失败 3 次、间隔 5 s,15 s 内完成摘除;
- 复制延迟>30 s 或线程状态≠
streaming即判死; - 恢复后连续成功 2 次才重新注册,防止抖动。
- 国内合规细节:
- 若走公网 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:验证故障剔除
- 手动
STOP某个只读副本,HAProxy 探活失败 → MIG 实例被 LB 标记为UNHEALTHY→ 15 s 内流量归零; - 启动副本,复制追平 →
/readiness返回 200 → LB 自动加回; - 通过
gcloud logging read "resource.type=\"gce_instance_group\" severity=INFO"可看到自动修复日志,满足审计。
关键参数总结:
- 摘除时间 = 5 s × 3 = 15 s;
- 恢复时间 = 5 s × 2 = 10 s;
- RPO 仍受主库备份策略控制,只读副本故障不影响 RPO。
拓展思考
- 多云场景:若企业同时在阿里云 RDS 只读实例与 Cloud SQL 之间做双云只读池,可在 LB 后端再挂一个跨云 Router 节点,通过Cloud VPN 私网互联,健康检查脚本里增加“到阿里云 DTS 延迟 API”的调用,实现统一剔除。
- 只读副本横向扩容:Cloud SQL 单主库最多 10 个只读副本,当读流量>10 万 QPS 时,可让 HAProxy 开启多端口监听,把不同业务库拆到不同端口,减少单端口连接数瓶颈;同时把 MIG 做成基于 CPU 80% 的自动扩容,VM 数可弹性到 50+。
- 零信任加固:国内金融客户要求双向 TLS + 国密算法,可在 HAProxy 前再串一层Istio Ingress Gateway,把 LB 做成PASSTHROUGH,由 Istio 完成国密 SSL 卸载,健康检查下沉到 Sidecar,实现政策合规与自动故障剔除兼得。