本文介绍时序存储查询加速功能的全局缓存与并发计算原理,以及各项配置参数的含义。
原理介绍
全局缓存与并发计算原理说明如下所示:
全局缓存
Prometheus Query计算引擎默认不对执行结果进行缓存,每次查询都需重新计算所有数据,在数据量大、时间范围长时性能较差。全局缓存功能支持复用上一次相同查询(PromQL语句和step参数值一致)的部分查询结果,并对未命中缓存的时间区间单独执行新的查询。
开启全局缓存后,会将每次查询区间的start和end参数对齐到step参数的整数倍,极大提升缓存命中概率,从而提升查询执行效率。相应query执行完成后,也同时会更新对应的缓存结果。
为减少数据完整性的影响,如果查询不完整将不会保存到缓存结果中;同时超过当前时间区间的查询结果也不会更新到缓存中。
并发计算
Prometheus标准的Query默认仅在一台机器上进行单协程计算,在时间线多、查询时间段长、计算逻辑复杂等场景下速度较慢。日志服务对Prometheus引擎进行了改造,支持Prometheus Query的分布式并发执行。并发计算提供按时间片和按时间线两种切分模式,并将一个PromQL Query调度到多台机器执行,性能相比单机执行可提升2~10倍。
按时间片切分
以下面Query为例,将每2h切分成一个query,即能够启动6个任务并发执行计算,最后将结果进行合并。
query: sum(metric) interval: 12h step: 2m
按时间线切分
如果一个Metric的时间线有50万条,如果设置切分大小为10,即分成10个任务并发执行计算。每个任务负责5万条左右的时间线数据,各任务执行完成后会对结果进行合并。
您无需关心PromQL是否适合执行并发计算,日志服务时序计算引擎会自行判断并将适合并发计算的PromQL查询调度到多个节点执行计算。
并发计算更适用于查询范围长或者Metric时间线较多的计算场景,而数据量较小的查询请求则可能会受到分布式调度的影响而获得负收益。在明确使用场景的情况下,推荐采用Http FormValue形式针对特定查询场景配置并行计算的相关参数项。
在聚合计算的场景中,Aggregation without()的用法在并发计算中的性能提升较小,例如,agg without() metric{}。此Query等同于对所有Label信息做by操作,该类计算对结果集中sample数量的影响较小,即仍有大量的中间结果需进行汇总聚合,因此对性能的提升较小,甚至在海量时间线的场景中可能导致负优化。同理,如果对多个Label做by运算也同样可能出现上述情况。
配置说明
查询加速支持以下参数配置项,支持MetricsConfig与Http FormValue两种方式进行参数配置。
参数类别 | 参数项 | 说明 | MetricsConfig | FormValue | 说明 |
parallel_config 并发计算配置项 | enable | 是否开启并发计算,默认关闭。 | 支持 | 支持 | 并发计算会将Query拆分成多个小Query并调度到多个子计算节点执行,最后在主计算节点上汇聚结果。 |
mode | 并发选择模式,说明如下:
| 支持 | 不支持 | 并发计算的配置有两种模式,推荐按照下方截图中的参数来添加静态配置。 | |
timePieceInterval | 按照时间区间进行分片的时间段单元,单位秒。支持的范围为[3600, 86400*30],默认21600(6小时)。 | 支持 | 支持 | 按照时间区间进行分片的最小分片单元,单位:秒。在控制台中,需按小时粒度输入。 | |
timePieceCount | 按照时间区间进行分片的分片数,支持1-16,默认8。 | 支持 | 支持 | 按照时间区间进行分片的最大分片数。 | |
totalParallelCount | 全局并发数,支持2-64,默认8。 | 支持 | 支持 | 全局并发数。支持按照时间线进行分片,该参数表示总的分片数。例如,当前Metric的时间线有500万条,设置总并发数为10,即每个并发处理50万条时间线的数据。 | |
parallelCountPerHost | 单机并发数,支持1-8,默认2。 | 支持 | 支持 | 单机并发数。支持按照时间线进行分片,所有分片会被调度到不同的机器节点上执行,此参数用于控制单台机器上被分配到的分片数。 | |
query_cache_config 全局缓存配置项 | enable | 是否开启全局缓存,默认关闭。 | 支持 | 支持 | 开启后能够复用之前相同Query的部分结果。 |
通过MetricsConfig配置查询加速
MetricsConfig是日志服务为每个时序库提供的独立的参数配置项,支持日志服务控制台与SDK两种配置方式。在新增或更新MetricsConfig后,需等待3分钟生效。
通过SLS控制台设置时序库的加速配置
在MetricStore属性页面,完成如下操作。如何进入MetricStore属性页面,请参见修改MetricStore配置。
其中,并发计算支持两种配置模式。
自动模式:日志服务后端会根据相同Query近几次执行时拉取的数据量大小来估算当次的并发度大。
静态配置:您自定义配置并发度大小,如有配置需求建议咨询日志服务的技术支持人员。
通过SDK设置时序库的MetricsConfig
日志服务Java SDK中提供了修改MetricsConfig的接口,支持通过JSON形式配置MetricsConfig的各项具体参数,如下面的示例。
{
"parallel_config": {
"enable": true,
"mode": "static",
"parallel_count_per_host": 2,
"time_piece_count": 8,
"time_piece_interval": 21600,
"total_parallel_count": 8
},
"query_cache_config": {
"enable": true
}
}
下表给出了查询加速配置中的各个参数配置项与MetricsConfig JSON字段、FormValue中Key字段的映射关系。
参数类别 | 参数项 | MetricsConfig json字段 | Form Value | |
parallel_config | enable | enable | x-sls-parallel-enable | |
mode | mode | 无 | ||
timePieceInterval | time_piece_interval | x-sls-parallel-time-piece-interval | ||
timePieceCount | time_piece_count | x-sls-parallel-time-piece-count | ||
totalParallelCount | total_parallel_count | x-sls-parallel-count | ||
parallelCountPerHost | parallel_count_per_host | x-sls-parallel-count-per-host | ||
query_cache_config | enable | enable | x-sls-global-cache-enable |
通过Http FormValue配置查询加速
除MetricsConfig方式外,也支持在HTTP请求中加入参数值,此种配置方式仅对当次请求有效。时序库指标查询的API接口详情,请参见时序指标查询API。
此处提供全局缓存和并发计算两个场景的配置示例。
全局缓存
通过FormValue的形式新增了x-sls-global-cache-enable=true
参数以开启全局缓存。
https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query_range?query=sum(up)&start=1690876800&end=1690877800&step=10&x-sls-global-cache-enable=true
并行计算
新增x-sls-parallel-enable=true&x-sls-parallel-count=16
参数,表示当次请求启用并发计算且并发度大小为16。
https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query_range?query=sum(up)&start=1690876800&end=1690877800&step=10&x-sls-parallel-enable=true&x-sls-parallel-count=16