解决高序列基数
如果 InfluxDB 的读取和写入速度开始变慢,则高序列基数(过多的序列)可能是导致内存问题的原因。
采取措施了解和解决高序列基数问题。
了解高基数的原因
InfluxDB 为以下数据元素建立索引以加速读取
每个唯一索引的数据元素集构成一个序列键。标签包含高度可变的信息,如唯一 ID、哈希和随机字符串,会导致大量的序列,也称为高序列基数。高序列基数是许多数据库工作负载中高内存使用率的主要驱动因素。
测量序列基数
使用以下方法测量存储桶的序列基数
influxdb.cardinality()
:Flux 函数,返回数据中唯一序列键的数量。SHOW SERIES CARDINALITY
:InfluxQL 命令,返回数据中唯一序列键的数量。
解决高基数问题
要解决高序列基数问题,请完成以下步骤(如果适用于多个存储桶)
检查标签
检查您的标签,确保每个标签不包含大多数条目的唯一值
常见的标签问题
查找以下常见问题,这些问题通常会导致许多唯一的标签值
- 将日志消息写入标签。如果日志消息包含唯一的时间戳、指针值或唯一字符串,则会创建许多唯一的标签值。
- 将时间戳写入标签。通常是客户端代码中的意外操作。
- 随时间增长的唯一标签值 例如,用户 ID 标签可能在小型初创公司中有效,但当公司发展到数十万用户时,可能会开始引起问题。
统计唯一标签值
以下示例 Flux 查询显示了哪些标签对基数贡献最大。查找值比其他标签高几个数量级的标签。
// Count unique values for each tag in a bucket
import "influxdata/influxdb/schema"
cardinalityByTag = (bucket) => schema.tagKeys(bucket: bucket)
|> map(
fn: (r) => ({
tag: r._value,
_value: if contains(set: ["_stop", "_start"], value: r._value) then
0
else
(schema.tagValues(bucket: bucket, tag: r._value)
|> count()
|> findRecord(fn: (key) => true, idx: 0))._value,
}),
)
|> group(columns: ["tag"])
|> sum()
cardinalityByTag(bucket: "example-bucket")
如果您遇到失控的基数,上述查询可能会超时。如果您遇到超时,请一次运行以下查询之一。
生成标签列表
// Generate a list of tags import "influxdata/influxdb/schema" schema.tagKeys(bucket: "example-bucket")
统计每个标签的唯一标签值
// Run the following for each tag to count the number of unique tag values import "influxdata/influxdb/schema" tag = "example-tag-key" schema.tagValues(bucket: "my-bucket", tag: tag) |> count()
这些查询应有助于识别每个存储桶中高基数的来源。要确定哪些特定标签正在增长,请在 24 小时后再次检查基数,看看一个或多个标签是否显着增长。
改进您的模式
为了将来最大限度地减少基数,请设计您的模式以便于轻松高效地查询。查看模式设计的最佳实践。
删除数据以减少高基数
考虑您是否需要导致高基数的数据。如果您不再需要此数据,您可以删除整个存储桶或删除数据范围。
此页面是否对您有帮助?
感谢您的反馈!