多重测量的模式设计

schema design for multiple measurements

我正在使用 collectd 和 influxdb。

collectd v5.5 允许以百分比报告内存和 cpu 值。 但是,所有百分比值都被写入名为 "percent_values" 的测量值中。测量具有标签 type_instance,它具有来自内存(已使用、缓存...)的标签值和来自 cpu(空闲、用户、irq)的标签。

============================================= ========================= 测量:percent_value

标签:type_instance=[缓存,空闲,使用,缓冲,空闲,nice,softirq,窃取,系统,用户...]

字段:值 ================================================ ====================

为什么所有的值都写入一个测量值而不是 2 个单独的测量值?以下是否更有意义或具有更好的性能?

============================================= =========================

测量:mem_percent_value

标签:type_instance=[缓存,免费,使用,缓冲]

字段:值

测量:cpu_percent_value

标签:type_instance=[idle, nice, softirq, steal, system, user...]

字段:值 ================================================ ====================

就具有良好性能的模式设计而言,具有多个标记值的单个测量或仅具有属于该测量的标记值的多个测量更好。我将设计一些新的测量值,我是否也应该将它们与所有标签值一起存储在一个测量值中,还是将它们分开?

tl;dr 对需要索引的事物使用较少的测量值和标签,对其他所有事物使用字段。标签必须是字符串。

我建议先阅读系列基数 https://docs.influxdata.com/influxdb/v1.2/concepts/glossary/#series-cardinality

与 Graphite 施加的要求您进行大量测量的限制不同,Influx 建议支持较少数量的测量。然后,为属性使用标签,这将帮助您编写更高效的查询。关于性能:给定一个固定数量的可索引 "attributes",无论您有很多没有标签的测量,还是有很多标签的少量测量,都没有关系。换句话说,在任何一种情况下,您都应该以相同的基数结束。

这也是一个有用的部分:https://docs.influxdata.com/influxdb/v1.2/concepts/schema_and_data_layout/#discouraged-schema-design

我会给你一个我处理过的关于 JVM 内存的具体例子。

  • 选项 1:多次测量
    • jvm.memory.heap.used [jmxport=1099, ...] 值=1024
  • 选项 2:减少测量
    • jvm.memory [metric_type=堆,jmxport=1099,...] 值=1024

这里是同类例子,只是更全面一点 https://github.com/jmxtrans/jmxtrans/wiki/StatsDTelegrafWriter#schema-design