多级降采样

openGemini大约 3 分钟约 988 字

背景介绍 在DevOps或Iot等场景中,用户对近期数据更敏感,很多时候只需要对近期指定数据进行完整的数据查询,而对较久远的数据仅进行数据趋势查询,即采样数据的查询,因此对久远的低价值数据,我们可以通过降采样的方式进行数据的采样缩放。

降采样 降采样即一定时间间隔内的数据点,基于一定规则,聚合为一个或一组值,从而达到降低采样点数,减少整体存储数据量,进而减轻存储和查询计算的压力。

多级降采样 多级降采样与普通降采样的区别在于,多级降采样可以对不同时间段的数据进行不同的降采样策略。 实际业务中用户对不同时间段的降采样要求是不一样的,用户可能对近期的数据比较敏感而对长远的数据需求较少,所以需要根据实际业务对数据进行不同的多级降采样策略。采用多级降采样的方式既满足了用户对高价值数据的查询需求,又兼顾了存储效率。

场景举例 多重降采样场景举例:7天内原始数据直接入库,7-30天数据,15min粒度降采样后入库,30天-12个月的数据,1h粒度降采样后入库。 如下图所示,假设今天是2022-12-31,蓝色部分是7天内的数据,黄色部分是7-30天数据,橙色部分是30天-12个月的数据。每过一段时间,数据库会把蓝色部分的数据以15min为粒度聚合放到黄色区域中;每过一段时间,数据库会把黄色部分以1h为粒度聚合放到橙色区域中,注意这里1h是15min的倍数,所以可以方便地聚合。 多级降采样场景图

创建降采样

语法:

Create DownSample [on <rp_name>| on <dbname>.<rp_name>|  ]((dataType(aggregators)...)) With Duration <timeDuration> SampleInterval(time Durations) TimeInterval(time Durations) WaterMark(time Durations)

参数说明:

DurationSampleIntervalTimeIntervalWaterMark
数据保留时间执行下一级降采样时间采样Interval采样滞后时间

聚合方法定义格式:

dataType(aggfunctions...)

聚合方法举例:

int(first,sum,count,last,min,max)
int(min,max),float(sum)

限制说明:

  • SampleInterval,TimeInterval,WaterMark指定的采样策略数量必须相同,比如其中有一项的数量是3,其他两项的数量也必须是3;
  • SampleInterval、 TimeInterval、WaterMark为一一对应关系、每个数组内为倍数关系;

举例说明:

 Create DownSample 
 (float(sum,last),integer(max,min))
 With Duration 7d 
 sampleinterval(1d,2d)
 timeinterval(1m,3m)
 watermark(1s,10s)

Duration是7d,说明这个降采样数据保存最长是7d,这里的Duration需要小于指定的RP的Duration。

1d内的数据采样间隔为1m,1d至2d内的数据采样为3m,采样滞后分别为1s和10s。这里(1d,1m,1s)和(2d,3m,10s)两个元组相对应,同时2d是1d的倍数,3m是1m的倍数,10s是1s的倍数,符合限制条件。

采样聚合数据为sum,last,max,min。float(sum,last)代表sum和last聚合数据是float格式,integer(max,min)代表max和min聚合数据是integer格式。

显示降采样

语法: show 默认database 所有 downsample tasks:

SHOW DOWNSAMPLES

show 指定database 所有 downsample tasks:

SHOW DOWNSAMPLES ON <dtabase name>

举例说明:

> show downsamples on db0
rpName  field_operator                   duration  sampleInterval    timeInterval waterMark
------  --------------                   --------  --------------    ------------ ---------
autogen float{sum,last},integer{max,min} 168h0m0s  24h0m0s,48h0m0s   1m0s,3m0s    1s,10s
rp1     float{sum,last},integer{max,min} 720h0m0s  24h0m0s,168h0m0s  1m0s,3m0s    1s,1m0s
rp2     bool{last},int{max,min,first}    2400h0m0s 168h0m0s,360h0m0s 30m0s,1h0m0s 10m0s,10h0m0s

删除降采样

语法: 删除数据库的所有降采样:

Drop DownSamples
Drop DownSamples on db0

删除指定RP的降采样:

Drop DownSample on rp1
Drop DownSample on db.rp