新的桶模式选项可保护您免受不想要的模式更改
作者:Russ Savage / 用例,产品,开发者
2021 年 8 月 26 日
导航至
与传统关系型数据库相比,使用 InfluxDB 的一个最大优点是不需要预先定义模式即可写入数据。这意味着您可以在几秒钟内创建一个桶并写入数据,这对于更关注他们正在构建的应用程序而不是存储数据机制的程序员来说非常强大。
随着应用程序的增长,以及更多用户添加自己的数据,确保模式不会被垃圾数据弄乱可能会变得复杂。一些客户实际上开发了一些保护服务来确保只有正确的点能够到达他们的生产数据库。
为了帮助解决用户的问题,我们引入了一个新选项,可以显式定义可以写入桶的数据模式。该模式针对每个写入桶的测量值,允许它随着新测量值的添加而增长。
在这篇文章中,我将通过使用我最喜欢的数据集之一,美国地质调查局地震数据,来向您介绍新显式模式功能的一些概念。如果您感到不耐烦,可以直接跳转到 我们的文档 来了解所有细节。
为了跟随本篇文章,您需要一个免费的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
的新存储桶。
将度量模式添加到您的存储桶中
现在存储桶已创建,我们可以开始添加我们想要在该存储桶中存储的每个度量的模式。任何与度量模式不匹配的数据都将被拒绝。
度量模式是CSV、JSON或NDJSON格式的文本文件,它告诉InfluxDB在度量中允许哪些标签、字段和类型。一些示例文件在文档中。对于这个USGS数据集,您可以在我们的样本数据仓库中找到模式文件。这是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"}
这里的格式非常简单。三种类型是timestamp
、field
和tag
,您需要添加数据类型的地方只有字段,因为标签始终是字符串。
为了创建这些模式文件,我发现将数据导入具有隐式模式类型的临时存储桶非常有用,然后使用Flux中的模式包检查数据中的标签(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)
您可以在数据探索器的原始数据视图中看到列类型,就在分组信息下方。
一旦您的模式文件准备就绪,您可以使用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数据度量,一旦它们全部添加,您可以使用列表命令来验证它们。如果需要完整的输出,您可以在命令末尾添加--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 工作流的一部分进行管理。
如果您对显式方案桶有任何问题或评论,请加入我们的社区 Slack 工作区,或者您可以直接在GitHub中提交问题。