0

我们有一个场景,我们想要频繁更改(单个)测量值的标签。我们的目标是创建一个存储预后值的数据库。但它绝不应该丢失数据并跟踪对已写入数据的更改,例如更改或覆盖。

我们目前的计划是有一个额外的字段“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:我会丢失数据

有什么方法可以防止这种情况吗?

4

1 回答 1

3

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 非常出色,因为它能够接受来自各个方向的数据流,而且其简单的协议和无模式存储意味着添加新数据源几乎是微不足道的。但是,如果我的用例有定期更新的旧数据,我会使用关系数据库。

希望消除分歧。

于 2019-12-19T05:18:24.367 回答