时间序列引擎[实验性]
一种存储时间序列的表引擎,即与时间戳和标签(或标记)关联的值集
metric_name1[tag1=value1, tag2=value2, ...] = {timestamp1: value1, timestamp2: value2, ...}
metric_name2[...] = ...
这是一个实验性功能,可能在将来的版本中以不兼容的方式发生变化。使用 allow_experimental_time_series_table 设置启用 TimeSeries 表引擎的使用。输入命令 set allow_experimental_time_series_table = 1
。
语法
CREATE TABLE name [(columns)] ENGINE=TimeSeries
[SETTINGS var1=value1, ...]
[DATA db.data_table_name | DATA ENGINE data_table_engine(arguments)]
[TAGS db.tags_table_name | TAGS ENGINE tags_table_engine(arguments)]
[METRICS db.metrics_table_name | METRICS ENGINE metrics_table_engine(arguments)]
用法
从默认设置开始更容易(允许在没有指定列列表的情况下创建 TimeSeries
表)
CREATE TABLE my_table ENGINE=TimeSeries
然后可以使用以下协议使用此表(必须在服务器配置中分配端口)
目标表
TimeSeries
表没有自己的数据,所有数据都存储在其目标表中。这类似于 物化视图 的工作方式,不同之处在于物化视图有一个目标表,而 TimeSeries
表有三个目标表,分别命名为[data]{#data-table},[tags]{#tags-table], 和[metrics]{#metrics-table}。
目标表可以在 CREATE TABLE
查询中显式指定,或者 TimeSeries
表引擎可以自动生成内部目标表。
目标表如下
- data 表 {#data-table} 包含与某些标识符关联的时间序列。data 表必须具有以下列
名称 | 强制性? | 默认类型 | 可能的类型 | 描述 |
---|---|---|---|---|
id | [x] | UUID | 任何 | 标识度量名称和标签的组合 |
timestamp | [x] | DateTime64(3) | DateTime64(X) | 时间点 |
value | [x] | Float64 | Float32 或 Float64 | 与 timestamp 关联的值 |
- tags 表 {#tags-table} 包含为每个度量名称和标签组合计算的标识符。tags 表必须具有以下列
名称 | 强制性? | 默认类型 | 可能的类型 | 描述 |
---|---|---|---|---|
id | [x] | UUID | 任何(必须与[data]{#data-table} 表中的 id 类型匹配) | id 标识度量名称和标签的组合。DEFAULT 表达式指定如何计算此类标识符 |
metric_name | [x] | LowCardinality(String) | String 或 LowCardinality(String) | 度量的名称 |
<tag_value_column> | [ ] | String | String 或 LowCardinality(String) 或 LowCardinality(Nullable(String)) | 特定标签的值,标签的名称和相应列的名称在 tags_to_columns 设置中指定 |
tags | [x] | Map(LowCardinality(String), String) | Map(String, String) 或 Map(LowCardinality(String), String) 或 Map(LowCardinality(String), LowCardinality(String)) | 不包含度量名称的标签 __name__ 的标签映射,也不包含在 tags_to_columns 设置中枚举的名称的标签 |
all_tags | [ ] | Map(String, String) | Map(String, String) 或 Map(LowCardinality(String), String) 或 Map(LowCardinality(String), LowCardinality(String)) | 临时列,每行都是所有标签的映射,仅排除包含度量名称的标签 __name__ 。该列的唯一用途是在计算 id 时使用 |
min_time | [ ] | Nullable(DateTime64(3)) | DateTime64(X) 或 Nullable(DateTime64(X)) | 具有该 id 的时间序列的最小时间戳。如果 store_min_time_and_max_time 为 true ,则创建该列 |
max_time | [ ] | Nullable(DateTime64(3)) | DateTime64(X) 或 Nullable(DateTime64(X)) | 具有该 id 的时间序列的最大时间戳。如果 store_min_time_and_max_time 为 true ,则创建该列 |
- metrics 表 {#metrics-table} 包含有关已收集的指标、这些指标的类型及其描述的信息。metrics 表必须具有以下列
名称 | 强制性? | 默认类型 | 可能的类型 | 描述 |
---|---|---|---|---|
metric_family_name | [x] | String | String 或 LowCardinality(String) | 度量系列的名称 |
type | [x] | String | String 或 LowCardinality(String) | 度量系列的类型,其中之一为“counter”、“gauge”、“summary”、“stateset”、“histogram”、“gaugehistogram” |
unit | [x] | String | String 或 LowCardinality(String) | 度量中使用的单位 |
help | [x] | String | String 或 LowCardinality(String) | 度量的描述 |
插入 TimeSeries
表的任何行实际上都将存储在这三个目标表中。TimeSeries
表包含来自[data]{#data-table},[tags]{#tags-table}、[metrics]{#metrics-table} 表的所有这些列。
创建
有多种方法可以使用 TimeSeries
表引擎创建表。最简单的语句
CREATE TABLE my_table ENGINE=TimeSeries
实际上会创建以下表(可以通过执行 SHOW CREATE TABLE my_table
查看)
CREATE TABLE my_table
(
`id` UUID DEFAULT reinterpretAsUUID(sipHash128(metric_name, all_tags)),
`timestamp` DateTime64(3),
`value` Float64,
`metric_name` LowCardinality(String),
`tags` Map(LowCardinality(String), String),
`all_tags` Map(String, String),
`min_time` Nullable(DateTime64(3)),
`max_time` Nullable(DateTime64(3)),
`metric_family_name` String,
`type` String,
`unit` String,
`help` String
)
ENGINE = TimeSeries
DATA ENGINE = MergeTree ORDER BY (id, timestamp)
DATA INNER UUID '01234567-89ab-cdef-0123-456789abcdef'
TAGS ENGINE = AggregatingMergeTree PRIMARY KEY metric_name ORDER BY (metric_name, id)
TAGS INNER UUID '01234567-89ab-cdef-0123-456789abcdef'
METRICS ENGINE = ReplacingMergeTree ORDER BY metric_family_name
METRICS INNER UUID '01234567-89ab-cdef-0123-456789abcdef'
因此,这些列是自动生成的,而且此语句中还有三个内部 UUID——每个创建的内部目标表一个。(内部 UUID 通常不会显示,除非设置 show_table_uuid_in_table_create_query_if_not_nil 设置。)
内部目标表的名称类似于 .inner_id.data.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
、.inner_id.tags.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
、.inner_id.metrics.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
,并且每个目标表都具有作为主 TimeSeries
表的列子集的列
CREATE TABLE default.`.inner_id.data.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`
(
`id` UUID,
`timestamp` DateTime64(3),
`value` Float64
)
ENGINE = MergeTree
ORDER BY (id, timestamp)
CREATE TABLE default.`.inner_id.tags.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`
(
`id` UUID DEFAULT reinterpretAsUUID(sipHash128(metric_name, all_tags)),
`metric_name` LowCardinality(String),
`tags` Map(LowCardinality(String), String),
`all_tags` Map(String, String) EPHEMERAL,
`min_time` SimpleAggregateFunction(min, Nullable(DateTime64(3))),
`max_time` SimpleAggregateFunction(max, Nullable(DateTime64(3)))
)
ENGINE = AggregatingMergeTree
PRIMARY KEY metric_name
ORDER BY (metric_name, id)
CREATE TABLE default.`.inner_id.metrics.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`
(
`metric_family_name` String,
`type` String,
`unit` String,
`help` String
)
ENGINE = ReplacingMergeTree
ORDER BY metric_family_name
调整列类型
可以通过在定义主表时显式指定它们来调整内部目标表的几乎任何列的类型。例如,
CREATE TABLE my_table
(
timestamp DateTime64(6)
) ENGINE=TimeSeries
将使内部[data]{#data-table} 表以微秒而不是毫秒存储时间戳
CREATE TABLE default.`.inner_id.data.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`
(
`id` UUID,
`timestamp` DateTime64(6),
`value` Float64
)
ENGINE = MergeTree
ORDER BY (id, timestamp)
id
列
id
列包含标识符,每个标识符都是为度量名称和标签的组合计算的。id
列的 DEFAULT 表达式是一个表达式,它将用于计算这些标识符。可以通过显式指定 id
列的类型和该表达式来调整它们
CREATE TABLE my_table
(
id UInt64 DEFAULT sipHash64(metric_name, all_tags)
) ENGINE=TimeSeries
tags
和 all_tags
列
有两个包含标签映射的列——tags
和 all_tags
。在此示例中,它们含义相同,但是如果使用 tags_to_columns
设置,它们可能不同。此设置允许指定特定标签应存储在单独的列中,而不是存储在 tags
列中的映射中
CREATE TABLE my_table ENGINE=TimeSeries SETTINGS = {'instance': 'instance', 'job': 'job'}
此语句将添加列
`instance` String,
`job` String
到 my_table
及其内部[tags]{#tags-table} 目标表的定义中。在这种情况下,tags
列将不包含标签 instance
和 job
,但 all_tags
列将包含它们。all_tags
列是临时的,其唯一用途是在 id
列的 DEFAULT 表达式中使用。
可以通过显式指定它们来调整列的类型
CREATE TABLE my_table (instance LowCardinality(String), job LowCardinality(Nullable(String)))
ENGINE=TimeSeries SETTINGS = {'instance': 'instance', 'job': 'job'}
内部目标表的表引擎
默认情况下,内部目标表使用以下表引擎
- the[data]{#data-table} 表使用 MergeTree;
- the[tags]{#tags-table} 表使用 AggregatingMergeTree,因为经常将相同数据多次插入此表,因此我们需要一种方法来删除重复项,并且因为它需要对列
min_time
和max_time
进行聚合; - the[metrics]{#metrics-table} 表使用 ReplacingMergeTree,因为经常将相同数据多次插入此表,因此我们需要一种方法来删除重复项。
如果已指定,则其他表引擎也可以用于内部目标表
CREATE TABLE my_table ENGINE=TimeSeries
DATA ENGINE=ReplicatedMergeTree
TAGS ENGINE=ReplicatedAggregatingMergeTree
METRICS ENGINE=ReplicatedReplacingMergeTree
外部目标表
可以使用手动创建的表来制作 TimeSeries
表
CREATE TABLE data_for_my_table
(
`id` UUID,
`timestamp` DateTime64(3),
`value` Float64
)
ENGINE = MergeTree
ORDER BY (id, timestamp);
CREATE TABLE tags_for_my_table ...
CREATE TABLE metrics_for_my_table ...
CREATE TABLE my_table ENGINE=TimeSeries DATA data_for_my_table TAGS tags_for_my_table METRICS metrics_for_my_table;
设置
以下列出了在定义 TimeSeries
表时可以指定的设置
名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
tags_to_columns | 映射 | {} | 指定应在[tags]{#tags-table} 表中放置到单独列的标签的映射。语法:{'tag1': 'column1', 'tag2' : column2, ...} |
use_all_tags_column_to_generate_id | 布尔值 | true | 在生成表达式以计算时间序列的标识符时,此标志启用在该计算中使用 all_tags 列 |
store_min_time_and_max_time | 布尔值 | true | 如果设置为 true,则表格将为每个时间序列存储 min_time 和 max_time |
aggregate_min_time_and_max_time | 布尔值 | true | 在创建内部目标 tags 表格时,此标志允许使用 SimpleAggregateFunction(min, Nullable(DateTime64(3))) 而不是仅使用 Nullable(DateTime64(3)) 作为 min_time 列的类型,max_time 列也是如此。 |
filter_by_min_time_and_max_time | 布尔值 | true | 如果设置为 true,则表格将使用 min_time 和 max_time 列来过滤时间序列。 |
函数
以下是支持将 TimeSeries
表格作为参数的函数列表