3. 数据质量监控体系架构设计:分层架构与技术选型
好,咱们进入第三章。前面两章我们把数据质量的核心概念和指标体系捋了一遍,现在该聊聊怎么把这些东西落地成一套能跑起来的系统了。
我个人习惯,设计任何中大型系统,第一件事不是写代码,而是画架构图。你得先想清楚:数据从哪来?到哪去?中间经过哪些环节?每个环节干什么活?
说白了,数据质量监控体系本质上是一个数据管道。它跟普通的ETL管道很像,但它的产出不是报表,而是质量评分、异常告警、趋势分析这些运维数据。
3.1 为什么一定要分层?
我记得刚带团队那会儿,有个同事把所有的监控逻辑都写在一个Python脚本里。采集数据、计算规则、存数据库、发告警,全揉在一起。刚开始数据量小,跑得挺欢。后来业务线一多,每天几亿条数据进来,那个脚本动不动就OOM,改一个告警逻辑要重启整个进程。
嗯,这就是不分层的后果。分层架构的好处,你想想看:
- 职责单一:每一层只干一件事,出了问题好定位
- 独立扩展:计算层扛不住了,加机器就行,不用动存储层
- 技术解耦:采集层用Flume,计算层用Flink,存储层用ClickHouse,各玩各的
- 复用性强:同样的采集层,可以同时喂给实时监控和离线分析
核心原则:上层依赖下层,下层不依赖上层。每一层只跟相邻层打交道,别越级调用。
3.2 四层架构总览
我通常把数据质量监控体系拆成四层:采集层、计算层、存储层、应用层。下面这张图可以帮你快速建立整体认知。
我的经验:刚开始做的时候,别想着四层全上。先打通采集层和存储层,能存下数据再说。计算层可以先用简单的定时脚本代替,应用层用Grafana连数据库就能出图。等数据量上来了,再逐步替换成Flink和专业的告警系统。
3.3 采集层设计
采集层是整个体系的入口。数据进不来,后面全是空谈。我见过太多项目,架构画得天花乱坠,结果采集层第一天就崩了——因为没考虑到数据源的多样性。
常见的采集场景有三种:
| 数据源类型 | 采集工具 | 适用场景 | 注意事项 |
|---|---|---|---|
| 业务日志 | Filebeat / Flume | 服务器日志、应用日志 | 注意日志轮转,别丢数据 |
| 数据库变更 | Canal / Debezium | MySQL、PostgreSQL的CDC | 记得做断点续传 |
| API接口 | 自定义采集器 | 第三方系统、SaaS数据 | 做好限流和重试 |
采集层有个容易被忽略的点:元数据打标。每条数据进来的时候,除了原始内容,还得带上数据源标识、采集时间、表名、分区信息。不然后面计算层拿到数据,都不知道这条数据是哪个业务线的。
避坑指南:我曾经在一个项目里,采集层直接把原始日志原封不动地推到Kafka,没做任何格式统一。结果计算层要同时解析JSON、XML、纯文本三种格式,规则写起来痛苦得要命。后来我强制要求:采集层必须把数据转成统一的Avro或Protobuf格式,再往下游推。
3.4 计算层设计
计算层是核心,也是技术含量最高的地方。这里跑的是我们第二章定义的那些质量规则。
计算层分两条线:
- 实时计算:处理秒级延迟的监控,比如数据延迟、空值率、唯一性检查。一般用Flink或Spark Streaming。
- 离线计算:处理T+1的批量监控,比如数据完整性、跨表一致性、历史趋势分析。一般用Spark SQL或Hive。
我个人的习惯是:实时计算只做轻量级规则,比如阈值判断、简单统计。复杂的多表关联、机器学习模型,都扔给离线计算。为什么?实时计算资源贵啊,Flink集群跑一天的成本,够离线跑一周了。
规则调度架构:建议用DAG调度框架(如Airflow、DolphinScheduler)来编排离线计算任务。每个质量规则是一个独立的Task,Task之间可以设置依赖关系。比如「先做完数据完整性检查,再触发一致性检查」。
3.5 存储层设计
存储层要解决一个矛盾:监控数据既要写得快,又要查得快。采集层每秒可能涌入几万条质量记录,应用层又要支持秒级的大屏刷新和即席查询。
我推荐混合存储方案:
| 数据类型 | 存储引擎 | 原因 |
|---|---|---|
| 实时监控指标(如QPS、延迟) | InfluxDB / Prometheus | 时序数据库,写入快,聚合查询强 |
| 质量明细记录(如每行数据的校验结果) | ClickHouse / Doris | 列存,压缩率高,适合OLAP分析 |
| 规则配置、元数据、告警记录 | MySQL / PostgreSQL | 关系型数据库,事务支持好,适合频繁更新 |
嗯,这里要注意:不要把所有数据都塞进同一个数据库。我见过有人把监控指标和明细记录都放在MySQL里,结果单表几亿行,查询一个月的趋势图要等半分钟。后来拆到ClickHouse里,同样的查询秒出。
3.6 应用层设计
应用层是给人和系统看的。主要做三件事:
- 可视化:用Grafana或自研大屏,展示质量评分、异常趋势、数据健康度。
- 告警:当质量规则被触发时,通过钉钉、企微、邮件、短信通知责任人。
- 自助分析:让数据工程师能自己写SQL查质量明细,定位问题根因。
应用层有个设计细节:告警一定要分级。P0级别的告警(比如核心表数据丢失)直接电话+短信;P3级别的告警(比如某个非核心字段空值率略高)发个邮件就行。不然全员都会被告警轰炸到麻木。
一个小技巧:告警消息里最好带上「数据样例」和「最近一小时的趋势图」。这样收到告警的人不用打开系统,就能大概判断问题的严重程度。我之前的团队就是这么干的,告警响应时间从平均30分钟降到了5分钟。
3.7 技术选型原则
技术选型是个老生常谈的话题。我不喜欢列一堆「最佳实践」,因为每个公司的技术栈、团队能力、预算都不一样。我只说几条我踩过坑之后总结的原则:
- 优先选团队熟悉的技术:Flink再牛,团队没人会,出了问题没人修,还不如用Spark。
- 不要追求大而全:刚开始用MySQL+Grafana+Python脚本就能跑起来,别一上来就上Flink+Kafka+ClickHouse全家桶。
- 关注运维成本:有些技术虽然功能强,但部署和维护极其复杂。比如HBase,读写性能确实好,但RegionServer一挂,恢复起来能让你怀疑人生。
- 留好扩展接口:采集层、计算层、存储层之间的接口要标准化。今天用Kafka,明天想换Pulsar,改个配置就行,不用重写代码。
我曾经犯过的错:选了一个冷门的时序数据库,因为它的写入性能比InfluxDB快20%。结果半年后那个项目停止维护了,社区也没人贡献代码。最后我们花了两周时间做数据迁移,那两周我天天加班到凌晨。所以,选技术一定要看社区活跃度和生态成熟度。