首页 > 解决方案 > 将测量数据导入 influxdb、nosql 数据库

问题描述

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

问题是:假设它们在 mqtt 消息(json 格式)中,我如何在 influxdb 中获得这些测量值?插入字符串是如何生成/处理的?

{
  "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 的插件,所以我想这是一种方法。但我非常不确定如何为一组测量点生成/处理插入字符串。到目前为止,我看到的每个示例仅处理 1 点测量值,例如每隔几秒进行一次温度测量或 CPU 负载。谢谢你的帮助。

标签: nosqlmqttinfluxdbnode-red

解决方案


我已经成功使用了时间精度为毫秒的 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基本上是标题值,不会随每个条目一起写入。这些fields值确实被存储了,但它们被压缩了。描述要存储的数据的 json 比存储实际使用的磁盘空间大得多。

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

{
    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 消息解析为该形状。如果消息是一次发送一个,则发送到一个join节点;我的设置为在 500 条消息或 1 秒不活动后发送;你会找到合适的。

如果您的处理将 json 对象分组到一个数组中,则直接发送到influx batch节点。

influx batch节点中,在“高级查询选项”下,我将精度设置为 ms,因为这是从Date().getTime().


推荐阅读