如何定义 CouchDB 读写可用性 SLO 99.9% 并基于错误预算灭火?
解读
面试官想验证三件事:
- 能否把“99.9% 可用性”翻译成 CouchDB 可落地的量化指标;
- 能否把指标拆成读、写两条独立 SLI,并给出可观测的采集方式;
- 当错误预算被消耗时,能否用国内云原生技术栈快速“灭火”,同时兼顾离线优先场景的特殊性。
知识点
- CouchDB 读写路径差异:读走 HTTP GET /db/doc,写走 PUT /db/doc 与 quorum 写入(w=2 默认)。
- 国内可观测三板斧:阿里云 SLS、腾讯云 CLS、开源 Prometheus + Loki,均支持自定义 SLI 探针。
- 错误预算 = (1 − SLO) × 周期内总请求量;国内习惯按自然月结算,与财务账期对齐。
- CouchDB 离线优先:移动端 PouchDB 先写本地,再同步;同步失败不算“服务不可用”,需排除在 SLI 之外。
- 灭火四件套:限流、降级、副本重平衡、热补丁;国内金融场景还需报备央行报备接口。
答案
第一步:定义 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(按优先级)
- 限流:在 API 网关层(阿里云 MSE)对非关键业务 AppId 降级到 50% 流量,优先保障核心支付链路。
- 副本重平衡:若某可用区 ECS 宕机导致 quorum 不足,用** CouchDB 自带的 /_cluster_setup** 接口把副本漂到健康节点,5 min 内恢复 w=2。
- 热补丁:如果是 Erlang 虚拟机 bug,使用阿里云热修复插件替换 beam 文件,无需滚动重启。
- 离线兜底:对移动端同步失败率飙高,但核心写链路仍达标的情况,不消耗写预算,通过PouchDB 本地队列兜底,待网络恢复再同步。
第五步:复盘与预算回补
- 故障恢复后 24 h 内输出5W1H 复盘报告,抄送国内监管邮箱;
- 若因代码缺陷导致预算击穿,冻结下一次发版窗口,直到缺陷修复并灰度验证 3 天无异常。
拓展思考
- 双活多活场景:当 CouchDB 跨京沪双集群部署,网络延迟 30 ms,需把写 SLI 的 quorum 调成 w=3、n=5,否则 99.9% 难以达成。
- 边缘节点:在省级政务云边缘 K8s 中部署 CouchDB 单节点,离线写本地,定时同步中心;此时可用性只考核同步成功率,不考核实时写,避免预算被“伪失败”耗尽。
- Serverless 化:使用阿里云函数计算 FC 托管 CouchDB 的 HTTP 层,冷启动 200 ms 会拖慢 RT,需在 SLI 里把冷启动样本单独标记,防止误判。