influxdb - influxDB 中的“事务安全”
问题描述
我们有一个场景,我们想要频繁更改(单个)测量值的标签。我们的目标是创建一个存储预后值的数据库。但它绝不应该丢失数据并跟踪对已写入数据的更改,例如更改或覆盖。
我们目前的计划是有一个额外的字段“write_ts”,它指示测量值在哪个时间点被插入或更改,以及一个标签“版本”,每次更改都会更新。此外,版本“0”应始终包含最新值。
name: temperature
-----------------
time write_ts (val) current_mA (val) version (tag) machine (tag)
2015-10-21T19:28:08Z 1445506564 25 0 injection_molding_1
所以让我们假设我有这个示例值的更新预测值。
所以,我这样做:
SELECT curr_measurement
INSERT curr_measurement with new tag (version = 1)
DROP curr_mesurement
//then
INSERT new_measurement with version = 0
现在我的问题:
如果我出于任何原因在 SELECT、INSERT、DROP 之间失去了连接:
我会得到双记录。
(或者如果我执行 SELECT、DROP、INSERT:我会丢失数据)
有什么方法可以防止这种情况吗?
解决方案
InfluxDB 中不存在事务
InfluxDB 是时间序列数据库,而不是关系数据库。它的主要用例不是用户编辑旧数据的用例。
在支持事务的关系数据库中,您正在保护自己免受UPDATE
类似操作的侵害。数据进来,现有数据发生变化,您需要可靠地读取这些更新。
时间序列数据库的主要用例是大量原始数据进入,然后进行一些过滤或转换为其他测量或数据库。想象一个单向数据流。在这种情况下,不需要太多事务,因为旧数据没有得到太多更新。
如何使用 InfluxDB
在像您这样的情况下,根据实时数据计算附加数据,通常将这些新数据放在自己的测量中,而不是作为“实时数据”测量中的新字段。
至于版本跟踪和可靠地获取更新:
1)这个数字能告诉你这个数字没有version
告诉你什么吗?write_ts
如果它只是write_ts
. 如果version
只是增加,它可能会复制由 给出的信息write_ts
,减去知道何时进行更改的有用性。如果version
预计会不时减少,那么保留它是有意义的。
2)同样,如果您保留旧记录:确实write_ts
告诉您time
价值没有的任何事情?
3) 记录。您是否需要覆盖(更新)值?write_ts
或者你可以通过添加新行,增加或 version
酌情获得你需要的东西。后者是一种更“InfluxDB-ish”的方法。
4) 读数值。您可以读取所有值,因为它们会随着更新而变化。如果客户端应用程序只需要知道正在更新的内容的最新值(以及更新的时间),则查询将变为:
SELECT LAST(write_ts), current_mA, machine FROM temperature
您还可以尝试将机器值分组在一起:
SELECT LAST(*) FROM temperature GROUP BY machine
那么会发生什么而不是交易呢?
在 InfluxDB 中,插入具有相同标签键和时间戳的点会覆盖具有相同字段键的任何现有数据,并添加新的字段键。因此,当写入重复条目时,最后一个写入 "wins"。
因此,与传统的SELECT, UPDATE
方法不同,它更像是SELECT A
,然后计算A
,并将结果放入 B,可能带有新的时间戳INSERT B
。
就个人而言,我发现 InfluxDB 非常出色,因为它能够接受来自各个方向的数据流,而且其简单的协议和无模式存储意味着添加新数据源几乎是微不足道的。但是,如果我的用例有定期更新的旧数据,我会使用关系数据库。
希望消除分歧。
推荐阅读
- algorithm - 为什么邻接表中的操作是 O(|E|/|V|)$?
- three.js - 如何选择一个对象并将相机移动到另一个位置?
- node.js - 如何在 nodejs 中设置 redis 缓存并正确使用?
- crystal-lang - 标准输入准备好了吗?(水晶朗)
- sql - 我的问题是关于 SQL,在 MS Access 的子查询中使用 TOP 函数
- assembly - 我的代码行中的“hello world”有什么问题?
- javascript - 在 javascript (lodash) 中合并部分重复的数组
- javascript - How to import a variable from a JS file in another JS file that uses Vue CDN? - Uncaught SyntaxError: Unexpected identifier
- javascript - 查找屏幕数量
- php - 将 Web 根目录指向 IIS 中的特定文件