第一部分:如何在 Google Cloud Platform 上使用 TICK Stack 创建 IoT 项目
作者:Todd Persen / 产品, 用例
2016 年 2 月 23 日
导航至
InfluxData 是一个用于收集、存储、可视化和管理时间序列数据的平台。我对这个平台的特殊兴趣源于几年前我在 RFID 领域做的大量工作。时间序列数据库是创建 “追踪和追溯” 应用程序的关键。
从那时起,随着 Raspberry Pi、Arduino、Tessel 等硬件和低成本传感器的出现,开始收集数据变得非常简单。在大多数传感器系统中,时间序列数据库再次非常有用,因为通常您最终会收集一系列随时间推移的传感器数据。例如,每 5 分钟捕获特定位置的温度。如果您愿意,可以用您喜欢的传感器数据替换温度,您就会明白我的意思。虽然我对时间序列数据的需求可能仅限于物联网和传感器,但时间序列数据库的应用范围相当广泛。查看 InfluxData 发布的用例。
您始终可以选择构建自己的解决方案来捕获这些数据。除了捕获数据外,您还需要仪表板、根据数据值发出警报等等。查看为处理所有这些及更多内容而创建的平台是务实的。
在高层次上,您希望从此类平台获得一些高级功能需求,例如
- 存储时间序列数据,数据模式灵活,允许将来添加更多字段或标签。
- 收集或集成机制,用于将来自各种来源的时间序列数据转换/推送到此单一标准化数据库中。
- 标准仪表板,允许在产品本身中进行查询/可视化。对于大多数项目,这已经足够了,除非您有自定义需求。
- 能够定义数据警报并通知用户/应用程序。
肯定会有更多要求,但以上是从任何此类平台都期望获得的一般列表。除了上述内容外,还可能存在诸如安全性、日志等横向关注点,这也将成为一项要求。
InfluxData 引起了我的兴趣,因为它具有解决上述所有要点的元素(模块/应用程序)。它具有以下模块,名为 TICK,我正在复制其官方文档中的图表
本教程系列将首先介绍 InfluxDB,并在 Google Cloud Platform 上启动并运行它。一旦我们将其就位,我们将使用 Arduino/Python 构建一个 IoT 项目,并将该数据馈送到 InfluxDB 中。然后,我们可以通过 TICK 堆栈中的其他产品查看一些可视化或警报。
第 1 部分:在 Google Cloud Platform 上启动并运行 InfluxDB
Google Cloud Platform - 创建项目
第一步是创建一个项目。请按照以下步骤操作
- 访问 Google Developers Console 并使用您的帐户登录。
- 单击“创建项目”。这将弹出“新建项目”对话框。输入项目的名称,并确保您已选择正确的结算帐户。示例如下截图所示
- 单击“创建”开始创建项目的过程。
请耐心等待项目创建和初始化。
Google Compute Engine - 预配虚拟机
我们需要创建一个实例,我们可以在其上运行 InfluxDB。这意味着我们需要从 Compute Engine 服务预配一个 VM(基于 Linux)。
请按照以下步骤操作
- 单击计算 --> Compute Engine --> 虚拟机实例。
- 单击新建实例。
- 这将弹出一个表单,用于输入有关新实例的详细信息。请注意以下字段
-
- 为您的实例命名。例如,influxdb-1
- 选择离您最近的区域。例如,us-central1-a
- 选择机器类型。我选择了最低选项 f1-micro
- 将启动磁盘映像保留为选定的默认映像,即Debian
- 将所有其他选项保留为默认值。
- 单击创建按钮。
安装 InfluxDB 并启动 InfluxDB 服务器
官方文档在 在各种操作系统上安装 InfluxDB 方面做得很好,提供了说明。按照给定的步骤在 Debian 上安装 InfluxDB。
要在我们的 VM 实例上设置 InfluxDB,我们需要 SSH 进入该实例。请按照以下步骤操作
- 从顶部的滑动菜单中,转到计算 --> Compute Engine --> 虚拟机实例
- 您将看到列出的 VM 实例。
- 查找行尾的 SSH 按钮。
- 单击该按钮并等待 SSH 会话初始化并为您设置。如果一切顺利,您应该会看到另一个浏览器窗口,将您传输到 VM 实例,如下所示
接下来是安装 InfluxDB,我从官方文档中复制了以下步骤
首先,设置包管理器
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -source /etc/os-release
test $VERSION_ID = "7" && echo "deb https://repos.influxdata.com/debian wheezy stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
test $VERSION_ID = "8" && echo "deb https://repos.influxdata.com/debian jessie stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
然后安装并启动 InfluxDB 服务
sudo apt-get update && sudo apt-get install influxdb
sudo service influxdb start
验证 InfluxDB 服务器安装
您现在可以启动客户端 shell (influx
) 以验证它是否能够连接到 influxd
守护程序。客户端 shell 类似于您可能在 MySQL 等数据库中使用过的各种其他 shell,这些 shell 让您可以与数据库服务器交互。
只需在终端输入 influx
,您应该会看到如下输出
您应该位于 influx shell 提示符 (>
) 处,在这里您现在可以开始与 InfluxDB 守护程序交互。您可以通过 shell 执行的一些常见操作包括创建数据库、插入数据、查询数据等等。
请注意,您在 shell 中提供的命令通过 API 调用执行到在端口 8086 上的 localhost 上运行的 InfluxDB 守护程序。
创建数据库并测试一些查询
现在让我们在 InfluxDB 中创建我们的温度数据库,该数据库将用于捕获来自多个气象站的温度传感器值。
我们现在的模型非常简单。我在孟买市的各个物理位置安装了多个气象站(Arduino + 温度传感器)。每个位置都由唯一的名称标识,例如 S1、S2、S3 等等。每个站点每隔几秒捕获一次温度值,这就是我们将在 InfluxDB 中捕获的内容。
InfluxDB 提供了出色的文档来帮助您入门。您可以参考文档以了解有关我将在接下来的几节中使用的命令的更多详细信息。但是,这些命令非常直观,您很容易理解。(我还建议阅读文档以了解 InfluxDB 中的关键概念。)
那么,让我们继续创建数据库。我们将数据库命名为 temperature_db。
所有命令都从我们之前启动的 InfluxDB Shell (>
) 发出。
> create database temperature_db
>
这将创建一个名为 temperature_db 的数据库,我们可以通过发出如下所示的 show databases 命令来验证这一点
> show databases
name: databases
---------------
name
_internal
temperature_db
>
与任何其他数据库系统一样,可能存在由单个 InfluxDB 服务器管理和管理的多个数据库,因此我们需要指定我们要使用的数据库。在我们的例子中,我们正在使用 temperature_db,因此我们通过 USE 语句选择它。
> USE temperature_db
Using temperature_db
现在,我们都已准备好将数据插入到我们选择的集合(measurement)中。有多种方法可以将信息导入 InfluxDB,例如我们现在使用的 shell、代理和 API。我们将在本系列的后面部分介绍其他方法,但现在,我们将使用我们已登录的当前 shell。
由于我们在这里测量的是温度,我们可以将我们的测量称为“temperature”。除了每次测量外,我们还可以指定
- 一个或多个键值。这些是要测量的值,在我们的例子中,它是以摄氏度为单位的实际温度值。因此,我们将有一个键值对,其中键的名称为 value,其值将是以摄氏度为单位的温度。
- 零个或多个标签。例如,我们将使用一个名为 station 的标签。我们的站点将具有值 S1、S2、S3 等等,具体取决于哪个站点正在发送数据。
要插入到 InfluxDB 中的数据使用行格式,其格式如下所示
<measurement>[,<tag-key>=<tag-value>..] <field-key>=<field-value>[,fields..] [unix-nano-timestamp]
例如,来自我们的站点 (S1) 的测量值(temperature)(温度值为 29.8)如下所示
temperature,Station=S1 value=29.8
让我们继续插入一些示例记录。在 shell 中触发 INSERT 语句,如下所示
> INSERT temperature,Station=S1 value=29.8
> INSERT temperature,Station=S1 value=29.9
> INSERT temperature,Station=S1 value=29.8
> INSERT temperature,Station=S2 value=29.9
请注意,我们没有提供时间戳,这是一个重要的字段。这是 Unix 时间戳,如果我们不提供它,InfluxDB 将在写入记录时为我们填充它。目前,未提供此项,但如果您在离线模式下工作并希望捕获本地时间戳,则应提供该时间戳,而不是让 InfluxDB 设置该值。请注意,时间戳可以精确到纳秒范围。
我们现在可以查询记录通过 SELECT 语句。我正在展示一些示例 SELECT 语句,但 InfluxDB 中提供了以多种独特方式进行查询的可能性。
> SELECT * FROM temperature
name: temperature
-----------------
time Station value
1451986005629953280 S1 29.8
1451986012453450651 S1 29.9
1451986019773373391 S1 29.8
1451986026269925241 S2 29.9
>
尝试使用 WHERE 子句进行一些查询。如果您以前使用过任何类似 SQL 的数据库,这应该很简单。
您可以通过 exit 命令退出 InfluxDB shell。
设置 Google Compute Engine 防火墙规则
InfluxDB 配备了一个方便的管理 Web 应用程序,您可以使用它来管理数据库、插入记录、执行查询等等。我们本可以在上一节中使用它,但我相信了解 shell 也很重要。
另一个原因是演示我们仍然需要在 Google Compute Engine 上完成一些工作,以便我们公开正确的端口,然后我们可以通过这些端口从外部任何地方访问 InfluxDB 管理 Web 应用程序。
首先要注意的是配置文件 influxdb.conf。此文件位于 /etc/influxdb/influxdb.conf 中
我们特别感兴趣的是从外部访问两项服务
- InfluxDB 管理 Web 应用程序:如上所述,我们希望从任何地方访问 Web 应用程序。
- InfluxDB API:这很重要,这样我们就可以编写外部程序,这些程序可以直接从 Google Compute Engine 外部与 API 对话。
如果您浏览 influxdb.conf 文件,您会发现它使用了 2 个端口,即 8083(InfluxDB 管理 Web 应用程序)和 8086 (API)。
因此,我们需要做的是为您的 Google Compute Engine 实例启用防火墙规则,以允许来自外部的流量访问这些端口。总之,我们需要在 Compute Engine 实例网络上启用这些端口,我们通过添加如下所示的防火墙规则来实现这一点
- 转到您的 InfluxDB 项目的 Google Developers Console。
- 从顶部的滑动菜单中,单击网络 --> 防火墙规则。
- 单击创建防火墙规则。
- 这将弹出一个表单,用于创建防火墙规则向导。查看下面给出的预期值
- 请注意,您可以将防火墙规则命名为任何名称,但请确保源 IP 范围(即应该从何处访问)为任何人开放。要允许流量的端口为 8083 和 8086。将网络保留为默认值。
- 单击创建按钮以创建规则。
这将允许从外部流量访问端口 8083 和 8086。
从外部访问管理界面
我们现在可以从 Google Compute Engine 网络外部的任何机器访问管理界面。
您可以在以下位置访问管理界面
http://<public-ip-influxdb-instance>:8083
要查找分配给运行 InfluxDB 的 Google Compute Engine 实例的公共 IP 地址,请执行以下操作
- 从 Google Developers Console 中,转到顶部的滑动菜单,计算?Compute Engine?虚拟机实例。
- 在虚拟机实例列表中,找到您运行 InfluxDB 的虚拟机实例。您会发现其中一列是外部 IP。这是您的 Compute Engine 实例的公共 IP 地址。
使用该地址访问管理界面,地址为
http://<public-ip-influxdb-instance>:8083
您应该会看到如下所示的管理界面
单击右上角名为数据库的下拉列表,您应该会看到我们创建的 temperature_db 数据库,如下所示
选择 temperature_db 数据库并触发查询以选择所有记录,如下所示
身份验证和授权
我们目前尚未为我们的 InfluxDB 实例设置任何身份验证/授权。这当然是不推荐的,但为了本教程的目的,我想使其保持简单。但是,请注意,您可以设置用户及其在 InfluxDB 中被授权执行的操作。用户也可以根据对特定数据库的访问控制拥有角色。这些步骤很简单,可以在文档中找到。