InfluxDB 架构设计建议
使用以下指南来设计您的 模式,以实现更简单和更高性能的查询。
InfluxDB 数据结构
InfluxDB Clustered 数据模型将时间序列数据组织到数据库和表中。一个数据库可以包含多个表。表包含多个标签和字段。
数据库:一个命名的位置,用于存储时间序列数据。在 InfluxDB Clustered 中,数据库 与 InfluxDB Cloud Serverless 和 InfluxDB TSM 实现中的 bucket 同义。
一个数据库可以包含多个表。
- 表:时间序列数据的逻辑分组。在 InfluxDB Clustered 中,表 与 InfluxDB Cloud Serverless 和 InfluxDB TSM 实现中的 measurement 同义。给定表中的所有点应具有相同的标签。一个表包含多个标签和字段。
- 标签:键值对,用于存储每个点的元数据字符串值——例如,标识或区分数据源或上下文的值——例如,主机、位置、站点等。标签值可能为空。
- 字段:键值对,用于存储每个点的数据——例如,温度、压力、股票价格等。字段值可能为空,但任何给定行上至少有一个字段值不为空。
- 时间戳:与数据关联的时间戳。当存储在磁盘上并查询时,所有数据都按时间排序。在 InfluxDB 中,时间戳是纳秒级 Unix 时间戳(UTC)。时间戳永远不为空。
- 表:时间序列数据的逻辑分组。在 InfluxDB Clustered 中,表 与 InfluxDB Cloud Serverless 和 InfluxDB TSM 实现中的 measurement 同义。给定表中的所有点应具有相同的标签。一个表包含多个标签和字段。
Bucket 和 Measurement 发生了什么变化?
如果来自 InfluxDB Cloud Serverless 或由 TSM 存储引擎支持的 InfluxDB,您可能熟悉 bucket 和 measurement 的概念。TSM 或 InfluxDB Cloud Serverless 中的 Bucket 与 InfluxDB Clustered 中的 数据库 同义。TSM 或 InfluxDB Cloud Serverless 中的 Measurement 与 InfluxDB Clustered 中的 表 同义。
主键
在时间序列数据中,数据行的主键通常是时间戳和其他唯一标识每个数据点的属性的组合。在 InfluxDB 中,行的主键是点的时间戳和标签集(点的 标签键 和 标签值 的集合)的组合。行的主键标签集不包括标签值为空的标签。
标签与字段
在为 InfluxDB 设计模式时,一个常见的问题是,“什么应该作为标签,什么应该作为字段?” 以下指南应有助于回答您在设计模式时的这个问题。
- 使用标签来存储关于数据来源或上下文的元数据或识别信息。
- 使用字段来存储测量值。
- 标签值只能是字符串。
- 字段值可以是以下任何数据类型
- 整数
- 无符号整数
- 浮点数
- 字符串函数
- 布尔值
InfluxDB Clustered 索引标签键、字段键和其他元数据以优化性能。它不索引标签值或字段值。
InfluxDB 3 存储引擎支持无限的标签值和序列基数。与由 TSM 存储引擎支持的 InfluxDB 不同,标签值基数不会影响数据库的整体性能。
模式限制
不要对标签和字段使用重复的名称
在同一表中对标签和字段使用唯一的名称。InfluxDB Clustered 将标签和字段存储为表中的唯一列,该表表示磁盘上的表。如果您尝试写入包含具有相同名称的标签或字段的表,则由于列冲突,写入将失败。
每个表的最大列数
一个表有一个 最大列数。每行必须包含一个时间列。因此,一个表可以具有以下内容
- 一个时间列
- 字段和标签列,最多达到配置的最大值
如果您尝试写入一个表并超出列限制,则写入请求将失败,并且 InfluxDB 返回错误。
InfluxData 将 默认最大值 确定为维护系统性能和稳定性的安全限制。超过此阈值可能会导致 宽模式,这可能会对性能和资源使用产生负面影响,具体取决于您的查询、模式的形状和模式中的数据类型。
为性能而设计
您在表中构建模式的方式会影响资源使用和针对该表的查询性能。
以下指南有助于优化查询性能
避免宽模式
宽模式是指具有大量列(标签和字段)的模式。
宽模式可能导致以下问题
为了防止宽模式问题,请限制表中存储的标签和字段的数量。如果您需要存储超过 最大列数,请考虑将您的字段分段到单独的表中。
避免过多标签
在 InfluxDB 中,行的主键是点的时间戳和标签集(点的 标签键 和 标签值 的集合)的组合。包含更多标签的点具有更复杂的主键,如果您使用键的所有部分进行排序,则可能会影响排序性能。
避免稀疏模式
稀疏模式是指在许多行中,列包含空值的模式。
这些通常源于以下原因
稀疏模式要求 InfluxDB 查询引擎评估许多空列,从而增加了存储和查询数据的不必要开销。
有关稀疏模式的示例,请查看下面的非同构模式示例。
使用不同的时间戳写入单个字段
在不同时间使用不同的时间戳报告字段会创建包含空值的不同行——例如
您使用 tagset
报告 fieldA
,然后使用相同的 tagset
报告 field B
,但使用不同的时间戳。结果是两行:一行对于 field A 具有空值,另一行对于 field B 具有空值。
相反,如果您在使用相同的标签集和时间戳的同时在不同时间报告字段,则现有行将被更新。这在摄取时需要稍微更多的资源,但随后在持久化时间或压缩时间得到解决,并避免了稀疏模式。
表模式应是同构的
存储在表中的数据应该是“同构的”,这意味着每行应具有相同的标签和字段键。存储在表中的所有行共享相同的列,但如果一个点不包含列的值,则列值为空。一个充满空值的表具有 “稀疏”模式。
为您的数据使用最佳数据类型
当将数据写入字段时,为您的数据使用最合适的 数据类型——将整数写为整数,将小数写为浮点数,并将布尔值写为布尔值。针对存储整数的字段的查询性能优于针对字符串数据的查询;查询许多长字符串值可能会对性能产生负面影响。
为查询简单性而设计
表、标签键和字段键的命名约定可以简化或复杂化编写数据查询的过程。以下指南有助于确保编写数据查询尽可能简单。
保持表名、标签和字段简单
为每个数据属性使用一个标签或一个字段。如果您的源数据在一个参数中包含多个数据属性,请将每个属性拆分为其自己的标签或字段。
表名、标签键和字段键应简单明了,并准确描述每个包含的内容。保持名称不包含数据。复杂命名约定最常见的原因是您尝试将数据属性“嵌入”到表名、标签键或字段键中。
当每个键和值表示数据的一个属性(而不是多个连接的属性)时,您将减少在查询中使用正则表达式的需求。没有正则表达式,您的查询将更容易编写且性能更高。
不推荐
例如,考虑以下 Line Protocol,它将多个属性(位置、型号和 ID)嵌入到 sensor
标签值中
home,sensor=loc-kitchen.model-A612.id-1726ZA temp=72.1
home,sensor=loc-bath.model-A612.id-2635YB temp=71.8
要查询来自 ID 为 1726ZA
的传感器的数据,您必须使用 SQL 模式匹配或正则表达式来评估 sensor
标签
SELECT * FROM home WHERE sensor LIKE '%id-1726ZA%'
SELECT * FROM home WHERE sensor =~ /id-1726ZA/
SQL 模式匹配和正则表达式都会使查询复杂化,并且性能不如简单的相等表达式。
推荐
更好的方法是将每个传感器属性作为单独的标签写入
home,location=kitchen,sensor_model=A612,sensor_id=1726ZA temp=72.1
home,location=bath,sensor_model=A612,sensor_id=2635YB temp=71.8
要使用此模式查询来自 ID 为 1726ZA
的传感器的数据,您可以使用简单的相等表达式
SELECT * FROM home WHERE sensor_id = '1726ZA'
此查询更易于编写,并且性能优于使用模式匹配或正则表达式。
避免关键字和特殊字符
为了简化查询编写,请避免在表名、标签键和字段键中使用保留关键字或特殊字符。
当使用 SQL 或 InfluxQL 查询具有特殊字符或关键字的表、标签和字段时,您必须将这些键用双引号括起来。
SELECT
"example-field", "tag@1-23"
FROM
"example-table"
WHERE
"tag@1-23" = 'ABC'
此页面是否对您有帮助?
感谢您的反馈!
支持和反馈
感谢您成为我们社区的一份子!我们欢迎并鼓励您对 InfluxDB Clustered 和本文档提供反馈和错误报告。要查找支持,请使用以下资源
拥有年度或支持合同的客户可以联系 InfluxData 支持。