Influxdb

InfluxDB是一款流行的开源时序数据库,用于存储和分析时间序列数据。在InfluxDB中,时间序列数据通过MeasurementTagField来表示。

Measurement:
  • 相当于数据表,用于归档某一类相关时序数据。例如可以有CPU measurementMemory measurement
  • Measurement只包含时序字段,没有Schema定义。这使得InfluxDB有很高的灵活性。
  • 一个Database可以包含多个Measurement
Tag:
  • 用来标识数据所属的维度或分类。如hostregionnode等。
  • Tag的值可以是字符串或整数,支持筛选和聚合。
  • Measurement中的每条数据都需要包含相同的Tag集。Tag用于快速查询和分组数据。
  • Tag通常不会改变,如果改变会导致数据的意义和分类发生变化。
Field:
  • 包含具体的时序指标数据。如cpu_usagefree_memory等。
  • Field的值可以是浮点数、整数、字符串甚至布尔值。
  • 不同的数据点可以包含不同的Field。一个Measurement不需要预先定义Field
  • Field用于记录时序数据的变化,可以随时间变化。
  • Field支持运算和聚合,如MEANSUMCOUNT等。

一个完整的时序数据点包含MeasurementTag集和一个或多个Field。 例如:

1、Measurement: 
	CPU
	
2、Tag: 
	host=server01, region=us-west
	
3、Field: 
	cpu_usage=0.5, cpu_idle=0.4

要存储时序数据,只需要不断插入符合这一结构的数据点,InfluxDB会自动维护其时间戳和索引。 查询时序数据时,可以在MeasurementTagField上进行过滤、聚合和运算。这使得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的主要差异有:

  1. Metric需要预定义数据结构,而InfluxDB的Measurement是无Schema的。
  2. OpenTSDB只支持秒级时间戳,InfluxDB支持更高精度。
  3. OpenTSDB仅支持数值型Value,而InfluxDB的Field支持更丰富的类型。
  4. 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的主要特点有:

  1. 无Schema,Metric和Label都不需要预定义,具有很高的灵活性。
  2. 自我监控,Prometheus同时也是一个监控目标,可以监控自身状态指标。
  3. 拉式采集,不依赖外部推送,Prometheus Server主动从监控目标抓取数据。
  4. 灵活的查询语言PromQL,支持复杂的聚合分析与运算。
  5. 易于与Grafana、Alertmanager等工具集成,生态完备。
  6. 轻量级部署,提供单机版本,易于在容器与云上使用。

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实现了:

  1. 对SQL和PostgreSQL生态友好的支持,简单易用。
  2. 灵活的数据模型,Hypertable无需预定义Schema,Chunk可以根据需要设置策略。
  3. 数据分区与压缩,在Chunk层面进行时序相关优化,提高存储效率和查询性能。
  4. 支持时序函数,如降采样、滚动窗口等。这些函数可以直接在SQL中使用。
  5. 可扩展性,通过分布式能力支持超大规模时序数据。

一个完整的时序数据点在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的主要特征是:

  1. 专为高性能时序数据分析设计,性能显著优于传统关系数据库。
  2. 仅支持数值型Value,缺乏对非数值类型的支持。
  3. 较重的部署要求,需要依赖Java运行环境。
  4. SQL查询方式,易于上手和迁移现有工具/对象。
  5. 支持较复杂的Schema定义,不像Prometheus那么Schema-less。

QuestDB作为一款高性能的开源时序数据库,为SQL用户和时序数据分析带来很高价值。