新的存储桶模式选项可以保护您免受意外的模式更改

导航至

与传统的关联数据库相比,开始使用 InfluxDB 的最佳优势之一是,您无需预先定义模式即可写入数据。这意味着您可以在几秒钟内创建一个存储桶并写入数据,这对于更关心他们正在构建的应用程序而不是存储数据的机制的开发者来说非常强大。

随着您的应用程序的增长,以及更多用户添加他们自己的数据,确保模式不会与垃圾数据混淆可能会变得棘手。一些客户实际上最终开发某种保护服务,以确保只有正确的点到达他们的生产数据库。

为了帮助我们的用户解决这个问题,我们引入了一个新选项,可以显式定义可以写入存储桶的数据模式。该模式特定于写入存储桶的每个测量,这允许它随着新测量的添加而增长。

在这篇文章中,我将带您了解新的显式模式功能的一些概念,使用我最喜欢的数据集之一,USGS 地震数据。如果您感到迫不及待,请随时直接跳转到 我们的文档 以了解所有详细信息。

要跟进这篇文章,您需要一个 免费的 InfluxDB Cloud 账户 以及我们 下载 页面上提供的最新 InfluxDB Cloud 命令行工具 (CLI)。您可以通过按照 此处的说明 快速设置您的 CLI 以与云端配合使用 — 只需确保 CLI 的版本为 2.1 或更高版本。您可以使用 explicit 进行检查。

创建具有显式模式的存储桶

为了使用显式存储桶模式,您需要确保创建一个新存储桶,并将模式类型设置为 explicit (新存储桶的默认设置是允许任何模式,即隐式)。您可以使用 influx 命令行工具来完成此操作。

influx bucket create \
--name usgs \
--description "Only USGS data allowed in here" \
--retention 7d \
--schema-type explicit

ID			Name			Retention	Shard group duration	Organization ID		Schema Type
6f5781a53eed10f5	usgs	168h0m0s	n/a			03921cbebef90000	explicit

当您通过浏览器登录到您的 InfluxDB Cloud 账户时,您可以看到使用 Explicit Schema Type 创建的新存储桶。

InfluxDB Cloud - creating new bucket

向您的存储桶添加测量模式

现在存储桶已创建,我们可以开始为我们想要存储在该存储桶中的每个测量添加模式。任何与测量模式之一不匹配的数据都将被存储桶拒绝。

测量模式只是 CSV、JSON 或 NDJSON 格式的文本文件,这些文件告诉 InfluxDB 在测量中允许哪些标签、字段和类型。 文档 中提供了一些示例文件。对于此 USGS 数据集,您可以在 我们的示例数据仓库 中找到 earthquake 测量的模式文件。以下是 earthquake 测量的 NDJSON 格式的模式文件。

{"name": "time", "type": "timestamp"}
{"name": "alert", "type": "field", "dataType": "string"}
{"name": "cdi", "type": "field", "dataType": "float"}
{"name": "depth", "type": "field", "dataType": "float"}
{"name": "detail", "type": "field", "dataType": "string"}
{"name": "dmin", "type": "field", "dataType": "float"}
{"name": "felt", "type": "field", "dataType": "integer"}
{"name": "gap", "type": "field", "dataType": "float"}
{"name": "ids", "type": "field", "dataType": "string"}
{"name": "lat", "type": "field", "dataType": "float"}
{"name": "lon", "type": "field", "dataType": "float"}
{"name": "mag", "type": "field", "dataType": "float"}
{"name": "mmi", "type": "field", "dataType": "float"}
{"name": "nst", "type": "field", "dataType": "integer"}
{"name": "place", "type": "field", "dataType": "string"}
{"name": "rms", "type": "field", "dataType": "float"}
{"name": "sig", "type": "field", "dataType": "integer"}
{"name": "sources", "type": "field", "dataType": "string"}
{"name": "status", "type": "field", "dataType": "string"}
{"name": "tsunami", "type": "field", "dataType": "integer"}
{"name": "types", "type": "field", "dataType": "string"}
{"name": "url", "type": "field", "dataType": "string"}
{"name": "code", "type": "tag"}
{"name": "id", "type": "tag"}
{"name": "magType", "type": "tag"}
{"name": "net", "type": "tag"}
{"name": "title", "type": "tag"}

这里的格式非常简单明了。三种类型是 timestampfieldtag,您唯一需要添加数据类型的是字段,因为标签始终是字符串。

为了创建这些模式文件,我发现将数据导入到具有隐式模式类型的临时存储桶中,然后使用 Flux 中的 schema 包 来检查数据中的标签 (schema.measurementTagKeys) 和字段键 (schema.measurementFieldKeys) 非常有用。

如果您不确定字段的数据类型,您也可以运行一个简单的 Flux 查询来获取该信息。

import "influxdata/influxdb/schema"
from(bucket: "temp_bucket")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._measurement == "earthquake")
  |> schema.fieldsAsCols()
  |> group()
  |> limit(n: 1)

Learn how the new bucket schema option can protect you from unwanted schema changes

您可以在数据浏览器的原始数据视图中看到列类型,就在分组信息下方。

一旦您准备好模式文件,您可以使用 InfluxDB Cloud CLI 工具将该测量模式添加到存储桶。

influx bucket-schema create --bucket usgs --name "earthquake" --columns-file ./schemas/earthquake-schema.ndjson --columns-format ndjson
ID			Measurement Name	Bucket ID
0808dd6fa216b000	earthquake		923f47af748a6453

有关命令的完整文档,您可以使用 -h 选项或查看 我们的文档。您可以重复此过程,将其他测量模式添加到同一存储桶。在此示例中,USGS 数据有五个测量,一旦全部添加完毕,您可以使用 list 命令验证它们。如果您需要完整输出,您也可以在命令末尾添加 --json 标志,这对于自动化也很有用。

influx bucket-schema list -n usgs
ID			Measurement Name	Bucket ID
0808dd50522a1000	chemical explosion	923f47af748a6453
0808dd6fa216b000	earthquake		923f47af748a6453
0808dd84f0551000	explosion		923f47af748a6453
0808dd96d876c000	ice quake		923f47af748a6453
0808ddaf8156a000	quarry blast		923f47af748a6453

将数据写入显式模式存储桶

一旦模式设置完成并准备就绪,您可以首先尝试将一些无效的行协议写入存储桶来测试是否正常工作,以验证它是否被拒绝。

influx write --bucket usgs "m,f=f1 v=1"
Error: failed to write data: 400 Bad Request: unable to parse 'm,f=f1 v=1': schema: measurement "m" not permitted by schema

这验证了不正确的数据将被存储桶拒绝,但我们也写入一些数据以确保我们的模式是正确的。然后我们可以查询以验证数据是否已写入。

influx write -b usgs -u https://raw.githubusercontent.com/influxdata/influxdb2-sample-data/master/usgs-earthquake-data/all_week.lp

influx query 'from(bucket: "usgs") |> range(start: -1d) |> count() |> group() |> sum()'
Result: _result
Table: keys: []
                _value:int
--------------------------
                      5076

您可能会得到不同数量的结果,但任何大于零的结果都表示工作正常。

当您开始向同一存储桶写入更多数据时,您可以添加其他测量模式或更新现有模式,前提是您仅添加标签或字段。您无法以使其现有数据在存储桶中失效的方式编辑测量模式。

结论

使用显式存储桶模式可以帮助保护您的存储桶免受意外写入。一旦您完成创建模式文件的过程,您可以使用最新的 influx CLI 工具快速轻松地管理存储桶模式。这些显式模式也与 InfluxDB 模板 兼容,因此您也可以将这些作为 GitOps 工作流程的一部分进行管理。

如果您对显式模式存储桶有任何问题或意见,请加入我们的 Community Slack 工作区,或者您可以直接在 GitHub 中提交 issue。