如何把 CouchDB 当数据湖贴源层?

解读

在国内数据平台建设中,“贴源层”通常指原始数据不做任何清洗、直接落地的 ODS(Operational Data Store)区域,要求高吞吐写入、低成本存储、可回溯、可重放。CouchDB 虽然以“文档数据库”著称,但其多主复制、MVCC、附件存储、HTTP API 等特性,使其在边缘采集、IoT、移动 App 回传等场景下天然具备“数据湖入口”潜质。面试官问此题,核心想验证两点:

  1. 你是否理解数据湖贴源层的技术基准(量大、无损、可回溯、可并发追加)。
  2. 能否把 CouchDB 的特色机制与这些基准对齐,并给出可落地的中国本土化方案(信创、等保、国产化替代、成本合规)。

知识点

  1. MVCC 与追加写:CouchDB 永不原地更新,任何写入都是追加版本,天然满足“贴源层不可变”要求。
  2. db-per-time-bucket 分区策略:按“业务_年月”建库,利用shard 自动分裂compaction 独立调度,解决单库过大导致压缩耗时问题。
  3. 附件存储(attachments):二进制与 JSON 同库落地,省掉额外对象存储,一份数据一份元数据,满足等保审计“同源”要求。
  4. 双向复制 + 过滤函数:在边缘节点预打标签(如 province=粤),总部 CouchDB 通过过滤复制只拉回所需数据,节省跨省流量费(国内云厂商出流量单价高)。
  5. _changes 可重放:国内监管常要求“数据可回溯到任意秒”,CouchDB 的seq 索引配合 limit/since 参数,可实现秒级重放,无需额外 Kafka。
  6. 国产信创适配:CouchDB 3.x 已能在鲲鹏 + 麒麟 V10 上编译通过,使用国密 SM4 做磁盘加密,符合等保 2.0 对“非关系型数据库”的存储加密条款。
  7. 低成本冷存:国内公有云对象存储深度归档(如阿里云 OSS 深度归档 0.007 元/GB/月)可通过couchdb-compress工具把历史 db 文件 tar.zst 后转储,元数据仍保留在 CouchDB 目录,查询时秒级拉回,兼顾成本与合规。

答案

要把 CouchDB 当贴源层,需遵循“三不一可”原则:不清洗、不覆盖、不删库、可重放。具体落地分五步:

  1. 建模:一业务一库,库内按“时间片”设计 doc._id,如 device#{device_id}#{unix_ms},保证写入散列可范围扫描
  2. 写入:边缘节点通过PUT /db/{doc_id} 直写本地 CouchDB,q=8/n=3 保证三副本,w=2 即可返回,写入延迟 <50 ms
  3. 汇聚:总部通过_replicator 数据库建立拉取型复制,过滤函数示例:
    function(doc){ if(doc.province==='粤') return true; }
    
    这样只同步广东数据,跨省流量下降 70%
  4. 压缩与回溯:每周对上月库做压缩(compact),释放 30~50% 空间;同时把_changes?since=0 输出到国密加密文件,监管审计时可秒级重放
  5. 冷存:90 天前的库通过couchdb-dump 导出为 tar.zst,上传至阿里云 OSS 深度归档,CouchDB 端保留stub 库,查询时通过_replicate 秒级拉回,存储成本降到 1/20

通过以上步骤,CouchDB 即可在信创环境下承担TB 级日增量的贴源层职责,无需额外 Kafka/Flink,满足国内等保、成本、合规三大硬性指标。

拓展思考

  1. 多租户隔离:国内集团型公司常要求“省公司数据物理隔离”,可利用 CouchDB 的per-db 权限 + 子数据库模式,每个省一个 db,_security 对象设置 "members": {"names":["gd_admin"]}省公司只能读自己库,总部通过_replicator 超级账号聚合。
  2. Schema-on-read 校验:贴源层虽“无模式”,但可在视图(map/reduce)里做懒校验,例如
    if(!doc.deviceId || !/^\d{15}$/.test(doc.deviceId)) emit("invalid", 1);
    
    把脏数据统计出来,不影响原始 doc,又能在BI 侧及时告警
  3. 与国产大数据栈对接:CouchDB 的 _changes feed 可通过flink-couchdb-connector 直接写成Iceberg format落地到华为 MRS星环 TDH,实现湖仓一体;此时 CouchDB 作为边缘贴源层,Iceberg 作为标准化层两层解耦,既保留原始数据,又满足后续数仓清洗。