指标数据逻辑存储模型

指标数据逻辑存储模型

指标数据逻辑存储模型

常见的时序数据库的数据模型,主要分成单值模型和多值模型

单值模型是根据业务指标数据建模,按照单个指标的细粒度进行数据使用和逻辑存储,如下所示,一行数据只有一个指标值,即value列。目前采用单值模型的时序数据库,有OpenTSDB、 KairosDB、Prometheus等。

1
2
3
4
单值模型:
time host metric value
2026-08-08 10:00:00 web01 cpu_usage 72
2026-08-08 10:00:00 web01 io_usage 31

多值的模型则是针对数据源建模,我们每一行数据针对的是一个数据源,它的被测量的多个指标在同一列上,如下所示,一行数据有多个指标值,即有cpu和io两列。目前采用多值模型的时序数据库,有InfluxDB、TimescaleDB等。

1
2
3
多值模型:
time host cpu_usage io_usage
2026-08-08 10:00:00 web01 72 31

可以把两者理解为:

  • 单值模型:一条时序记录只描述一个指标。
  • 多值模型:一条时序记录同时描述同一数据源在同一时刻的多个指标。

严格来说,多值模型中的多个指标是放在同一行的不同列/字段中,而不是同一列。

metric_logic_data_model

对比

对比维度 单值模型 多值模型
建模中心 指标/时间序列 数据源/实体
数据结构 固定的 value 列,指标名作为标签或表名 每个指标对应一个字段/列
写入效率 一次采集多个指标时需要写多条记录 多个指标可合并为一条记录,通常更高效
存储效率 重复保存时间戳、标签,开销可能较大 共享时间戳和标签,相关指标密集时更省空间
单指标查询 简单直接,通常性能较好 只读取一列即可,但受数据库列存储方式影响
多指标联合查询 需要按时间和标签对齐、关联 同行天然对齐,查询更方便
指标动态扩展 非常灵活,新增指标一般无需改表结构 可能需要新增字段或列,依赖数据库对动态字段的支持
稀疏数据 适合,各指标可以独立上报 容易产生大量空值或频繁的部分字段更新
数据类型 同一序列通常只有一种值类型 不同字段可以使用不同数据类型
数据一致性 多个指标分别写入,时间可能不完全一致 同一行的多个指标可作为一个采集快照写入
基数管理 指标和标签组合容易形成大量时间序列 时间序列数量可能较少,但字段数量可能膨胀

单值模型优劣势

优势

  1. 指标扩展灵活

​ 新增指标时,只需产生一个新的时间序列,不必修改表结构。特别适合指标种类动态变化、不同设备上报指标不一致的场景。

  1. 稀疏数据处理自然

​ CPU 指标每秒上报、温度每分钟上报,也可以各自独立存储,不需要人为对齐时间,更不会产生大量空字段。

  1. 单指标查询和聚合简单

​ 例如查询所有主机的 cpu_usage,可以直接针对该指标的时间序列进行扫描和聚合。

  1. 数据模型统一

​ 无论 CPU、延迟、请求数还是温度,都可以用:

1
时间戳 + 标签集合 + 指标值

统一表示,采集、传输和存储链路比较通用。

劣势

  1. 多指标写入存在重复

​ 同一设备同一时刻采集 CPU、内存、IO 时,需要写入多条记录,其中时间戳和标签会重复。

  1. 多指标关联比较复杂

    如果要计算:

    1
    CPU 使用率 / IO 使用率

    需要把两个时间序列按设备和时间对齐。遇到采样时间不同、数据缺失时,还要处理插值、窗口匹配等问题。

  2. 难以表达完整快照

​ 分别写入的 CPU 和 IO 指标不一定来自同一次采集,也不一定具有事务一致性。

多值模型的优劣势

优势

  1. 批量写入效率高

一次设备采集可以作为一行写入,时间戳和标签只需保存一次:

1
time + host + cpu + memory + io + temperature
  1. 相关指标天然对齐

同一行的数据一般表示同一数据源在同一时刻的完整快照,适合做跨指标计算和关联分析。

  1. 密集数据存储更高效

如果同一数据源的大部分指标都会同时上报,多值模型可以减少时间戳、设备标识和标签的重复。

  1. 更接近关系型查询习惯

可以直接写出类似:

1
2
3
SELECT time, cpu_usage, io_usage
FROM host_metrics
WHERE host = 'web01';

跨字段计算也很自然。

劣势

  1. 不适合高度动态的指标集合

如果设备频繁增加新的指标,可能造成字段持续增加、表结构频繁变化或产生大量动态字段。

  1. 稀疏数据可能浪费空间

不同指标采样周期不同,或者不同设备支持的指标不同,就可能出现大量空值:

1
2
time  cpu  io  temperature  voltage
t1 72 31 NULL NULL

具体浪费程度取决于数据库对空值和列式压缩的处理能力。

  1. 宽表管理困难

当指标达到数百甚至数千个时,会形成宽表,影响元数据管理、查询规划、数据迁移和模式演进。

  1. 单个字段更新可能更复杂

如果 CPU 每秒上报,而温度每分钟上报,需要选择保留旧值、写空值、部分更新或拆成多个测量表。

如何选择

适合单值模型的情况:

  • 指标经常动态增加或删除;
  • 不同数据源的指标集合差异很大;
  • 指标采样周期不同;
  • 查询以单指标聚合、监控和告警为主;
  • 数据高度稀疏;
  • 需要类似 Prometheus 的标签化指标体系。

适合多值模型的情况:

  • 同一数据源会同时采集多个固定指标;
  • 经常进行跨指标计算和关联分析;
  • 指标集合相对稳定;
  • 希望获得较高的批量写入效率;
  • 需要保留设备在某一时刻的完整快照;
  • 更习惯 SQL 和宽表分析。

实际系统通常会混合建模:把采集频率相同、业务相关且通常同时上报的指标放入一个多值表;把动态、稀疏或采样周期差异较大的指标拆开。相比纯粹选择单值或多值,这种做法往往更实用。


Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×