数据模型
数据模型
在 InfluxDB 中,时序数据支持多值模型,它的一条典型的时间点数据如下所示:
-
measurement: 指标对象,也即一个数据源对象。每个 measurement 可以拥有一个或多个指标值,也即下文所述的 field。在实际运用中,可以把一个现实中被检测的对象(如:“cpu”)定义为一个 measurement
-
tags: 概念等同于大多数时序数据库中的 tags, 通常通过 tags 可以唯一标示数据源。每个 tag 的 key 和 value 必须都是字符串。
-
field: 数据源记录的具体指标值。每一种指标被称作一个“field”,指标值就是 “field”对应的“value”
-
timestamp: 数据的时间戳。在 InfluxDB 中,理论上时间戳可以精确到 纳秒(ns)级别
在 InfluxDB 中,measurement 的概念之上还有一个对标传统 DBMS 的 Database 的概念,逻辑上每个 Database 下面可以有多个 measurement。在单机版的 InfluxDB 实现中,每个 Database 实际对应了一个文件系统的目录。
Serieskey
InfluxDB 中的 SeriesKey 的概念就是通常在时序数据库领域被称为 时间线 的概念, 一个 SeriesKey 在内存中的表示即为下述字符串(逗号和空格被转义)的字节数组(github.com/influxdata/influxdb/model#MakeKey()
)。
{measurement名}{tagK1}={tagV1},{tagK2}={tagV2},...
其中,SeriesKey 的长度不能超过 65535 字节
Field 类型
InfluxDB 的 Field 值支持以下数据类型:
Datatype | Size in Mem | Value Range |
---|---|---|
Float | 8 bytes | 1.797693134862315708145274237317043567981e+308 ~ 4.940656458412465441765687928682213723651e-324 |
Integer | 8 bytes | -9223372036854775808 ~ 9223372036854775807 |
String | 0 ~ 64KB | String with length less than 64KB |
Boolean | 1 byte | true 或 false |
在 InfluxDB 中,Field 的数据类型在 同一Serieskey + 同一field + 同一shard
范围内必须保持不变,否则写数据时会报错类型冲突。
Shard
在 InfluxDB 中,能且只能 对一个 Database 指定一个 Retention Policy (简称:RP)。通过 RP 可以对指定的 Database 中保存的时序数据的留存时间(duration)进行设置。而 Shard 的概念就是由 duration 衍生而来。一旦一个 Database 的 duration 确定后, 那么在该 Database 的时序数据将会在这个 duration 范围内进一步按时间进行分片从而时数据分成以一个一个的 shard 为单位进行保存。
shard 分片的时间 与 duration 之间的关系如下:
Duration of RP | Shard Duration |
---|---|
< 2 Hours | 1 Hour |
>= 2 Hours 且 <= 6 Months | 1 Day |
> 6 Months | 7 Days |
建的 Database 在未显式指定 RC 的情况下,默认的 RC 为 数据的 Duration 为永久,Shard 分片时间为 7 天。在闭源的集群版 Influxdb 中,用户可以通过 RC 规则指定数据在基于时间分片的基础上再按 SeriesKey 为单位进行进一步分片