3. 监控体系架构设计:分层架构与技术选型
元数据质量监控体系,说白了就是一套从数据采集到最终展示的流水线。我见过不少团队,上来就写代码,结果做到一半发现采集层扛不住压力,或者存储层查个数据要等半天。嗯,这就是架构设计没想清楚。
我个人习惯,先把整个体系拆成四个逻辑层:采集层、存储层、计算层、应用层。每一层各司其职,层与层之间通过标准接口通信。这样哪怕以后要换某个组件,也不会牵一发动全身。
核心原则:分层不是目的,解耦才是。每一层只关心自己的事,不要越俎代庖。
3.1 分层架构总览
先看一张整体架构图,后面我们再逐层拆解。
这张图我画了很多遍。你会发现,数据是从下往上流的——采集层把原始元数据捞上来,存到存储层,计算层再跑规则做分析,最后应用层展示结果。反过来,配置和指令是从上往下推的。
3.2 采集层:一切的基础
采集层是整个体系的起点。数据进不来,后面全是空谈。我在项目中遇到过最头疼的问题,就是采集器把源库拖垮了。你想想看,元数据监控本来是为了保障质量,结果反而成了生产事故的导火索。
采集层要干三件事:
- 连接数据源:支持 MySQL、Hive、Kafka、HDFS 等常见系统
- 拉取元数据:表结构、分区信息、数据量、更新时间、血缘关系
- 上报采集结果:把原始数据推给存储层,同时记录采集状态
我的建议:采集层一定要做「采集链路监控」。我曾经因为一个采集任务挂了三天没发现,导致质量报告全是空的。后来我强制要求:每个采集任务必须上报心跳和延迟,超过阈值立刻告警。
技术选型上,我一般这样配:
| 场景 | 推荐技术 | 理由 |
|---|---|---|
| 关系型数据库 | Debezium + Kafka Connect | CDC 实时采集,对源库压力小 |
| 大数据组件 | 自研采集器 + 调度框架 | Hive/HDFS 元数据量大,需要定制 |
| 日志/API | Filebeat + Logstash | 轻量,生态成熟 |
| 云服务 | 云厂商 SDK + 定时任务 | 直接调用 OpenAPI 获取 |
避坑指南:我曾经用全量采集的方式每天扫一次所有表,结果某个大表有 10 万个分区,采集任务跑了 6 个小时还没结束。后来改成增量采集 + 分片并行,才把时间压到 15 分钟以内。
3.3 存储层:数据的中枢
存储层要存四类数据:
- 元数据仓库:原始元数据的历史快照,用于回溯和对比
- 质量结果库:每条质量规则的执行结果,包括通过/失败/异常
- 规则配置库:质量规则的元数据,比如规则名称、阈值、调度频率
- 时序库:质量指标的时间序列数据,用于趋势分析和告警
你可能会问,为什么不用一个库全存了?我试过,结果很惨。元数据是结构化的,质量结果需要快速写入,时序数据要支持聚合查询。混在一起,查询性能一塌糊涂。
我的推荐方案:
| 数据类型 | 存储引擎 | 核心考量 |
|---|---|---|
| 元数据仓库 | MySQL / PostgreSQL | 事务支持,复杂查询 |
| 质量结果库 | Elasticsearch | 全文检索,快速写入 |
| 规则配置库 | MySQL / Redis | 强一致性,缓存加速 |
| 时序库 | Prometheus / InfluxDB | 高压缩率,聚合查询 |
关键点:存储层一定要做数据生命周期管理。元数据快照保留 30 天,质量结果保留 90 天,时序数据可以保留更久但需要降采样。不然磁盘会爆,我吃过这个亏。
3.4 计算层:规则引擎的核心
计算层是大脑。它从存储层读取数据,跑质量规则,产出评分和异常。
计算层包含几个核心模块:
- 规则引擎:解析和执行质量规则。规则可以是 SQL 脚本、Python 函数、或者自定义 DSL
- 质量评分:对每个数据资产打分,比如完整性 95 分、准确性 88 分
- 异常检测:基于历史数据做基线,发现突增突降等异常
- 血缘分析:追踪数据从哪里来、到哪里去,辅助定位问题根因
技术选型上,我建议:
| 模块 | 推荐技术 | 说明 |
|---|---|---|
| 规则引擎 | Drools / 自研 DSL | 复杂规则用 Drools,简单规则用自研 |
| 批量计算 | Spark / Flink | 海量元数据场景,分布式计算 |
| 异常检测 | Python + 统计模型 | 3-sigma、移动平均、季节性分解 |
| 血缘解析 | Atlas / 自研解析器 | SQL 解析 + 字段级血缘 |
个人经验:规则引擎不要一开始就搞得太复杂。我见过有人花三个月写了一个通用规则引擎,结果上线后发现 80% 的规则其实就是简单的 SQL 查询。先跑起来,再慢慢迭代。
3.5 应用层:让数据说话
应用层是面向用户的。不管底层多牛,用户看不到就等于零。
应用层主要提供:
- 质量看板:实时展示整体质量评分、趋势图、Top 问题
- 告警通知:通过钉钉、邮件、短信推送异常
- 数据地图:展示数据资产的血缘关系和依赖
- 自助分析:让用户能自己查某个表的质量历史
技术选型上,我倾向:
| 功能 | 推荐技术 | 理由 |
|---|---|---|
| 看板 | Grafana / Superset | 开箱即用,支持多种数据源 |
| 告警 | AlertManager / 自研 | 与 Prometheus 集成,支持路由 |
| 数据地图 | 自研 Web 应用 | 需要定制交互和展示 |
| API 网关 | Nginx + Spring Boot | 统一入口,权限控制 |
注意:应用层最容易犯的错是「大而全」。我见过一个团队把看板做了 50 个图表,结果用户根本不知道看哪个。后来砍到 8 个核心指标,反而好评如潮。少即是多。
3.6 技术选型原则
说了这么多技术,最后聊聊选型原则。我踩过太多坑了,总结成四条:
- 匹配团队能力:团队擅长 Java 就别硬上 Go,熟悉 MySQL 就别为了「潮流」换 TiDB。技术是工具,不是信仰。
- 关注运维成本:一个组件再牛,如果运维要三个人才能搞定,那就是负担。我倾向于选社区活跃、文档齐全、部署简单的技术。
- 预留扩展空间:采集层要能方便地加新数据源,计算层要能加新规则。接口设计时留好扩展点,别写死。
- 先验证再铺开:选型前做 POC(概念验证),用真实数据跑一遍。我见过有人选了一个看起来很美的时序库,结果写入性能只有文档说的十分之一。
总结一句话:架构设计没有银弹。分层是为了控制复杂度,选型是为了匹配现实。把每一层该做的事做好,层与层之间解耦,体系自然就稳了。