如果您使用时间序列数据库(timeseries db,
免责声明:列出的问题适用于 InfluxDB 版本 1.7.4。
为什么是时间序列?
该项目旨在跟踪各种区块链上的交易并显示统计数据。 具体来说,我们看看稳定币的发行和燃烧(
在分析交易时,产生了一个想法:使用InfluxDB时序数据库作为主存储。 交易是时间点,它们非常适合时间序列模型。
聚合函数看起来也非常方便 - 非常适合处理长期图表。 用户需要一年的图表,数据库包含时间范围为五分钟的数据集。 向他发送全部十万个点是没有意义的——除了长时间的处理之外,它们甚至无法显示在屏幕上。 您可以编写自己的增加时间范围的实现,或使用 Influx 中内置的聚合函数。 在他们的帮助下,您可以按天对数据进行分组并发送所需的 365 个点。
令人有点困惑的是,此类数据库通常用于收集指标。 监控服务器、物联网设备以及数以百万计的点“流动”的一切:[<时间> - <指标值>]。 但是,如果数据库在大数据流下运行良好,那么为什么小数据流会导致问题呢? 考虑到这一点,我们使用 InfluxDB 来工作。
InfluxDB还有什么方便的地方
除了上面提到的聚合函数之外,还有一个很棒的东西 - 连续查询 (
也有一个 保留政策 (
- 创建连续查询以将数据聚合到另一个表中;
- 对于第一个表,定义删除早于同一周的指标的策略。
而且Influx会独立减少数据的大小,删除不必要的东西。
关于存储的数据
存储的数据不多:大约 70 万笔交易和另外 3000 万个带有市场信息的点。 添加新条目 - 每天不超过 XNUMX 点。 该网站也有一些指标,但那里的数据很少,而且根据保留政策,它们的存储时间不超过一个月。
问题
在服务的开发和后续测试过程中,InfluxDB的运行出现了越来越多的关键问题。
1. 删除数据
有一系列的交易数据:
SELECT time, amount, block, symbol FROM transactions WHERE symbol='USDT'
结果:
我正在发送删除数据的命令:
DELETE FROM transactions WHERE symbol=’USDT’
接下来我请求接收已删除的数据。 Influx 返回的不是空响应,而是应删除的部分数据。
我正在尝试删除整个表:
DROP MEASUREMENT transactions
我检查表删除:
SHOW MEASUREMENTS
我在列表中没有看到该表,但新的数据查询仍然返回相同的事务集。
这个问题只出现在我身上一次,因为删除案例是一个孤立的案例。 但数据库的这种行为显然不符合“正确”操作的框架。 后来发现github上开放了
因此,删除然后恢复整个数据库会有所帮助。
2. 浮点数
在 InfluxDB 中使用内置函数时的数学计算存在精度错误。 这并不是什么不寻常的事情,但它是令人不愉快的。
就我而言,数据包含财务成分,我希望对其进行高精度处理。 因此,我们计划放弃连续查询。
3、连续查询无法适配不同时区
该服务有一个包含每日交易统计数据的表。 对于每一天,您需要对当天的所有交易进行分组。 但每个用户的一天将在不同的时间开始,因此交易集也会不同。 按 UTC 时间 是
在 InfluxDB 中,按时间分组时,您还可以指定班次,例如莫斯科时间 (UTC+3):
SELECT MEAN("supply") FROM transactions GROUP BY symbol, time(1d, 3h) fill(previous)
但查询结果会不正确。 由于某种原因,按天分组的数据会一直追溯到1677年(InfluxDB官方支持从今年开始的时间跨度):
为了解决这个问题,我们暂时将服务切换到 UTC+0。
4. 性能
互联网上有很多比较 InfluxDB 和其他数据库的基准测试。 乍一看,它们看起来像是营销材料,但现在我认为其中有一些道理。
我来告诉你我的情况。
该服务提供了一个 API 方法来返回最后一天的统计信息。 执行计算时,该方法使用以下查询查询数据库 XNUMX 次:
SELECT * FROM coins_info WHERE time <= NOW() GROUP BY symbol ORDER BY time DESC LIMIT 1
SELECT * FROM dominance_info ORDER BY time DESC LIMIT 1
SELECT * FROM transactions WHERE time >= NOW() - 24h ORDER BY time DESC
解释:
- 在第一个请求中,我们通过市场数据获取每种代币的最后分数。 就我而言,八个硬币可以得到八个积分。
- 第二个请求获取最新点之一。
- 第三个请求请求过去 XNUMX 小时内的交易列表;可能有数百个。
让我澄清一下,InfluxDB会根据标签和时间自动构建索引,从而加快查询速度。 在第一个请求中 符号 是一个标签。
我已经对此 API 方法进行了压力测试。 对于 25 RPS,服务器展示了 XNUMX 个 CPU 的满负载:
同时,NodeJs进程根本不提供任何负载。
执行速度已经下降了 7-10 RPS:如果一个客户端可以在 200 毫秒内收到响应,那么 10 个客户端就必须等待一秒钟。 25 RPS 是稳定性受到影响的极限;向客户端返回了 500 个错误。
有了这样的性能,不可能在我们的项目中使用 Influx。 而且:在一个需要向很多客户端演示监控的项目中,可能会出现类似的问题,并且指标服务器会过载。
结论
从所获得的经验中得出的最重要的结论是,如果没有充分的分析,就不能将未知的技术应用到项目中。 对 github 上的未解决问题进行简单筛选可以提供信息,以避免选择 InfluxDB 作为主要数据存储。
InfluxDB 本来应该很适合我的项目的任务,但实践表明,这个数据库并不能满足需求,而且有很多 bug。
您已经可以在项目存储库中找到版本 2.0.0-beta;我们只能希望第二个版本能够有重大改进。 与此同时,我将去研究 TimescaleDB 文档。
来源: habr.com