如何定义 CouchDB 读写可用性 SLO 99.9% 并基于错误预算灭火?

解读

面试官想验证三件事:

  1. 能否把“99.9% 可用性”翻译成 CouchDB 可落地的量化指标
  2. 能否把指标拆成读、写两条独立 SLI,并给出可观测的采集方式
  3. 当错误预算被消耗时,能否用国内云原生技术栈快速“灭火”,同时兼顾离线优先场景的特殊性。

知识点

  1. CouchDB 读写路径差异:读走 HTTP GET /db/doc,写走 PUT /db/doc 与 quorum 写入(w=2 默认)。
  2. 国内可观测三板斧:阿里云 SLS、腾讯云 CLS、开源 Prometheus + Loki,均支持自定义 SLI 探针
  3. 错误预算 = (1 − SLO) × 周期内总请求量;国内习惯按自然月结算,与财务账期对齐。
  4. CouchDB 离线优先:移动端 PouchDB 先写本地,再同步;同步失败不算“服务不可用”,需排除在 SLI 之外
  5. 灭火四件套:限流、降级、副本重平衡、热补丁;国内金融场景还需报备央行报备接口

答案

第一步:定义 SLI

  • 读 SLI:集群内所有节点对 GET /{db}/{docid} 的成功响应率(状态码 2xx 且响应时间 ≤ 500 ms)。
  • 写 SLI:集群内 PUT /{db}/{docid} 的成功响应率(状态码 2xx 且满足 w=2 持久化确认)。

第二步:采集与聚合

  • 阿里云容器服务 ACK 的 Ingress-Nginx 侧注入 Lua 探针,把每次读写请求的 status、rt、node 名称、分片 打到 SLS。
  • 每 1 min 聚合一次:
    读成功率 = 成功读请求数 ÷ 总读请求数
    写成功率 = 成功写请求数 ÷ 总写请求数
  • 最终 SLO:
    月度读可用性 ≥ 99.9%
    月度写可用性 ≥ 99.9%

第三步:错误预算

  • 假设集群月请求量 3 亿,则读、写各自预算 = 0.1% × 3 亿 = 30 万次失败
  • 预算消耗到 70% 时触发黄色告警,90% 触发红色告警并拉通应急群(钉钉+OnCall 电话)

第四步:灭火 playbook(按优先级)

  1. 限流:在 API 网关层(阿里云 MSE)对非关键业务 AppId 降级到 50% 流量,优先保障核心支付链路
  2. 副本重平衡:若某可用区 ECS 宕机导致 quorum 不足,用** CouchDB 自带的 /_cluster_setup** 接口把副本漂到健康节点,5 min 内恢复 w=2
  3. 热补丁:如果是 Erlang 虚拟机 bug,使用阿里云热修复插件替换 beam 文件,无需滚动重启
  4. 离线兜底:对移动端同步失败率飙高,但核心写链路仍达标的情况,不消耗写预算,通过PouchDB 本地队列兜底,待网络恢复再同步。

第五步:复盘与预算回补

  • 故障恢复后 24 h 内输出5W1H 复盘报告,抄送国内监管邮箱;
  • 若因代码缺陷导致预算击穿,冻结下一次发版窗口,直到缺陷修复并灰度验证 3 天无异常。

拓展思考

  1. 双活多活场景:当 CouchDB 跨京沪双集群部署,网络延迟 30 ms,需把写 SLI 的 quorum 调成 w=3、n=5,否则 99.9% 难以达成。
  2. 边缘节点:在省级政务云边缘 K8s 中部署 CouchDB 单节点,离线写本地,定时同步中心;此时可用性只考核同步成功率,不考核实时写,避免预算被“伪失败”耗尽。
  3. Serverless 化:使用阿里云函数计算 FC 托管 CouchDB 的 HTTP 层,冷启动 200 ms 会拖慢 RT,需在 SLI 里把冷启动样本单独标记,防止误判。