如何设计双云双活?

解读

“双云双活”在国内通常指同城双可用区+异城双可用区的“两地四中心”布局,业务在阿里云+华为云(或腾讯云)同时可写,RPO≈0、RTO<30s。CouchDB 原生支持多主复制(multi-master replication),但默认是异步、最终一致模型,直接跨公网丢到双云会出现冲突风暴、带宽昂贵、合规审计三大痛点。面试官想考察的是:你能否在不丢数据、不停服、不踩红线的前提下,把 CouchDB 的复制语义与国内云基础设施(VPC 对等、云企业网、专线、GAAP、IAM、等保)结合起来,给出一套可落地的数据面+管控面方案。

知识点

  1. CouchDB 复制协议:基于 _changes 的增量 feed,携带 seqrev,冲突时生成分支 rev=2-xxx,需应用端后续 resolve
  2. 国内云网络合规:跨云流量必须走跨境专线审批(若含境外)、BGP 高防清洗IP 白名单+云防火墙
  3. 分片与 Q=2/N=3:CouchDB 3.x 的集群模式采用哈希分片,q=2 时一份数据只有两份,无法容忍双云同时掉盘;必须q≥4、n≥5才能满足双云各挂一个节点仍可读
  4. 双活写冲突策略
    • 时间戳+业务主键合并
    • LWW(last-write-wins) 仅适用于可丢历史场景
    • CRDT 化改造(counter、set、register)
  5. 国内监管要求等保 3 级同城双活+异地实时备份,敏感字段需国密 SM4 加密+KMS 托管,操作日志留痕≥180 天。

答案

第一步:网络与合规底座

  1. 阿里云北京可用区 A/B华为云上海可用区 C/D 分别拉起独立 VPC,通过云企业网 CEN+跨境专线打通,带宽≥10 Gbps,延迟<20 ms,走BGP 高防+IP 白名单策略,满足等保 3 级边界防护。
  2. 为 CouchDB 节点分配静态内网 IP,绑定安全组仅开放 5984/4369 端口(5984 给业务,4369 给 Erlang 节点发现),关闭公网入口,所有运维通过云堡垒机+LDAP 双因子登录。

第二步:集群拓扑与角色

  1. 每朵云各部署3 节点 CouchDB 3.3 集群,共 6 节点,q=4、n=5,确保双云任意挂一个节点仍满足读 quorum=3、写 quorum=3
  2. 使用分片感知标签:阿里云节点打 zone=ali,华为云节点打 zone=hua,CouchDB 的 placement 规则写成 {"zones": ["ali", "hua"]},强制每份分片在双云各放 2 副本,避免单云整体掉电造成数据不可读。

第三步:双向复制通道

  1. 阿里云侧创建连续复制任务 ali->hua,filter 函数过滤掉已带 cloud=hua 标记的 doc,防止回环复制;同理华为云侧建 hua->ali
  2. 复制参数调优:
    • worker_processes=16
    • connection_timeout=30000
    • http_connections=200
    • retries_per_request=5
      并开启压缩 use_compression=true,降低跨云带宽 40%
  3. 使用_replicator 数据库持久化复制任务,节点宕机后由新 master 自动接管,保证RPO<1 min

第四步:冲突治理与业务适配

  1. 在业务层引入snowflake 双云前缀doc._id = cloud(1bit)+timestamp(41bit)+seq(22bit),保证全局单调递增,冲突概率降至10^-7
  2. 库存、账户等强一致场景,采用外部分布式锁(Redis Redlock 或 etcd),先锁后写,写成功再异步复制;对日志、评论等弱一致场景,直接利用 CouchDB 的rev 分支+业务合并函数自动解决。
  3. 每日凌晨跑_view_cleanup+_compact,清理冲突分支>3 代的文档,避免rev 树爆炸导致复制延迟

第五步:监控与灰度

  1. 通过Telegraf+Prometheus采集replication lag、doc_conflicts、httpd_request_time,告警阈值lag>60s、conflicts>1000/10min
  2. 使用云解析 DNS+权重 50:50双活流量灰度,支持一键拨云:若单云故障,30 秒内把权重切到 100:0,同时暂停对端复制任务,防止脑补写入

第六步:灾备演练

  1. 每月做一次**“云级宕机”演练:直接关闭阿里云侧 3 节点,验证华为云侧读<5s、写<30s恢复;演练前快照到 OSS+OBS** 各一份,满足等保 3 级异地备份要求。

拓展思考

  1. 若业务要求强一致事务(如银行核心),CouchDB 的MVCC 模型无法满足,需引入Percolator 风格两阶段提交外部协调器(如 Apache Shardingsphere 的柔性事务),但会牺牲可用性,此时是否仍选 CouchDB?
  2. 国内数据出境评估办法要求个人信息不出境,若双云之一在香港节点,需把PII 字段本地化哈希+tokenization,仅同步脱敏后 doc,如何设计字段级加密+ KMS 跨云托管
  3. 当单文档>10 MB(图片、合同),跨云复制带宽陡增,可考虑双写对象存储(OSS/OBS),CouchDB 仅保存元数据+URL,利用云原生 CDN 回源加速,但需解决对象存储事件通知→CouchDB 更新最终一致性问题。