"Transactional safety" influxDB
"Transactional safety" in influxDB
我们有一个场景,我们想要频繁更改(单个)测量值的标签。
我们的目标是创建一个存储预测值的数据库。但它不应该丢失数据并跟踪对已写入数据的更改,例如更改或覆盖。
我们目前的计划是增加一个字段“write_ts”,它指示插入或更改测量值的时间点,以及一个随每次更改而更新的标签“version”。
此外,版本“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,删除,插入:我丢失数据)
有什么方法可以避免吗?
InfluxDB 中不存在事务
InfluxDB 是一个时序数据库,不是关系数据库。它的主要用例不是用户编辑旧数据的用例。
在支持事务的关系数据库中,您正在保护自己免受 UPDATE
和类似操作的侵害。数据进来,现有数据发生变化,您需要可靠地读取这些更新。
时间序列数据库的主要用例是输入大量原始数据,然后进行一些过滤或转换为其他测量或数据库。想象一个单向数据流。在这种情况下,对事务的需求不大,因为旧数据更新不多。
如何使用 InfluxDB
在像您这样的情况下,根据实时数据计算额外的数据,通常将这些新数据放在自己的测量中,而不是作为 "live data" 测量中的新字段。
关于版本跟踪和可靠地获取更新:
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中,可能带有新的时间戳[=26] =].
就我个人而言,我发现 InfluxDB 非常出色,因为它能够接受来自各个方向的数据流,并且其简单的协议和无模式存储意味着添加新数据源几乎是微不足道的。但是如果我的用例有定期更新的旧数据,我会使用关系数据库。
希望消除分歧。
我们有一个场景,我们想要频繁更改(单个)测量值的标签。 我们的目标是创建一个存储预测值的数据库。但它不应该丢失数据并跟踪对已写入数据的更改,例如更改或覆盖。
我们目前的计划是增加一个字段“write_ts”,它指示插入或更改测量值的时间点,以及一个随每次更改而更新的标签“version”。 此外,版本“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,删除,插入:我丢失数据)
有什么方法可以避免吗?
InfluxDB 中不存在事务
InfluxDB 是一个时序数据库,不是关系数据库。它的主要用例不是用户编辑旧数据的用例。
在支持事务的关系数据库中,您正在保护自己免受 UPDATE
和类似操作的侵害。数据进来,现有数据发生变化,您需要可靠地读取这些更新。
时间序列数据库的主要用例是输入大量原始数据,然后进行一些过滤或转换为其他测量或数据库。想象一个单向数据流。在这种情况下,对事务的需求不大,因为旧数据更新不多。
如何使用 InfluxDB
在像您这样的情况下,根据实时数据计算额外的数据,通常将这些新数据放在自己的测量中,而不是作为 "live data" 测量中的新字段。
关于版本跟踪和可靠地获取更新:
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中,可能带有新的时间戳[=26] =].
就我个人而言,我发现 InfluxDB 非常出色,因为它能够接受来自各个方向的数据流,并且其简单的协议和无模式存储意味着添加新数据源几乎是微不足道的。但是如果我的用例有定期更新的旧数据,我会使用关系数据库。
希望消除分歧。