物联网网关设备数据降采样架构
作者:David G. Simmons / 产品, 开发者
2017 年 12 月 14 日
导航至
构建物联网数据部署架构的方式有很多种,对一家企业来说合适的方式对另一家企业来说不一定合适。根据您的物联网项目的大小和复杂性,当然可能有很多组件。一种更通用的架构是部署传感器集线器或物联网网关设备,以从多个传感器节点收集数据,然后将该数据转发到企业的上游数据收集系统。这些网关或集线器设备通常允许 ZWave 设备连接到互联网进行数据上传,或在蓝牙设备与 WiFi 或其他网络连接之间建立桥梁。
此外,大多数这些网关或集线器设备往往是“哑”网关。除了将数据转发到上游收集器之外,它们不做任何事情。但是,如果物联网网关可以成为智能设备呢?如果您可以在将数据发送出去之前在集线器设备上进行本地分析和数据处理呢?那不是很有用吗!
构建网关
今天早上我决定构建(另一个)物联网智能网关设备。我(有点)以前构建过一个,形式是在 ARTIK-520 上运行 InfluxDB。但是 ARTIK-520 并不是最便宜的东西,当您构建物联网设备时,有时更便宜更好。并非总是如此,但是当您构建大量网关时,您宁愿不在它们身上花太多钱。我翻出了几年前买的 Pine-64 盒子,开始工作。为什么选择 Pine-64 而不是 Raspberry Pi?嗯,Pine-64 的成本大约是 1/2。是的,1/2 的成本。它是 15 美元而不是 35 美元,所以就是这样。它具有完全相同的 ARM A53 四核 1.2 GHz 处理器——我的有 2GB 内存,而 RPi 上有 1GB——并且它有一个更强大的 GPU,如果您喜欢那种东西的话。它还配备了内置 WiFi,因此无需加密狗,我获得了 ZWave 可选板,因此我可以与 sub-GHz 物联网设备通信。
将这些类型的设备作为物联网网关运行的优点之一是,您的存储仅受您使用的 microSD 卡大小的限制。我只使用 16GB 卡,但 Pine-64 可以使用高达 256GB 的卡。
在 Pine-64 上启动并运行 TICK Stack 需要什么?毫不奇怪,“Time To Awesome™”真的非常短!一旦您的 Pine-64 盒子启动并运行——我建议使用 Xenial 镜像,因为它是“官方”Pine-64 镜像,并且它是 Ubuntu,所以使用 InfluxDB 非常容易。不要忘记运行
apt-get upgrade
一旦您启动并运行它,请确保您拥有所有最新更新。
接下来,将 Influx 存储库添加到 apt-get
curl -sL https://repos.influxdata.com/influxdb.key | apt-key add -
source /etc/lsb-release
echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | tee -a /etc/apt/sources.list
您可能需要使用 sudo 运行这些命令,但我作弊并首先运行“sudo bash”,然后一切就绪。
接下来,您需要添加一个丢失的软件包——并且是必需的——才能访问 InfluxData 存储库
apt-get install apt-transport-https
然后,这只是一个问题
apt-get install influxdb chronograf telegraf kapacitor
你就准备好出发了!
设备负载测试
我决定最好对这个小设备进行负载测试,看看它的处理能力如何,所以我从 GitHub 下载了“influx-stress”,并针对该设备运行了它。
Using batch size of 10000 line(s)
Spreading writes across 100000 series
Throttling output to ~200000 points/sec
Using 20 concurrent writer(s)
Running until ~18446744073709551615 points sent or until ~2562047h47m16.854775807s has elapsed
哇……每秒 200,000 个点!这应该给我的小 Pine-64 带来一些严重的压力!结果证明它确实如此
正如您所见,它很快就耗尽了 2GB 的内存,并将 CPU 占用率锁定在 100%。但是作为网关设备,在现实生活中不太可能看到这样的负载。我认为,就作为网关的实际使用而言,如果我只从几十到大约一百个传感器收集数据,我将在我的范围内。
本地分析
正如您从上面的仪表板中看到的那样,我可以在 Pine-64 上轻松进行一些本地分析。它具有板载 HDMI 接口和一个完整的 GPU,因此允许本地访问仪表板进行监控非常简单。但正如我之前所说,如果该设备可以做更多事情,那将更有用。在现实世界中,您不太可能在网关设备上收集所有数据并在那里进行所有分析等。那不是网关/集线器的用途。一些本地分析、警报等会很好——尽可能将一些处理移到边缘——但您仍然希望将数据转发到上游。
降采样物联网数据
仅仅使用网关设备转发所有上游数据非常容易,但是如果您正在处理网络连接问题,并且您试图节省资金或带宽,或者两者兼而有之,您将希望在转发数据之前进行一些数据降采样。谢天谢地,这也非常容易做到!可以进行本地分析、处理一些本地警报,并且还可以在将数据传递到上游之前对数据进行降采样的网关设备在物联网中非常有用。而且它也很容易做到!
首先,让我们设置我们的网关设备,使其能够将数据转发到另一个 InfluxDB 实例。有几种方法可以做到这一点,但是由于我们将通过 Kapacitor 进行一些数据降采样,我们将通过 kapacitor.conf 文件来完成。 kapacitor.conf 文件已经有一个 [[influxdb]] 部分,其中包含“localhost”的条目,因此我们只需要为上游实例添加一个新的 [[influxdb]] 部分
[[influxdb]]
enabled = true
name = "mycluster"
default = false
urls = ["http://192.168.1.121:8086"]
username = ""
password = ""
ssl-ca = ""
ssl-cert = ""
ssl-key = ""
insecure-skip-verify = false
timeout = "0s"
disable-subscriptions = false
subscription-protocol = "http"
subscription-mode = "cluster"
kapacitor-hostname = ""
http-port = 0
udp-bind = ""
udp-buffer = 1000
udp-read-buffer = 0
startup-timeout = "5m0s"
subscriptions-sync-interval = "1m0s"
[influxdb.excluded-subscriptions]
_kapacitor = ["autogen"]
这解决了部分问题。现在我们需要实际降采样数据,并将其发送出去。由于我使用的是 Chronograf v1.3.10,我有一个内置的 TICKscript 编辑器,所以我将转到 Chronograf 中的“警报”选项卡,创建一个新的 TICK 脚本,并选择 telegraf.autoget 数据库作为我的源
我实际上还没有在这个设备上收集传感器数据,所以我将使用 CPU 使用率作为我的数据,并且我将在我的 TICKScript 中对其进行降采样。我编写了一个非常基本的 TICKScript 来降采样我的 CPU 数据并将其转发到上游
stream
|from()
.database('telegraf')
.measurement('cpu')
.groupBy(*)
|where(lambda: isPresent("usage_system"))
|window()
.period(1m)
.every(1m)
.align()
|mean('usage_system')
.as('mean_usage_system')
|influxDBOut()
.cluster('mycluster')
.create()
.database('downsample')
.retentionPolicy('autogen')
.measurement('mean_cpu_idle')
.precision('s')
该脚本只是每分钟获取 CPU 测量的“usage_system”字段,计算平均值,然后将该值写入上游到我的上游 InfluxDB 实例。在网关设备上,CPU 数据如下所示
我的上游实例上的降采样数据如下所示
这是相同的数据,只是粒度低得多。最后,我将网关设备上的数据保留策略设置为仅 1 天,这样我就不会填满设备,但我仍然可以在本地维护一些历史记录
我现在有一个物联网网关设备,它可以收集本地传感器数据,向本地用户展示一些分析结果,进行一些本地警报(一旦我设置了一些 Kapacitor 警报),然后降采样本地数据并将其发送到上游到我的企业 InfluxDB 实例,以进行进一步的分析和处理。我可以在网关设备上获得高度精细的毫秒数据,在上游设备上获得粒度较低的 1 分钟数据,这使我仍然可以深入了解本地传感器,而无需支付将所有数据发送到上游的带宽成本。
我还可以使用此方法进一步链接数据存储,方法是将 1 分钟数据存储在区域 InfluxDB 实例上,并将进一步降采样的数据转发到 InfluxDB 实例,在那里我可以汇总来自整个企业的传感器数据。
我可以只是将所有数据向上发送到我的最终企业数据聚合器,但是如果我聚合数万个传感器及其数据,则存储和带宽成本可能会开始超过数据高度粒度的有用性。
结论
我经常重复这句话,我可能不得不将其纹在我的额头上,但我再说一遍:物联网数据只有在及时、准确且可操作时才真正有用。您的数据越旧,其可操作性就越低。它的可操作性越低,您需要的细节就越少。降采样您的数据,并随着时间的推移设置越来越长的数据保留策略,可以确保您的高度即时数据具有高度可操作性和高度准确性的特异性,同时保留数据中的长期趋势以进行长期趋势分析。