TL;DR InfluxDB技术提示:使用Flux从边缘到云的物联网数据

导航到


当涉及到写入InfluxDB数据时,您有很多选择。您可以

  • 将数据写入边缘或雾设备上的开源实例
  • 直接从您的物联网设备将数据写入InfluxDB Cloud
  • 将数据写入边缘设备上的InfluxDB开源实例,并将数据推送到InfluxDB Cloud

最后一点是维护和管理您的物联网设备舰队最强大和最灵活的方式。这种架构为您提供几个优点,包括

  • 执行任务,在将数据发送到InfluxDB Cloud之前准备和清理您的数据。这不仅帮助您创建一个有组织的数据处理流程,还可以确保您的数据在物联网设备中得到标准化
  • 仅发送选择的数据到InfluxDB Cloud的灵活性,例如在OSS实例中标记的异常
  • 隔离任务工作负载并将其靠近数据源的选择
  • 在您的边缘设备、InfluxDB Cloud实例和最终客户之间增加一层安全优势

最后子弹的架构图。传感器将数据写入边缘的InfluxDB OSS实例,该实例随后将数据写入InfluxDB Cloud。将数据写入边缘到InfluxDB Cloud

使用to()函数将OSS数据合并到InfluxDB Cloud

实现此架构的一种方法是通过使用to()函数。to()函数现在支持将数据从OSS v2.1实例写入InfluxDB Cloud实例的选项。

Using the to() function in Flux - an example

使用to()函数将数据从OSS实例写入InfluxDB Cloud的示例

在上述仪表板的右侧,用户正在查询OSS实例。在右侧,InfluxDB Cloud实例显示使用to()函数将数据写入InfluxDB Cloud后,OSS实例中Flux脚本的查询结果。

使用to()函数从InfluxDB Cloud写入数据

  1. 查询您的数据。
from(bucket: "RoomSensors")
|> range(start: -10m)
|> filter(fn: (r) => r["_measurement"] == "temperature")
|> filter(fn: (r) => r["_field"] == "temperature")
|> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  1. 指定目标主机URL、orgID、token和bucket ID。
|> to(host: https://us-west-2-1.aws.cloud2.influxdata.com, 
        orgID:   04xxx00,
        token: 0xxx==, 
        bucketID: 43xxx00)

您首先需要一个InfluxDB Cloud账户来尝试此操作。免费层账户也完全可以使用。您可以在这里轻松注册账户。注册后,您需要

to()函数的限制和替代方案

to()函数提供了一种简单的方法,可以将边缘设备的数据写入云。然而,它也有一些限制

  • 通过HTTP发送
  • 没有内置的失败处理功能
  • 没有内置的批量、重试或并行化功能

如果您满足以下条件,则应仅使用to()函数将OSS数据合并到云中

  • 您打算在将数据写入云之前先下采样数据,以限制请求的大小。
  • 您拥有少量设备或以这种方式写入相对较少的数据。您不能使用to()函数处理大型工作负载,因为数据量可能造成网络故障。此外,也没有内置的失败处理功能。
  • 您不是尝试通过微批处理和生成非常高的请求次数来克服大量数据的写入。

虽然to()函数有一些限制,但还有另一种将OSS到InfluxDB Cloud的IoT数据写入的选项。如果您想处理大型工作负载,可以使用mqtt.to()函数首先将数据写入MQTT代理。

下采样任务中对to()的合理使用

现在我们已经了解了to()函数的限制,让我们强调一个它可能成功的例子。对于这个例子,我们将假设我们想使用任务按计划下采样和写入数据。

option task = {
    name: "downsample and consolidate task",
    every: 1d,
    offset: 10m,
}
import "http"
import "influxdata/influxdb/secrets"

myToken = "Token ${secrets.get(key: "cloud-token")}"
myUrl= "https://us-west-2-1.aws.cloud2.influxdata.com"
myOrgID = "Token ${secrets.get(key: "cloud-org")}"
myBucketID = "Token ${secrets.get(key: "cloud-bucket")}"

from(bucket: "sensorData")
|> range(start: -task.every)
|> filter(fn: (r) =>
(r["_measurement"] == "sensors"))
|> mean()
|> to(host: myurl, 
        orgID:   myOrgID,
        token: myToken, 
        bucketID: myBucketID)

此任务在将数据写入InfluxDB Cloud之前,将所有来自一个测量的数据聚合到一个日均值中。

进一步阅读

虽然本文旨在提供to()函数的全面概述,但以下资源可能也会引起您的兴趣

  1. 如何将OSS数据汇总到云账户:本文介绍了如何使用http.to()函数而不是to()函数将多个OSS实例的数据共享到InfluxDB Cloud。这篇博客基本上是你正在阅读的博客的前奏。
  2. 开始使用InfluxDB任务:本文档描述了如果您之前从未创建过任务,如何开始使用InfluxDB任务。
  3. InfluxDB技术技巧——使用任务和检查进行监控(TL;DR):本文介绍了如何通过UI创建任务以及检查(一种特殊类型的任务)。
  4. 编写任务并设置InfluxDB Cloud警报:本教程演示了对于那些不喜欢UI的人来说,如何使用VS code的Flux插件创建任务。
  5. 使用Flux VS Code扩展进行物联网应用开发。本文强调了Flux插件的一些新功能,这些功能允许您轻松地将Flux查询转换为任务。
  6. 使用InfluxDB通过降采样趋势聚合值:本教程强调了您可以使用任务执行各种聚合。

InfluxDB中to()函数的最终思考

我希望这篇InfluxDB技术技巧文章能够激发您利用to()函数将边缘设备的数据汇总到InfluxDB Cloud的灵感。如果您使用Flux并需要帮助,请在我们社区网站Slack频道中提问。如果您在InfluxDB之上开发酷炫的物联网应用程序,我们非常乐意听到您的消息,请确保分享您的经历!此外,请分享您的想法、关注点或问题在评论部分。我们非常希望得到您的反馈并帮助您解决遇到的问题!