对 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...
]
这看起来要存储很多信息,但 measurement
和 tags
值基本上是 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()
的默认值。
我有一个测量值要保存在 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...
]
这看起来要存储很多信息,但 measurement
和 tags
值基本上是 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()
的默认值。