如何测试切换?
解读
在国内 CouchDB 生产环境中,“切换”通常指 主-主集群节点故障转移、跨机房容灾切换 或 蓝绿发布中的流量切换。面试官想确认候选人能否:
- 用 可重复、可观测 的方法验证切换前后数据一致性;
- 在 国产云(阿里云、腾讯云、华为云) 与 离线边缘节点 混合场景下保证 RPO≈0、RTO<30s;
- 给出 自动化脚本 + 监控告警 方案,而不是手工点两下 Web 界面。
知识点
- CouchDB 3.x 集群仲裁机制:q=8、n=3 时,需要 ⌈n/2⌉ 节点存活才能选主。
- /_node/_local/_config
中的cluster_compat_version`:切换后必须 ≥ 当前版本号,否则节点被标记为“落后”。 - /_up
与/_membership 接口:返回节点状态cluster_nodesvsall_nodes差异,可用来判断脑裂。 - 国产云 SSD 本地盘与云盘混用:云盘挂载漂移后 UUID 不变,但
/opt/couchdb/data权限会被重置,需提前 chown couchdb:couchdb。 - 边缘场景离线优先:PouchDB 同步回 CouchDB 时,用
/_replicate的filter=_doc_ids做增量校验,避免全量重同步压垮 4G 链路。 - 一致性测试黄金命令:
任何 rev 不一致 即视为数据丢失。curl -X POST $SRC/_all_docs?include_docs=true | jq -r '.rows[] | [.id, .value.rev] | @tsv' | sort > src.tsv curl -X POST $DST/_all_docs?include_docs=true | jq -r '.rows[] | [.id, .value.rev] | @tsv' | sort > dst.tsv diff src.tsv dst.tsv - 混沌工程工具:国内常用 ChaosBlade 模拟节点宕机、网络 300ms 延迟、磁盘只读,比 Kill -9 更接近真实光纤被挖断场景。
答案
我设计的切换测试分 预检、切换、验数、回退 四步,全部用 Ansible + Shell 固化到 GitLab CI,跑在 国产云堡垒机 内网流水线,确保 安全合规不外泄。
-
预检
a) 对集群所有节点执行/_up,返回"status":"ok"且version=="3.3.2"才继续。
b) 通过/_membership确认cluster_nodes与all_nodes完全一致,差一个节点就中止切换。
c) 用/_node/couchdb@<ip>/_stats/couchdb/httpd/requests_count拉取过去 5 分钟 QPS,写入 Prometheus + 阿里云 SLS,作为切换后性能基线。 -
切换
a) 如果是 容灾演练,用 ChaosBlade 停止 Node2 的 5984 端口 120s,模拟 华为云 ECS 宕机。
b) 如果是 蓝绿发布,在 腾讯云 CLB 把权重从旧节点组(v1)切到新版节点组(v2),SLB 健康检查路径统一为/_up,超时 3s、间隔 5s、阈值 2 次。
c) 切换瞬间,脚本每秒轮询/_cluster_setup返回的state字段,直到出现"state":"cluster_enabled"才算完成,超时 30s 自动回滚。 -
验数
a) 选 3 个核心业务库,各抽 1 万条最新文档,用上面提到的 rev diff 法 比对源与目标,零差异才给绿灯。
b) 对 附件数据库,用/_show/md5/<doc_id>自定义视图输出 MD5,比对切换前后 附件二进制一致性。
c) 把验数结果生成 JUnit XML 上传到 GitLab,Merge Request 里必须 全绿 才能合并发布分支。 -
回退
a) 若验数失败或 RTO>30s,立即在阿里云 DNS 把 CNAME 切回原集群,TTL 事先已调成 60s。
b) 回退后再次跑 rev diff,确保 无回滚数据污染。
c) 最后由 运维双人复核 在堡垒机敲ansible-playbook couchdb-switch-rollback.yml -i prod.ini,任何单人均无法单独执行,满足国内 等保 2.0 双人授权 要求。
整个流程平均 RTO 18s、RPO 0 条文档,过去一年在 某省医保移动支付平台 运行 17 次真切换,零数据丢失、零用户投诉。
拓展思考
- 跨地域双向同步延迟:当北京—广州 RTT 60ms,CouchDB 连续写 5MB 附件时,写放大 会导致同步延迟 3~5s,可考虑把附件拆到 阿里云 OSS + 自定义 _attachments 外链,降低复制带宽。
- 国产信创替代:在 鲲鹏 ARM+麒麟 OS 环境编译 CouchDB 3.3 时,
spidermonkey 91会缺 libatomic,需提前yum install gcc-toolset-10-libatomic-devel,否则make报 undefined reference to __atomic_fetch_add_8,此坑在信创验收测试里常被扣分。 - 合规审计:国内金融客户要求 切换过程落库到区块链存证,可在 Ansible 回调插件里把每条
cluster_state_change事件实时推送到 蚂蚁链 BaaS,实现 事后不可篡改。