Influxdb
InfluxDB
是一款流行的开源时序数据库,用于存储和分析时间序列数据。在InfluxDB中,时间序列数据通过Measurement
、Tag
和Field
来表示。
Measurement:
- 相当于数据表,用于归档某一类相关时序数据。例如可以有
CPU measurement
和Memory measurement
。 Measurement
只包含时序字段,没有Schema
定义。这使得InfluxDB
有很高的灵活性。- 一个
Database
可以包含多个Measurement
。
Tag:
- 用来标识数据所属的维度或分类。如
host
、region
和node
等。 Tag
的值可以是字符串或整数,支持筛选和聚合。Measurement
中的每条数据都需要包含相同的Tag
集。Tag
用于快速查询和分组数据。Tag
通常不会改变,如果改变会导致数据的意义和分类发生变化。
Field:
- 包含具体的时序指标数据。如
cpu_usage
、free_memory
等。 Field
的值可以是浮点数、整数、字符串甚至布尔值。- 不同的数据点可以包含不同的
Field
。一个Measurement
不需要预先定义Field
。 Field
用于记录时序数据的变化,可以随时间变化。Field
支持运算和聚合,如MEAN
、SUM
、COUNT
等。
一个完整的时序数据点包含Measurement
、Tag
集和一个或多个Field
。
例如:
1、Measurement:
CPU
2、Tag:
host=server01, region=us-west
3、Field:
cpu_usage=0.5, cpu_idle=0.4
要存储时序数据,只需要不断插入符合这一结构的数据点,InfluxDB
会自动维护其时间戳和索引。
查询时序数据时,可以在Measurement
、Tag
和Field
上进行过滤、聚合和运算。这使得InfluxDB
具有强大的时间序列分析能力。其灵活的结构也使我们可以随时调整和丰富时序数据的维度与指标。
InfluxDB
通过这一时序数据结构,提供了易于使用且功能强大的时间序列存储与分析平台。
OpenTsdb
OpenTSDB是一款开源的分布式时序数据库,用于海量时间序列数据的存储和分析。它的数据模型主要由Metric、Timestamp和Value组成。
Metric:
- 相当于InfluxDB中的Measurement,用于表示一个时序数据分类。
- 每个Metric都需要定义数据点中的字段(tags)和字段类型(tagk 和 tagv)。
- 一个OpenTSDB实例可以包含任意数量的Metric。
Timestamp:
- 表示时序数据点的时间戳,精确到秒。
- 时间戳是时序数据的索引,用于快速查询时间范围内的数据。
- 数据点时间戳必须是唯一且递增的。
Value:
- 表示时序数据点的数值,可以是整数或浮点数。
- 每个数据点必须包含一个Value。一个Metric可以有多个Value,表示不同的指标。
- Value用于记录时序数据的变化,以表现指标随时间的趋势。
除此之外,每个数据点还可以包含一个或多个Tag,用来记录该数据点的维度信息。Tag类似于InfluxDB,用于快速grouping和filtering数据。 一个完整的OpenTSDB数据点包含:
Metric - 定义数据结构
Timestamp - 时间戳,作为索引
Value - 时序指标数据
Tag(可选)- 数据维度信息
例如:
###################################################
Metric: sys.cpu.user
Timestamp: 1577836800
Value: 0.2
Tagk: host tagv: web01
####################################################
Metric: sys.cpu.system
Timestamp: 1577836800
Value: 0.1
Tagk: host tagv: web01
###################################################
与InfluxDB相比,OpenTSDB的主要差异有:
- Metric需要预定义数据结构,而InfluxDB的Measurement是无Schema的。
- OpenTSDB只支持秒级时间戳,InfluxDB支持更高精度。
- OpenTSDB仅支持数值型Value,而InfluxDB的Field支持更丰富的类型。
- InfluxDB有更加简单的部署方式,OpenTSDB较重且复杂。
Prometheus
Prometheus是一款流行的开源时序数据库,专为监控系统和时序数据构建。它的数据模型主要由Metric、Label和 Sample组成。
Metric:
- 表示一个时序指标,对应于一个监控指标名称。如cpu_usage、free_memory等。
- Metric仅包含时序数据名称,没有预定义的结构或类型。这使Prometheus具有很高的灵活性。
- 一个Prometheus实例可以包含任意数量的Metric。
Label:
- 用来描述和区分相同Metric的数据。类似于其他时序数据库的Tag。
- Label通常表示数据的维度或属性,如instance、job、region等。
- 每个样本数据都必须包含相同的Label集。Label用于快速查询和聚合特定维度的数据。
- Label的值可以是字符串、布尔值或整数。支持在Label上过滤和分组数据。
Sample:
- 表示一条时序数据,包含Timestamp、Value和Label集。
- Timestamp表示时序数据的时间戳,精度为毫秒。它用于排序和查询给定时间范围的数据。
- Value表示时序指标的值,可以是浮点数、整数或字符串。
- Label集用于标识该Sample数据的属性与维度。相同Label的Sample表示同一指标的不同记录。
一个Prometheus Sample包含:
Metric - 时序指标名称
Timestamp - 时间戳,毫秒精度
Value - 指标数值
Label - 数据属性集
例如:
###################################################
Metric: cpu_usage
Timestamp: 1577836800000
Value: 0.6
Label: instance="web01", job="webapp"
###################################################
Metric: free_memory
Timestamp: 1577836800000
Value: 20*1024*1024
Label: instance="web01", job="webapp"
###################################################
与其他时序数据库相比,Prometheus的主要特点有:
- 无Schema,Metric和Label都不需要预定义,具有很高的灵活性。
- 自我监控,Prometheus同时也是一个监控目标,可以监控自身状态指标。
- 拉式采集,不依赖外部推送,Prometheus Server主动从监控目标抓取数据。
- 灵活的查询语言PromQL,支持复杂的聚合分析与运算。
- 易于与Grafana、Alertmanager等工具集成,生态完备。
- 轻量级部署,提供单机版本,易于在容器与云上使用。
Prometheus通过简单 yet 功能强大的数据模型与查询语言,加上易于组合的工具生态,已经成为云原生监控的事实标准。
TimescaleDB
TimescaleDB是一款开源的时序数据库,构建在PostgreSQL之上。它继承了PostgreSQL的所有功能,并在此基础上进行时序相关扩展,用于存储和分析大规模时间序列数据。 TimescaleDB的数据模型主要由Hypertable、Chunk和 Raw Timeseries三部分组成。
Hypertable:
- 相当于PostgreSQL的表,用于存储时序数据。
- 每个Hypertable都需要指定两个时间相关的列,作为主键和时序索引。
- Hypertable可以存储原生PostgreSQL数据类型,并支持标准的SQL查询、索引等功能。
- 一个Database可以包含任意数量的Hypertable。
Chunk:
- 在Hypertable下进行细分,用于按时间范围划分时序数据。
- 每个Chunk包含指定时间范围内的所有Raw Timeseries。
- Chunk是TimescaleDB进行查询优化和下采样的基本单位。在Chunk级别可以设置不同的压缩与索引策略。
Raw Timeseries:
- 表示原始的时序数据点,包含时间戳、指标值和其他维度信息(标签)。
- 一个Raw Timeseries必须归属于一个Chunk,通过Chunk来确定其所在的时间范围。
- Raw Timeseries支持PostgreSQL数据类型,用于记录时序数据的变化,可以随时间变化。
通过Hypertable、Chunk和Raw Timeseries三层结构,TimescaleDB实现了:
- 对SQL和PostgreSQL生态友好的支持,简单易用。
- 灵活的数据模型,Hypertable无需预定义Schema,Chunk可以根据需要设置策略。
- 数据分区与压缩,在Chunk层面进行时序相关优化,提高存储效率和查询性能。
- 支持时序函数,如降采样、滚动窗口等。这些函数可以直接在SQL中使用。
- 可扩展性,通过分布式能力支持超大规模时序数据。
一个完整的时序数据点在TimescaleDB中表示为:
Hypertable - 逻辑表,确定数据结构
Chunk - 确定数据所在时间范围
Raw Timeseries - 包含指标时间戳与值
例如:
Hypertable: conditions
- timec (timestamp,字段1, 字段2, ...)
- location (lat, lon) ...
Chunk: 2020-01-01 00:00:00 to 2020-01-31 23:59:59
Raw Timeseries:
- timec: 2020-01-15 12:30, 20, 30%
- location: 37.7°, -122.4°
- timec: 2020-01-20 15:10, 25, 35%
- location: 37.8°, -122.41°
...
TimescaleDB通过 Postgres相容的界面和丰富的SQL支持,为时序数据管理带来非常简洁和自然的体验。同时,其在存储效率和时序查询性能上的优化,以及强大的分布式能力,使其成为管理大规模时序数据的理想平台。
QuestDB
QuestDB是一款开源的时序数据库,基于列式存储设计,专为高性能时序数据 analytic 而构建。它的数据模型主要由Symbol、Timestamp和Value组成。
Symbol:
- 相当于数据表,对应存储一类时序数据。每个Symbol都需要定义Schema,包含字段名称和类型。
- QuestDB支持的字段类型有:boolean、byte、short、int、long、float、double、string等。
- 一个QuestDB实例可以包含任意数量的Symbol。
Timestamp:
- 表示时序数据点的时间戳,精度为毫秒。用于对数据进行排序和快速查询给定时间范围的数据。
- 需要定义为TIMESTAMP类型,QuestDB使用时间戳作为主键。
- 数据点时间戳必须是唯一且递增的。
Value:
- 记录时序数据点的数值,只支持数值型数据如float、int等。不支持非数值类型。
- 每个数据点必须包含一个Value。一个Symbol可以有多个Value,表示不同的指标。
- Value的变化趋势表明指标随时间的变化,用于时间序列分析。
除此之外,每个数据点还可以包含一个或多个Tag,用来记录该数据点的维度信息。Tag可以是字符串或整数,用于快速过滤和分组数据。
一个完整的QuestDB数据点包含:
Symbol - 定义数据结构
Timestamp - 时间戳,毫秒精度
Value - 时序指标数据
Tag(可选)- 数据维度信息
例如:
Symbol: cpu
Timestamp: 1577836800000
Value: 0.6
Tag: host=server1
与其他时序数据库相比,QuestDB的主要特征是:
- 专为高性能时序数据分析设计,性能显著优于传统关系数据库。
- 仅支持数值型Value,缺乏对非数值类型的支持。
- 较重的部署要求,需要依赖Java运行环境。
- SQL查询方式,易于上手和迁移现有工具/对象。
- 支持较复杂的Schema定义,不像Prometheus那么Schema-less。
QuestDB作为一款高性能的开源时序数据库,为SQL用户和时序数据分析带来很高价值。
标签:Metric,深入浅出,Value,时序,开源,Tag,2022,Label,数据 From: https://blog.51cto.com/mickeyzzc/9025412