4. 元数据中心建设

元数据中心到底该怎么搭?这是很多团队上来就问我的问题。我见过不少项目,一启动就急着写代码,结果半年后推倒重来。说白了,元数据中心不是一个大而全的"元数据数据库",它是一套分层、分角色的基础设施。你想想看,如果连架构都没想清楚,后面存储选型和分层设计肯定要踩坑。

4.1 整体架构:别一开始就想着大而全

我个人习惯,画架构图之前先问三个问题:数据从哪来?存哪去?谁在用? 想明白了这三件事,架构的骨架就出来了。

元数据中心的主流架构,我总结了五层。从下往上分别是:

  • 数据源层 —— 业务数据库、日志文件、外部API、消息队列。只要是能产生元数据的地方,都属于这一层。
  • 采集接入层 —— 负责拉取、解析、转换。这一层要解决"怎么采"和"采多快"的问题。
  • 存储计算层 —— 核心中的核心。元数据存哪里、怎么算,全靠这一层扛。
  • 服务接口层 —— 把元数据能力封装成API、查询、事件推送。上层应用不用关心底层存的是什么。
  • 应用消费层 —— 数据目录、数据地图、血缘分析、质量监控。这是业务直接看到的部分。

我在项目中遇到过一种情况:团队把采集和存储揉在一起写,结果想换存储引擎时,采集逻辑全得重来。所以层与层之间一定要解耦,接口要清晰。

核心原则: 每一层只做一件事,层间通过标准接口通信。宁可在接口设计上多花三天,也不要在重构上浪费三个月。
元数据中心分层架构 应用消费层 治理平台 数据目录 质量监控 服务接口层 元数据 API 血缘分析服务 数据地图服务 存储计算层 关系库 (MySQL) 图库 (Neo4j) 搜索引擎 (ES) 采集接入层 批量采集 实时采集 解析与转换 数据源层 业务数据库 日志 / 文件 外部 API 分层解耦 标准接口

4.2 存储选型:没有银弹,只有权衡

存储选型是元数据中心最让人头疼的事。我曾经有个项目,一开始只用MySQL存所有元数据,结果血缘关系越存越深,查询慢到无法接受。后来换了图库才搞定。你想想看,不同类型的元数据,访问模式完全不一样。

下面这张表是我这几年总结的选型对照,直接拿去用:

存储类型 典型代表 适合场景 不适合场景
关系型数据库 MySQL, PostgreSQL 元数据实体(表、字段、分区)、变更记录、权限信息 深层关系查询、全文检索
图数据库 Neo4j, JanusGraph 血缘分析、影响分析、数据链路追踪 高频点查、大范围聚合统计
搜索引擎 Elasticsearch 元数据检索、模糊查询、自动补全 事务性写入、复杂多跳关系
键值/对象存储 Redis, MinIO 缓存、元数据快照、大文件元数据(如数据湖清单) 结构化查询、关联分析
我的建议: 别想着用一种存储解决所有问题。混合存储是常态,关键是上层服务层要做统一屏蔽。我在项目中通常用 MySQL 存实体 + Neo4j 存血缘 + ES 做检索,三层各司其职。

存储选型的另一个关键是 数据量级预估。元数据不像业务数据那么庞大,但它的增长是"散点爆发式"的。我见过一个数据平台,上线半年后表数量从2000涨到5万,血缘关系从2万条变成80万条。如果不提前考虑扩展性,后期迁移成本极高。

这里给一个存储配置的参考示例,展示如何分层定义存储:

metadata_center:
  storage:
    relational:
      type: mysql
      host: 192.168.1.10
      database: md_core
      purpose: "存储表、字段、分区等基础元数据实体"
    graph:
      type: neo4j
      uri: bolt://192.168.1.20:7687
      purpose: "存储血缘关系、影响链路"
    search:
      type: elasticsearch
      hosts: ["192.168.1.30:9200"]
      indices:
        - name: md_search
          purpose: "元数据全文检索与快速发现"
  cache:
    type: redis
    purpose: "热点元数据缓存,降低存储层查询压力"

4.3 数据分层:把元数据整理得明明白白

数据分层这件事,说简单也简单,说复杂也复杂。我个人的经验是:分层不是越多越好,够用就行。很多团队照搬数据仓库的四层模型(ODS、DWD、DWS、ADS),结果把自己绕进去了。

元数据中心的分层,我推荐这样划分:

  1. 原始层(Raw) —— 从数据源采集过来的"原样"元数据,不做任何修改。用于追溯和重跑。
  2. 标准层(Standard) —— 经过清洗、去重、格式统一后的元数据。这是整个中心的"黄金数据"。
  3. 主题层(Subject) —— 按业务主题组织,比如"订单域"、"用户域"。方便跨系统查询。
  4. 应用层(Application) —— 为具体场景量身定制,比如数据目录的展示模型、血缘分析的图结构。

为什么要这么分?我在项目里踩过一个坑:所有元数据混在一起,开发一个数据目录功能,结果要把采集逻辑、清洗逻辑、展示逻辑全部改一遍。分层之后,每一层只关心自己的事,改一层不影响其他层。

避坑指南: 我曾经见过一个团队,在原始层就开始做数据聚合,导致后续的血缘分析完全对不上。记住:原始层必须保持"原样",一个字都不改。改了就不是原始层了。

分层的另一个好处是 数据生命周期管理。原始层的数据可以设置较短的保留期(比如30天),标准层和应用层根据业务需求保留更长时间。这样既能控制存储成本,又能保证核心数据的可用性。

下面是一个分层定义的配置示例:

metadata_center:
  layers:
    raw:
      name: "原始层"
      retention_days: 30
      description: "采集原始数据,不做任何修改"
      storage_policy: "低成本对象存储"
    standard:
      name: "标准层"
      retention_days: 180
      description: "清洗去重、格式统一后的黄金数据"
      storage_policy: "关系库 + 索引"
    subject:
      name: "主题层"
      retention_days: 365
      description: "按业务主题组织,跨系统关联"
      storage_policy: "关系库 + 图库"
    application:
      name: "应用层"
      retention_days: 365
      description: "面向场景的定制模型"
      storage_policy: "按需选用存储引擎"

4.4 落地建议:从小处着手,快速迭代

说了这么多架构和选型,最后聊点落地的事。我见过太多团队想一步到位,结果半年过去了连采集都没跑通。我的建议是:先做最小闭环,再逐步扩展。

  • 第一步: 选一个核心场景(比如数据目录),打通采集 -> 存储 -> 服务的全链路。
  • 第二步: 验证分层模型是否合理,存储选型是否满足性能要求。
  • 第三步: 逐步接入更多数据源,丰富元数据类型。
  • 第四步: 加入血缘分析、质量监控等高级能力。
记住: 元数据中心是一个"生长"出来的系统,不是"造"出来的。先跑通,再跑好。我做了这么多项目,没有一个元数据中心是一开始就设计完美的。都是在使用中不断调整、演进的。

嗯,这一章的内容就到这。架构和存储选型是元数据中心的"骨架"和"器官",数据分层是"血液循环系统"。这三件事想清楚了,后面的事情就是水到渠成。