【问题标题】:Query InfluxDB last point查询 InfluxDB 最后一点
【发布时间】:2021-10-07 15:44:06
【问题描述】:

我使用了一个 c++ 库 influxdb-cxx,它使用 curl 将数据插入到数据库中。 在我的 C++ 程序中,我将编写 4 个测量值,每个测量值每秒插入几十个点。 我使用UDP发送数据

sensor_->influxdb_ = influxdb::InfluxDBFactory::Get("udp://localhost:8089?db=udp");

插入 c++ 代码的外观之一:

sensor_->influxdb_->write(influxdb::Point("/controller/data")
                                           .addField("angular", sensor_->angular())
                                           .addField("speed_left_rear", sensor_->speedl()
                                           .addField("speed_right_rear", sensor_->speedr()
                                           .addField("voltage", sensor_->voltage()));

它将插入一个测量点“/controller/data”。这个点有四个字段,没有标签。

当我在数据库中查询最后半秒的数据时,出现了问题。我打开一个终端并输入

influx
use udp
create retention policy "1h" on udp duration 1h replication 1 shard duration 1h default
precision rfc3339
SELECT * FROM "udp".."/controller/data" WHERE time >= now() - 500ms

预期行为: 我可以在最后半秒获得积分,所有字段都不为空,并且同一行中的数据具有相同的时间戳。 实际行为: 有时归档的值为空。 例如:

> SELECT * FROM "udp".."/controller/data" WHERE time >= now() - 500ms
name: /controller/data
time                           angular speed_left_rear speed_right_rear voltage
----                           ------- --------------- ---------------- -------
2021-08-02T08:47:41.17175053Z  99      0               0                23152
2021-08-02T08:47:41.189857794Z -49     0               0                23152
2021-08-02T08:47:41.203743539Z 282     0               0                23152
2021-08-02T08:47:41.219689002Z 299     0               0                23152
2021-08-02T08:47:41.235739755Z 249     0               0                23223
2021-08-02T08:47:41.251701843Z 299     0               0                23311
2021-08-02T08:47:41.267655473Z 133     0               0                23311
2021-08-02T08:47:41.284691461Z 382     0               0                23311
2021-08-02T08:47:41.299605898Z 116     0               0                23240
2021-08-02T08:47:41.315760775Z                                          23240
2021-08-02T08:47:41.331771862Z                                          23240
2021-08-02T08:47:41.347798407Z                                          23240
2021-08-02T08:47:41.363746204Z                                          23364
2021-08-02T08:47:41.380132952Z                                          23364
2021-08-02T08:47:41.395660171Z                                          23364
2021-08-02T08:47:41.411623426Z                                          23364
2021-08-02T08:47:41.427676221Z                                          23241
2021-08-02T08:47:41.443633642Z                                          23241
2021-08-02T08:47:41.459634521Z                                          23241
2021-08-02T08:47:41.475580859Z                                          23241
2021-08-02T08:47:41.491627529Z                                          23400
2021-08-02T08:47:41.507684407Z                                          23400
2021-08-02T08:47:41.523670412Z                                          23400
2021-08-02T08:47:41.539542668Z                                          23400
2021-08-02T08:47:41.556554739Z                                          23400
2021-08-02T08:47:41.571867004Z                                          23329
2021-08-02T08:47:41.587669261Z                                          23329
2021-08-02T08:47:41.603685306Z                                          23329
2021-08-02T08:47:41.619762893Z                                          23329
2021-08-02T08:47:41.636273305Z                                          23293
2021-08-02T08:47:41.651680944Z                                          23293
2021-08-02T08:47:41.667774571Z                                          23293
2021-08-02T08:47:41.683901448Z                                          23293
2021-08-02T08:47:41.699780996Z                                          23417
2021-08-02T08:47:41.715881623Z                                          23417
2021-08-02T08:47:41.732012Z                                             23417
2021-08-02T08:47:41.747715092Z                                          23417
2021-08-02T08:47:41.763705763Z                                          23205
2021-08-02T08:47:41.779796182Z                                          23205
2021-08-02T08:47:41.795692354Z                                          23205

> SELECT * FROM "udp".."/controller/data" WHERE time >= now() - 500ms
name: /controller/data
time                           angular speed_left_rear speed_right_rear voltage
----                           ------- --------------- ---------------- -------
2021-08-02T08:49:30.314298081Z 649     0               0                23293
2021-08-02T08:49:30.330174725Z 316     0               0                23293
2021-08-02T08:49:30.346282365Z 798     0               0                23187
2021-08-02T08:49:30.362351798Z 732     0               0                23187
2021-08-02T08:49:30.378310691Z 282     0               0                23187
2021-08-02T08:49:30.39422Z     549     0               0                23293
2021-08-02T08:49:30.410205143Z 615     0               0                23329
2021-08-02T08:49:30.42628595Z  149     0               0                23329
2021-08-02T08:49:30.442316883Z 282     0               0                23329
2021-08-02T08:49:30.45822561Z  582     0               0                23329
2021-08-02T08:49:30.474172836Z 133     0               0                23364
2021-08-02T08:49:30.490214269Z 233     0               0                23364
2021-08-02T08:49:30.506210203Z 549     0               0                23364
2021-08-02T08:49:30.522200303Z -399    0               0                23364
2021-08-02T08:49:30.538234736Z -366    0               0                23364
2021-08-02T08:49:30.554288127Z                         0                23364
2021-08-02T08:49:30.570351727Z                         0                23364
2021-08-02T08:49:30.586195413Z                         0                23364
2021-08-02T08:49:30.602191055Z                         0                23241
2021-08-02T08:49:30.618195155Z                         0                23241
2021-08-02T08:49:30.634950578Z                         0                23241
2021-08-02T08:49:30.650237772Z                         0                23223
2021-08-02T08:49:30.666386828Z                         0                23276
2021-08-02T08:49:30.682325013Z                         0                23276
2021-08-02T08:49:30.698237823Z                         0                23276
2021-08-02T08:49:30.714291797Z                         0                23276
2021-08-02T08:49:30.730265564Z                         0                23099
2021-08-02T08:49:30.746241957Z                         0                23099
2021-08-02T08:49:30.762230307Z                         0                23099
2021-08-02T08:49:30.778286615Z                         0                23099
2021-08-02T08:49:30.794283132Z                         0                22993
2021-08-02T08:49:30.819896051Z                         0                23134
2021-08-02T08:49:30.826242917Z                         0                23134
2021-08-02T08:49:30.84235989Z                          0                23134
2021-08-02T08:49:30.86443611Z                          0                23134
2021-08-02T08:49:30.874357007Z                         0                23170
2021-08-02T08:49:30.890441315Z                         0                23170
2021-08-02T08:49:30.906395249Z                         0                23170
2021-08-02T08:49:30.922352392Z                         0                23170
2021-08-02T08:49:30.942798927Z                         0                23187
2021-08-02T08:49:30.954241427Z                         0                23187
2021-08-02T08:49:30.970329818Z                         0                23187
2021-08-02T08:49:30.986202379Z                         0                23240
2021-08-02T08:49:31.002118397Z                         0                23046
2021-08-02T08:49:31.018028873Z                         0                23046
2021-08-02T08:49:31.034310053Z                         0                23046

如您所见,有许多空值。 左列更容易为空,而归档键voltage 的最右列永远不会有空值。

所以我猜:同一行的字段值对应同一个时间戳,但它们不是同时写入数据库的,有的可能会写入,有的没有。对吗?

如果有办法让同一个raw中的不同字段同时写入?那么当我查询同一行中的每个字段时都不为null。

或者如何查询所有字段都不为空的最近的点?我其实是想查询测量中的最后一个点:select * from "udp".."/controller/data" order by time desc limit 1,但它有时会返回一个带有一些字段的点有一个空值。

我发现last() 对我没有帮助。 因为如果我使用SELECT last(*) FROM "udp".."/controller" WHERE time > now() - 1s(我使用WHERE 子句,因为我认为它可以通过指定时间范围让它查询更快),它只是合并来自last(angular)last(speed_left_rear)last(speed_right_rear)、@987654335 的结果@成一点。但字段值可能不会对应相同的时间戳。

环境信息:

我在类似于 raspberryPi 的嵌入设备 nanopi 上运行所有这些程序。

  • 系统信息:Linux 4.4.179 aarch64
  • InfluxDB 版本:1.8.7

配置: 我的 influx.conf

[[udp]]
  enabled = true
  batch-size = 50
  batch-pending = 5
  batch-timeout = "1s"

我尝试修改 UDP 批量大小,看看是否有任何不同:

如果我在 influxdb.conf 中将 batch-size 修改为 1

[[udp]]
  enabled = true
  batch-size = 1
  batch-pending = 5
  batch-timeout = "1s"

这会增加很多CPU负载,我只能得到时间>现在-22s的点

select * from "udp".."/controller/data" where time >= now() - 22s

它返回以下结果:

> SELECT * FROM "udp".."/controller/data" WHERE time >= now() - 21s
name: /controller/data
time                angular speed_left_rear speed_right_rear voltage
----                ------- --------------- ---------------- -------
1627894525069581596 599     0               0                23276
1627894525115397757 366     0               0                23116
1627894525147390263 782     0               0                23258
1627894525163375140 216     0               0                23258
1627894525179457142 449     0               0                23258
1627894525211368273 249     0               0                23382
1627894525227548857 532     0               0                23382
1627894525259374239 133     0               0                23382
1627894525275378367 249     0               0                23169
1627894525307387789 665     0               0                23169
1627894525323413499 499     0               0                23169
1627894525355366338 599     0               0                23311
1627894525371388841 382     0               0                23311
1627894525387508467 499     0               0                23311
1627894525403456887 1148    0               0                23223
1627894525420205921 549     0               0                23205
1627894525436119925 149     0               0                23205
1627894525452726045 366     0               0                23205
1627894525468630132 183     0               0                23223
1627894525484748008 -99     0               0                23223
1627894525500814260 249     0               0                23223
1627894525516629098 499     0               0                23223
1627894525533157344 848     0               0                23205
1627894525548644353 366     0               0                23205
1627894525564793437 16      0               0                23205
1627894525627496298 66      0               0                23347
1627894525675488264 83      0               0                23240
1627894525723471189 -33     0               0                23418
1627894525755489652 166     0               0                23418
1627894525772796929 332     0               0                23418
1627894525803355328                                          23152

它有时仍会返回空值。 所以改变batch size对这个问题不起作用,而且batch-size似乎是一列的属性,它打包了一定数量的列数据,然后写入数据库。

【问题讨论】:

  • 我做了一些测试,发现问题可能不是同一行没有同时写入,而是查询时更新了不同列中的数据。
  • 可能我在查询第一列的时候,新的udp-batch被写入wal和cache,然后在查询第二列的时候,就可以取到新的timestamp值了,是吗?

标签: influxdb write


【解决方案1】:

我不会使用 InfluxDB 处理过去 500 毫秒的数据。该软件不适用于此类解决方案。 InfluxDB 没有优先权将所有值放在定义的时间。它不是一个实时系统。如果您需要类似的东西,我建议您使用实时的 PLC 类型设备。 但是...如果您非常想以这种方式使用它,我可以建议以下棘手的解决方案:

  1. 请求不更新的数据,例如 400 毫秒:

SELECT last(*) FROM "udp".."/controller/data" WHERE time >= now() - 10s and time

假设 400 毫秒后您在所有字段中都有值。 3) 请求安全延迟的数据,例如 500ms:

SELECT first(*) FROM "udp".."/controller/data" WHERE time >= now() - 500ms

上面的查询应该在 500 毫秒之前为您提供第一个值。假设需要不到 500 毫秒的时间来写入所有字段值。

  1. 使用 where 子句对所有值字段请求数据,如果那里只有数据,则始终为 true:

SELECT * FROM "udp".."/controller/data" WHERE time >= now() - 5s and "angular">-9999999 and "speed_left_rear">-9999999 and "speed_right_rear">-9999999"> and "电压">-9999999 极限1

以上所有假设您无法读取低于 -9999999 的值。 这样,您应该只收到已写入所有值且不早于 5s 的系列。您将获得的值是具有相同时间戳且所有写入值的最新值。

  1. 和 2) 解决方案可能在某些条件下工作或不工作,假设有延迟(这取决于系统工作负载等)。 3) 如果您需要所有具有相同时间戳的值,这可能是最佳解决方案。

  2. 另一种方法是进行 4 个独立的查询,您可以在其中查询最后一个值:

从“udp”..“/controller/data”中选择最后一个(角度) SELECT last(speed_left_rear) FROM "udp".."/controller/data" SELECT last(speed_right_rear) FROM "udp".."/controller/data" SELECT last(voltage) FROM "udp".."/controller/data"

  1. 甚至在子查询中请求它:

Select * from (SELECT last(angular) as "angular" FROM "udp".."/controller/data"),(SELECT last(speed_left_rear) as "speed_left_rear" FROM "udp".."/controller/ data"),(SELECT last(speed_right_rear) as "speed_right_rear" FROM "udp".."/controller/data"),(SELECT last(voltage) as "voltage" FROM "udp".."/controller/data" )

它会为您提供最新的值,但它们可能没有相同的时间戳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2017-01-24
    • 2021-02-11
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多