跳转至

数据监控架构文档

背景

我们在2023年引入了 dbt + soda,解决了大部分的数据质量校验的问题,但是只解决了数据开发过程中的数据质量问题,加上上手门槛较高,普通用户没法直接上手,需要构建一套前后端的平台,帮助用户快速上手,在解决数据质量的同时能够即时的监控业务数据的波动情况,及时反馈。确保数据满足四个基本原则:完整性、准确性、一致性和时效性。同时,还需要满足各个用户实际场景的定制化需求。

设计方案

在现有的 soda DQC 的基础上,增加支持用户界面配置校验规则的功能,支持 UI 到 Soda DSL 解析的功能, 支持分布式执行规则功能,支持用户自定义告警规则功能。

大体的架构流程如下图:

image.png 整个系统分 Master、Worker、Metadata、Monitor 5个模块,每个模块的职责如下:

  • Master:负责跟用户交互、管理元数据、定期扫描数据源生成数据集元数据、定期根据配置生成校验规则任务
  • Metadata:主要是负责保存元数据,确保分布式任务操作的原子性
  • Worker:负责具体的规则校验任务执行,包括从 Metadata 中抢占任务,解析任务,执行任务,执行完毕后更新任务的元数据(运行状态、校验状态、校验结果值等信息)
  • Monitor:不断的去 poke Metadata 获取运行状态处于校验失败且尚未发出告警信息的任务,根据告警配置信息构建告警消息体发送给告警平台或者直接发出告警信息到用户的邮箱或者企业微信中

Master 设计

Master 主要提供以下功能: 用户交互 API、元数据管理 API、数据源扫描、数据集生成、校验规则任务生成API。 用户通过界面配置数据源,数据源元数据信息写入到 metadata 中,master 的 datasource scan 进程会根据元数据,扫描数据源获取需要的数据集。 数据源元数据

字段名称 字段描述 备注
数据源名称 用于标记数据源,需要全局唯一,可以采用 {type}{catalog}
数据源类型 可支持: datalake、rds、mpp等类型
数据源 host
数据源 port
数据源 user
数据源 password
db_name 默认为空,如果 db_name 不填写、那么采集所有的db
include_db_list 默认为空,如果 db_name不填写,那么采集include_db_list里的db
exclude_db_list 默认为空,如果 db_name不填写,那么采集所有不在exclude_db_list里的 db
激活状态 如果为激活状态,那么可以启动采集任务,否则无法执行采集操作
调度周期 可以是 @daily、@hourly 也可以是 普通的 crontab 表达式

数据集元数据

字段名称 字段描述 备注
data_source_name 数据源名称
db_name DB 名称
table_name Table 名称
dataset_name 数据集名称
schedule_interval 调度周期
is_active 激活状态

校验规则元数据

字段名称 字段描述 备注
dataset_name 数据集名称
check_name 规则名称
check_yml 规则配置 yml
weight 权重
owner check 的owner
alert_list 高级列表

校验规则任务元数据

字段名称 字段描述 备注
dataset_name 数据集名称
check_name 规则名称
execution_date 运行周期
weight 权重
owner 规则owner
state 规则运行状态
retry_number 重试次数
start_date 开始时间
end_date 结束时间

校验规则任务结果元数据

字段名称 字段描述 备注
dataset_name 数据集名称
check_name 校验名称
execution_date 执行周期
owner owner
check_attribute 告警规则阈值
alert_list 告警列表
result_value 校验结果值
state 校验状态:pass、fail、error
alert_tag 告警状态

Metadata 设计

目前使用 RDS 当作 metadata 模块,目前压测是能支撑 2000 左右的并行操作, 我们目前的集群最多就启 500 个 pod,足以支撑我们的业务。

Worker 设计

worker 主要是去获取可执行的校验任务,执行校验任务。

大致流程如下图:

image.png

Monitor 设计

周期性的去轮询校验规则任务结果元数据,获取需要发出告警的任务,构建告警消息体。