如何使用 Superset 直连 CouchDB SQL 端点?

解读

在国内金融、政务、物联网等离线优先场景中,CouchDB 常被用作边缘节点数据库,而 Superset 是主流的开源 BI 工具。面试官问“如何直连 CouchDB SQL 端点”,核心想验证三点:

  1. 候选人是否知道 CouchDB 本身并不提供标准 SQL 接口,必须借助 CouchDB 的 Mango Query 或第三方 SQL 代理层
  2. 是否能把 Superset 的 SQLAlchemy 方言扩展机制国内网络隔离、证书合规 环境结合起来;
  3. 能否给出 可落地的配置步骤、性能调优与权限管控 方案,而不是停留在“装插件”层面。

知识点

  1. CouchDB 查询模型:
    • Mango JSON 查询 是官方推荐的类 SQL 语法,但返回仍是 JSON 文档;
    • couchdb-sql-proxy(国内镜像源:清华 TUNA 或中科大)可把 Mango 包装成 PostgreSQL 线协议,Superset 通过 dialect postgresql+psycopg2 即可连接。
  2. Superset 连接框架:
    • 依赖 SQLAlchemy URI,格式 postgresql://user:pwd@proxy-host:5432/couchdb_db
    • 必须手动上传 DB-API 2.0 驱动 到 Superset 容器内,国内离线环境建议用 whl 离线包 + pip install --no-index
  3. 安全合规:
    • 生产环境需开启 CouchDB 的 SSL 双向认证(国内等保 2.0 要求),proxy 层需挂载 国密 SM2 证书
    • Superset 侧通过 SECRET_KEY 与 CSP 白名单 防止 JSONP 注入。
  4. 性能调优:
    • Mango 索引必须提前在 CouchDB 创建 json 类型索引,否则 proxy 层会把 where 子句全表拉回;
    • Superset 的 “Allow DML” 关闭,防止大屏用户误发 PUT /db/_design/ 破坏生产视图。

答案

步骤一:部署 couchdb-sql-proxy

  1. 在能与 CouchDB 内网互通的节点拉取镜像 registry.cn-hangzhou.aliyuncs.com/acs/couchdb-sql-proxy:1.3.0(阿里云国内加速)。
  2. 启动参数:
    docker run -d --name couchdb-proxy \
      -e COUCHDB_URL=https://couchdb-cluster.internal:6984 \
      -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=${VAULT_COUCHDB_PWD} \
      -e SERVER_SSL_CERT=/certs/sm2.crt -e SERVER_SSL_KEY=/certs/sm2.key \
      -p 5432:5432
    
    其中 6984 为 CouchDB HTTPS 节点端口,证书使用 国密 SM2 并通过等保测评。

步骤二:Superset 侧配置

  1. 进入 Superset 容器,离线安装驱动:
    pip install --no-index --find-links=/whls psycopg2-binary==2.9.3
    
  2. 在“数据源 -> 添加数据库”填写 SQLAlchemy URI:
    postgresql://couchdb_reader:AES_ENCRYPTED_PWD@10.88.66.20:5432/couchdb_db?sslmode=require
    
    勾选 “Expose in SQL Lab” 与 “Allow CTA” 关闭,只读账号防止写操作。

步骤三:建表与建模

  1. 在 SQL Lab 执行 SELECT * FROM _users LIMIT 1 验证连通;
  2. 对业务文档创建 Superset dataset,把 Mango 的 fields=["orderNo","amount","status"] 映射成虚拟列;
  3. 对经常过滤的字段在 CouchDB 预先创建索引:
    curl -k -X POST https://admin:pwd@couchdb-cluster:6984/couchdb_db/_index \
      -H "Content-Type: application/json" \
      -d '{"index":{"fields":[{"status":"asc"},{"createTime":"desc"}]},"name":"idx_status_time"}'
    
  4. 在 Superset 的 dataset 里设置 时间粒度为 createTime,并开启 Query Cost Estimation,防止全表扫描把边缘节点 CPU 打满。

步骤四:权限与审计

  1. 通过 Superset 的 Alpha 角色 控制仅允许查看指定 schema;
  2. 在 couchdb-sql-proxy 侧开启 SQL 全日志,对接 阿里云 SLS华为云 LTS,保存 180 天备审;
  3. 利用 CouchDB _security 对象couchdb_reader 限定在 ["_reader"] 角色,禁止 _writer_admin

完成以上四步,即可在 Superset 里像查询 PostgreSQL 一样对 CouchDB 做可视化,同时满足国内等保、性能、离线包部署等硬性要求。

拓展思考

  1. 如果 CouchDB 节点分布在 政务外网与互联网 DMZ 两套网络,proxy 层需做 双向 TLS 桥接,并在 Superset 侧配置 DB Connection Pool 的 recycle=300s,防止长连接被政务防火墙 RST。
  2. 当 Mango 查询返回嵌套数组时,Superset 的 JSON Path 提取 性能较差,可改在 proxy 层写 PL/pgSQL 函数 把嵌套字段展平成视图,从而利用 Superset 的 Apache Pinot 实时缓存 机制。
  3. 未来 CouchDB 4.x 官方将支持 DCP 协议流式变更,可评估用 Kafka Connect CouchDB Source 把变更流同步到 国产星环 TDH,再用 Superset 对接 TDH 做 OLAP,实现 TP/AP 分离 的国产化方案。