如何基于 ArgoCD Rollout 实现蓝绿数据库切换?
解读
面试官真正想考察的是:
- 你是否理解 Cloud SQL 本身不能做“蓝绿”,蓝绿的是“应用层 + 连接层”,数据库只能做“只读副本 → 主库提升”或“新建实例 → 数据同步 → 流量切换”。
- 你是否能把 ArgoCD Rollout 的流量治理能力 与 Cloud SQL 的实例级切换 结合,做出“零停机、可回滚、可审计”的交付流水线。
- 你是否熟悉国内网络合规(北京/上海/深圳多可用区、专线或 VPN 打通私有 VPC、ICP 备案域名不能随 IP 漂移)以及金融级监管对 数据一致性、可回滚时间窗 的硬性要求。
- 你是否能给出“失败回滚”预案:一旦新主库数据异常,如何在 分钟级 把业务切回原主库,且 RPO < 60 s。
知识点
- Cloud SQL 高可用架构:国内区域默认提供 跨区域热备实例(HA),但 HA 只保证同区域故障自动切换,不能用于版本升级场景;升级需借助 只读副本 或 新建实例 + 外部复制。
- 只读副本提升(Promote):支持 北京/上海/深圳 三地副本,提升后原主自动降级为只读,IP 不变,但 连接字符串中的 project:region:instance 名称会变,需配合 Cloud SQL Auth Proxy 的 -instances 参数热更新 或 Private Service Connect 别名。
- ArgoCD Rollout 原理:通过 Rollout CRD 替换原生 Deployment,支持 canary、blueGreen、实验性流量分割;蓝绿模式下会同时存在 stable 与 preview 两套 ReplicaSet,由 Service selector 瞬间切换 完成流量割接。
- 数据同步延迟观测:Cloud SQL 提供 replication lag 指标(
cloudsql.googleapis.com/database/replication/seconds_behind_master),需 Prometheus + Grafana 国内镜像仓库 做 2 分钟级告警, lag > 30 s 即阻断 promote。 - 国内合规细节:
- Private IP 必须通过 VPC Peering 或专线 与 IDC 互通,Public IP 需加白名单并备案。
- Terraform 模板必须放在中国版 Cloud Shell(cloud.google.cn) 执行,否则
google_sql_database_instance资源会落到海外。 - 备份保留期金融场景要求 至少 30 天,需显式设置
settings.backup_configuration.transaction_log_retention_days=7与point_in_time_recovery_enabled=true。
答案
整体思路:“应用蓝绿 + 数据库只读副本提升”双轨并行,用 ArgoCD Rollout 控制流量,用 Cloud SQL 原生能力完成数据层切换,全程 GitOps 审计。
步骤如下:
- Git 仓库目录结构
├── env
│ ├── prod-blue
│ │ ├── kustomization.yaml
│ │ ├── rollout-patch.yaml # 指向 stable Service
│ │ └── sql-patch.yaml # 指向原主库 instance-id
│ └── prod-green
│ ├── kustomization.yaml
│ ├── rollout-patch.yaml # 指向 preview Service
│ └── sql-patch.yaml # 指向新主库 instance-id
├── base
│ ├── rollout.yaml
│ ├── service.yaml
│ └── configmap.yaml # 存放 DB_HOST
└── promote.sh # 一键 promote 脚本
- base/rollout.yaml 关键片段
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: payment-service
spec:
strategy:
blueGreen:
activeService: payment-stable
previewService: payment-preview
autoPromotionEnabled: false # 手工卡点,等 DBA 确认
scaleDownDelaySeconds: 300 # 留 5 分钟观察窗
selector:
matchLabels:
app: payment
template:
metadata:
labels:
app: payment
version: "{{ .Values.version }}"
spec:
containers:
- name: payment
image: gcr-cn-beijing.aliyuncs.com/payment:v{version}
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: payment-db-config
key: DB_HOST
-
准备绿色数据库
a) 在 北京/上海/深圳 任一区域新建 只读副本(或 新建实例 + 外部复制),命名payment-green-<timestamp>。
b) 使用gcloud sql instances promote-replica payment-green-<timestamp> --project=cn-prod提升为独立主库,提升后 立即开启 PITR 并 手动触发一次备份。
c) 在 Cloud DNS 国内区 新建 私有域名payment-db-green.internal,A 记录指向绿色实例的 Private IP,TTL 设为 30 s,保证切换低延迟。 -
ArgoCD 同步绿色环境
argocd app create payment-green \
--repo https://code.aliyun.com/cn-prod/payment-gitops.git \
--path env/prod-green \
--dest-server https://kubernetes.default.svc \
--dest-namespace payment
argocd app sync payment-green
此时 Rollout 会创建 preview ReplicaSet,但流量仍在 stable Service。
- 数据一致性校验
在 GitLab CI 国内 Runner 中执行
pt-table-checksum --replicate=percona.checksums --no-check-binlog-format \
h=payment-stable.internal,u=dba,p=$PASS
若 DIFFS=0,则继续;否则中止并通知 DBA。
- 流量切换
kubectl argo rollouts promote payment-service -n payment
ArgoCD Rollout 会把 preview Service 的标签瞬间切到 stable,Pod 无需重启;由于 ConfigMap 中的 DB_HOST 已指向 payment-db-green.internal,应用新 Pod 会立即连绿色库。
- 观测与回滚
a) 通过 Grafana 国内镜像版 监控 replication lag、QPS、错误日志。
b) 若 5 分钟内错误率 > 1%,执行
kubectl argo rollouts abort payment-service -n payment
ArgoCD 会 秒级把 Service selector 切回原 stable ReplicaSet;同时 DNS 改回 payment-db-blue.internal(TTL 30 s 内生效),实现 分钟级回滚,RPO < 60 s。
- 清理
确认绿色库运行 24 h 无异常后,在 Terraform 中删除旧蓝色实例,并 更新 prod-blue 目录的 sql-patch.yaml 指向新主库,保证下一次蓝绿基准一致。
拓展思考
- 双写一致性:若业务不允许短暂双写,可在切换前 加全局写锁(
FLUSH TABLES WITH READ LOCK30 s),但国内 电商大促场景 无法接受,需改用 Debezium + Kafka 做 双向同步,此时蓝绿切换需 ArgoCD Rollout 与 Kafka 消费位点联动,复杂度指数级上升。 - Serverless 场景:国内 Cloud Run 与 Cloud SQL 通过 Unix socket 连接(
/cloudsql/project:region:instance),Rollout 无法热更新 socket 路径,需把 instance 名称做成环境变量并 重建 Revision,此时 蓝绿切换 ≈ 新建 Revision,冷启动 3~5 s 对支付链路仍是隐患,需 预留最小实例数。 - 合规审计:金融客户要求 每一次 promote 都留痕,可把 gcloud sql instances promote-replica 的输出 写入 Git 仓库 tag,并通过 ArgoCD 的 SyncHook 调用云审计 API(cloudaudit.googleapis.com) 把 操作人、IP、时间戳 写入 国内 Elasticsearch 集群,满足 等保 2.0 审计要求。