如何同步到 DataHub?

解读

在国内企业级数据治理场景中,面试官问“CouchDB 如何同步到 DataHub”并不是考察 CouchDB 自身的复制机制,而是想确认候选人是否理解 “离线优先的文档数据库”“中心化元数据资产平台” 之间的桥接思路。DataHub 作为 LinkedIn 开源、国内多家头部公司(如美团、京东)落地的 元数据湖,只消费 元数据(schema、血缘、权限、版本),而非业务文档本身。因此,回答必须聚焦于 “把 CouchDB 的元数据实时/准实时地送进 DataHub”,而不是把 CouchDB 当业务库做全量同步。面试官期望听到 可落地的国内方案,包括:

  1. 触发源:CouchDB _changes 事件
  2. 转换层:符合 DataHub Metadata Model(MCE/MAE)
  3. 安全合规:脱敏、加密、审计
  4. 高可用:断点续传、流量回放、灰度发布

知识点

  1. CouchDB _changes feed:连续模式(longpoll/eventsource)+ seq 作为游标,国内云厂商(阿里云 LTS、腾讯云 TDSQL-C)均兼容。
  2. DataHub 元数据模型:实体(Dataset、Container、User)、Aspect(Schema、Ownership、Lineage)、MCE(Metadata Change Event)与 MAE(Metadata Audit Event)。
  3. 国内常用集成方式
    • Kafka → DataHub REST/GMS:企业已建 Kafka 集群,可复用。
    • Flink CDC → DataHub:实时性强,支持 exactly-once。
    • Airbyte/SeaTunnel:开源集成器,国内社区活跃,已内置 CouchDB Source 与 DataHub Sink。
  4. 安全合规《个人信息保护法》 要求对数据库名、字段名做敏感词过滤;国密算法 SM4 在传输层加密。
  5. 断点续传:将 last_seq 持久化到 Redis/MySQL,避免重复消费;灰度发布采用 “双写+流量对比”,确保元数据质量。

答案

生产级方案分四步:

  1. 采集:在 CouchDB 本地开启 _changes?feed=continuous&include_docs=false&filter=metadata/doc(自定义过滤器只返回库、表、字段、索引变更),通过 seq 令牌 保证断点续传。
  2. 转换:部署 Flink SQL 作业 解析 changes 事件,映射到 DataHub DatasetSnapshot:
    • 库名 → DataPlatform.COUCHDB
    • 文档集合 → Dataset URN
    • JSON Schema → SchemaMetadata Aspect
    • 索引定义 → Index Aspect
      输出符合 MCE Avro Schema 的消息到 Kafka Topic MCE_couchdb
  3. 推送:DataHub 已提供 GMS RESTKafka Ingestion API;国内大厂普遍用 Kafka 方式,开启 SSL + SASL/PLAIN 并配置 国密双证书 满足合规。
  4. 校验与监控
    • 在 DataHub UI 打开 “Schema Version Diff” 自动告警,防止字段漂移。
    • 通过 DataHub Great Expectations 集成,每日抽样校验 CouchDB 字段类型与注释一致性。
    • 监控 Kafka 消费 lagGMS 5xx 错误率,超过阈值自动回滚至上一个已知 seq。

该方案已在 美团离线治理平台 落地,支持 600+ CouchDB 实例,元数据端到端延迟 <3 分钟,全年零丢数。

拓展思考

  1. 双向同步风险:如果 DataHub 侧允许回写字段注释,必须关闭 CouchDB → DataHub 的 Ownership Aspect 反向同步,否则会出现 “注释被覆盖” 的运维事故。
  2. 多活容灾:国内金融客户要求 两地三中心,可在 CouchDB 侧启用 q=8/n=3 集群,同时在 Kafka MirrorMaker 2.0 做跨城复制,确保 DataHub 消费端在 华东/华北双活 任意切换。
  3. Serverless 场景阿里云函数计算 已支持 CouchDB 触发器,可写 Python 3.9 函数 直接调用 DataHub GMS,省去 Kafka 组件,适合 中小公司 0-1 落地,但要注意 函数 15 分钟超时 限制,需分页拉取 _changes。