如何导出数据?

解读

在国内 CouchDB 面试中,面试官问“如何导出数据”并不是想听你背命令,而是考察三点:

  1. 你是否清楚 CouchDB 的“文档-附件-序列化”模型 与关系型导出差异;
  2. 面对 GB~TB 级生产库,能否给出 不停机、不断增量、不丢序列化类型 的实战方案;
  3. 是否了解 国产化合规要求(等保、信创、长周期归档),能把技术动作解释成审计语言。
    回答时先分层:小库一次性、大库在线流式、合规加密归档,再给出可落地的脚本与回滚验证手段,才能拿到高分。

知识点

  • CouchDB 序列化格式:JSON + Base64 附件,保留 _id_rev_attachments 元数据,丢失任一字段会导致后续增量复制失败。
  • /_all_docs/_changes 语义差异:前者只能拿最新 rev,后者带 seq 可做断点续传,是增量导出核心。
  • couchbackup / couchrestore:IBM 开源的 Node.js 流式工具,支持 自定义缓冲行数Snappy 压缩,国内镜像源可配淘宝 NPM。
  • couch-dump:Python 单文件脚本,适合 <100 GB 库,可直接输出 gzip 分卷,方便上云 OSS。
  • 复制(Replication)协议:CouchDB 原生双向复制,目标可以是本地 LevelDB 文件(通过 pouchdb-server),实现“离线镜像”式导出。
  • 等保 2.0 对导出要求:敏感字段需 国密 SM4 加密,传输走 TLS 1.3,日志留存 ≥ 180 天,脚本必须支持 非交互式 AK/SK 读取。
  • 大数据量优化:使用 seq_interval=10000feed=longpoll 降低 Coordinator 节点毛刺;在国产 ARM 服务器上建议把 Erlang 调度器绑定到物理核,避免 NUMA 抖动。

答案

线上环境以“可续传、可加密、可验证”三原则作答,给出两套方案:

方案 A:中小库(<200 GB,单节点)

  1. 安装工具:
    npm install -g couchbackup --registry=https://registry.npmmirror.com
  2. 一次性全量:
    couchbackup --url https://user:pass@db1:6984 --db order --log order.log | gzip > order-$(date +%F).couch
  3. 加密归档(满足等保):
    openssl enc -sm4-cbc -salt -in order-(date+(date +%F).couch -out order-(date +%F).couch.sm4 -kfile /etc/couch/keys/sm4.pass
  4. 回滚验证:
    couchrestore --url http://localhost:5984 --db order_test <(gunzip < order-$(date +%F).couch)
    比对 curl http://localhost:5984/order_test | jq '.doc_count' 与源库是否一致。

方案 B:大库或不允许停机(≥200 GB,三节点集群)

  1. 开启 专用复制用户(角色 replicator),白名单源 IP;
  2. 在备份节点启动 pouchdb-server 作为临时目标,磁盘采用 国产麒麟系统 + ext4 + 64 KB 块大小,降低碎片;
  3. 使用 _changes?feed=continuous&heartbeat=10000&since=last_seq断点续传复制,脚本每 10 分钟把 last_seq 写入 /opt/couch/seq.log
  4. 复制完成后,用 tar --tape-length=8589934592 分卷打包,每卷 8 GB 便于上云
  5. 通过 rclone + 国密 TLS 1.3 上传至 天翼云 OOS,桶策略开启 多 AZ 复制
  6. 最终做 SHA-256 全量校验,值写入 区块链存证平台(如长安链),满足金融客户审计。

拓展思考

  1. 如果面试官追问“如何只导出最近 7 天变更”,可答:用 _changes 过滤 startkey=7days_ago_seq,再写 视图 _design/partial 把结果集流式导入 Kafka,实现 CDC。
  2. 若问“导出时 CPU 飙高怎么办”,可提 Erlang 的 +P 1000000 调大进程池,并把 couchbackup--buffer-size 从默认 500 降到 50,牺牲吞吐换毛刺平滑
  3. 国产化场景下,couchbackup 依赖 Node.js,需提前编译 龙芯或鲲鹏 ARM64 原生镜像,否则现场编译会超时;可引用 华为开源镜像站 的预编译包,体现你对信创生态的熟悉度。