0

我使用 influx db 来保存我网站的性能数据。我的 influx db 中的数据如下:

//mock data
time                       load
----                       ----
2018-11-27T08:34:46.899z   262
2018-11-27T08:35:46.899z   300
2018-11-27T08:36:46.899z   102
2018-11-27T08:37:46.899z   1000
2018-11-27T08:38:46.899z   800
2018-11-27T08:39:46.899z   6000
2018-11-27T08:40:46.899z   326
2018-11-27T08:41:46.899z   500
2018-11-27T08:42:46.899z   90
2018-11-27T08:43:46.899z   902

我的目的是得到负载值的分布。例如,我想以如下形式获取加载时间的分布:

load      frequent
----      ----
0~100     1  
100~200   1  
200~300   2 
300~400   2
.
.
.
5000~6000 1

我尝试通过两种方式解决此问题,但我认为这不是获得此结果的最佳方式。

(一)查询整个加载时间,然后在我的nodejs服务器中计算这个结果。我认为当我想获得一年或更长时间的分布时,这个解决方案会遇到性能问题。

(二) 在将我的原始数据保存到 influx db 的同时,我计算了加载时间的范围,然后将其保存到另一个 influx db 表中,计算表如下:

// load distribute table
time       100~200  200~300  300~400  ....  5000~6000
----        ----     ----     ----           ----
08:34:46     1
08:34:47              1
08:34:48     1
08:34:49                       1
08:34:50                       1
  

// then in the future I can get the distribution like this:
select count(*) from load_distribute
但我认为这个解决方案也可能有缺点,比如浪费主机空间,因为你知道这个表很稀疏。

4

1 回答 1

0

我不知道单独在 InfluxDB 中进行范围分组的方法(按时间间隔除外)。

此外,即使是关系数据库也依赖于 CASE 之类的 SQL 扩展,或者那里的子查询连接——尽管 Influx 不是关系数据库。

不过,留在 TICK 堆栈中,您可以使用 Kapacitor 处理来完成,但事情是这样的:它是一个 TIMESERIES 数据库。时间是关键,我看不出时间因素在哪里...

因此,也许最好的解决方案是执行一系列单独的查询,计算每个范围内值的出现次数,然后将它们放在您的应用程序中。

或者按时间间隔加入 Kapacitor 中的相同内容(例如,每 10 分钟批处理一次),将其设置为一次测量,其中值名称表示负载范围,计数将是值(load0_99=3,load100_199=24等) - 然后你就可以在一个查询中完成它。

于 2018-12-04T16:36:17.283 回答