如何基于 ArgoCD Rollout 实现蓝绿数据库切换?

解读

面试官真正想考察的是:

  1. 你是否理解 Cloud SQL 本身不能做“蓝绿”,蓝绿的是“应用层 + 连接层”,数据库只能做“只读副本 → 主库提升”或“新建实例 → 数据同步 → 流量切换”。
  2. 你是否能把 ArgoCD Rollout 的流量治理能力Cloud SQL 的实例级切换 结合,做出“零停机、可回滚、可审计”的交付流水线。
  3. 你是否熟悉国内网络合规(北京/上海/深圳多可用区专线或 VPN 打通私有 VPCICP 备案域名不能随 IP 漂移)以及金融级监管对 数据一致性、可回滚时间窗 的硬性要求。
  4. 你是否能给出“失败回滚”预案:一旦新主库数据异常,如何在 分钟级 把业务切回原主库,且 RPO < 60 s

知识点

  1. Cloud SQL 高可用架构:国内区域默认提供 跨区域热备实例(HA),但 HA 只保证同区域故障自动切换,不能用于版本升级场景;升级需借助 只读副本新建实例 + 外部复制
  2. 只读副本提升(Promote):支持 北京/上海/深圳 三地副本,提升后原主自动降级为只读,IP 不变,但 连接字符串中的 project:region:instance 名称会变,需配合 Cloud SQL Auth Proxy 的 -instances 参数热更新Private Service Connect 别名
  3. ArgoCD Rollout 原理:通过 Rollout CRD 替换原生 Deployment,支持 canary、blueGreen、实验性流量分割;蓝绿模式下会同时存在 stable 与 preview 两套 ReplicaSet,由 Service selector 瞬间切换 完成流量割接。
  4. 数据同步延迟观测:Cloud SQL 提供 replication lag 指标cloudsql.googleapis.com/database/replication/seconds_behind_master),需 Prometheus + Grafana 国内镜像仓库2 分钟级告警, lag > 30 s 即阻断 promote。
  5. 国内合规细节
    • 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=7point_in_time_recovery_enabled=true

答案

整体思路:“应用蓝绿 + 数据库只读副本提升”双轨并行,用 ArgoCD Rollout 控制流量,用 Cloud SQL 原生能力完成数据层切换,全程 GitOps 审计。

步骤如下:

  1. 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 脚本
  1. 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
  1. 准备绿色数据库
    a) 在 北京/上海/深圳 任一区域新建 只读副本(或 新建实例 + 外部复制),命名 payment-green-<timestamp>
    b) 使用 gcloud sql instances promote-replica payment-green-<timestamp> --project=cn-prod 提升为独立主库,提升后 立即开启 PITR手动触发一次备份
    c) 在 Cloud DNS 国内区 新建 私有域名 payment-db-green.internalA 记录指向绿色实例的 Private IP,TTL 设为 30 s,保证切换低延迟。

  2. 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

  1. 数据一致性校验
    GitLab CI 国内 Runner 中执行
pt-table-checksum --replicate=percona.checksums --no-check-binlog-format \
  h=payment-stable.internal,u=dba,p=$PASS

DIFFS=0,则继续;否则中止并通知 DBA。

  1. 流量切换
kubectl argo rollouts promote payment-service -n payment

ArgoCD Rollout 会把 preview Service 的标签瞬间切到 stable,Pod 无需重启;由于 ConfigMap 中的 DB_HOST 已指向 payment-db-green.internal,应用新 Pod 会立即连绿色库。

  1. 观测与回滚
    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

  1. 清理
    确认绿色库运行 24 h 无异常后,在 Terraform 中删除旧蓝色实例,并 更新 prod-blue 目录的 sql-patch.yaml 指向新主库,保证下一次蓝绿基准一致。

拓展思考

  1. 双写一致性:若业务不允许短暂双写,可在切换前 加全局写锁FLUSH TABLES WITH READ LOCK 30 s),但国内 电商大促场景 无法接受,需改用 Debezium + Kafka双向同步,此时蓝绿切换需 ArgoCD Rollout 与 Kafka 消费位点联动,复杂度指数级上升。
  2. Serverless 场景:国内 Cloud Run 与 Cloud SQL 通过 Unix socket 连接/cloudsql/project:region:instance),Rollout 无法热更新 socket 路径,需把 instance 名称做成环境变量重建 Revision,此时 蓝绿切换 ≈ 新建 Revision冷启动 3~5 s 对支付链路仍是隐患,需 预留最小实例数
  3. 合规审计:金融客户要求 每一次 promote 都留痕,可把 gcloud sql instances promote-replica 的输出 写入 Git 仓库 tag,并通过 ArgoCD 的 SyncHook 调用云审计 API(cloudaudit.googleapis.com)操作人、IP、时间戳 写入 国内 Elasticsearch 集群,满足 等保 2.0 审计要求