对 influxdb、nosql 数据库进行测量

Getting measurement into influxdb, nosql database

我有一个测量值要保存在 influxdb 数据库中。测量本身包括大约。由微控制器生成的 4000 个测量点。测量点采用浮点格式,并以恒定频率定期(每隔几分钟)生成。 我想了解一些 NoSQL 数据库的知识,influxdb 是我在这里的第一次尝试。

问题是:假设它们在 mqtt 消息中(json 格式),如何在 influxdb 中获取这些测量值?插入字符串如何 generated/handled?

{
  "begin_time_of_meas": "2020-11-19T16:02:48+0000",
  "measurement": [
    1.0,
    2.2,
    3.3,
    ...,
    3999.8,
    4000.4
  ],
  "device": "D01"
}

我过去使用过 Node-RED,我知道有一个用于 influx db 的插件,所以我想这是一种方法。但是我非常不确定插入字符串是如何 genereated/handled 测量点数组的。到目前为止,我见过的每个例子都只处理 1 点测量,比如每隔几秒测量一次温度或 cpu 负载。感谢您的帮助。

我已经成功使用了时间精度为毫秒的influxdb插件。不确定如何使其适用于更精确的时间戳,而且我从来不需要这样做。

听起来你每秒到达的点不止几个;将消息组作为数组发送到 influx batch 节点。

在您的情况下,这取决于这 4000 个测量值是什么,以及如何对它们进行分组最有意义。如果变量都测量同一个点,这样的事情可能会起作用。我不知道测量是什么,等等。接受 mqtt 消息并将其转换为这样的消息块的函数可能运行良好(请注意,此函数输出可以替换 join 节点):

[{
    measurement: "microcontroller_data",
    timestamp: new Date("2020-11-19T16:02:48+0000").getTime(),
    tags: {
        device: "D01",
        point:  "0001",
    },
    fields: {
        value: 1.0
    }
},
{
    measurement: "microcontroller_data",
    timestamp: new Date("2020-11-19T16:02:48+0000").getTime(),
    tags: {
        device: "D01",
        point:  "0002",
    },
    fields: {
        value: 2.2
    }
}, 
...etc...
]

这看起来要存储很多信息,但 measurementtags 值基本上是 header 值,不会在每个条目中写入。 fields 值确实被存储了,但是这些被压缩了。描述要存储的数据的 json 比存储实际使用的 on-disk space 大得多。

也可以有多个字段,但我相信这会使数据检索更加棘手:

{
    measurement: "microcontroller_data",
    timestamp: new Date("2020-11-19T16:02:48+0000").getTime(),
    tags: {
        device: "D01",
        point:  "0001",
    },
    fields: {
        value_0001: 1.0,
        value_0002: 2.2,
        ...etc...
    }
}

更易于编码,但会产生一些难看且不灵活的查询。

您可能会有一些比“microcontroller_data”或“0001”、“0002”等更有意义的名称。如果 4000 个信号用于非常不同的测量,则也可能有超过一个有意义的“测量”,例如cpu_parameters、流量、蝴蝶等

将您的 MQTT 消息解析为该形状。如果消息发送one-at-a-time,则发送到join节点;我的设置为在 500 条消息或 1 秒不活动后发送;你会找到合适的。

如果jsonobjects被你处理成一个数组,直接发送到influx batch节点。

influx batch 节点的“高级查询选项”下,我将精度设置为毫秒,因为这是 Date().getTime() 的默认值。