菜单
开源

Grafana Mimir Querier

Querier 是一个无状态组件,它通过在读取路径上获取时间序列和标签来评估 PromQL 表达式。

Querier 使用 store-gateway 组件查询长期存储,并使用 ingester 组件查询最近写入的数据。

工作原理

为了在查询时找到需要查找的正确块,当 Querier 接收到给定租户的第一个查询时,它会延迟下载 bucket 索引。Querier 将 bucket 索引缓存在内存中并定期更新。

bucket 索引包含租户的块列表和块删除标记。Querier 随后使用块列表和块删除标记来定位给定查询需要查询的块集合。

查询请求解析

当 Querier 接收到查询范围请求时,请求包含以下参数

  • query: PromQL 查询表达式(例如,rate(node_cpu_seconds_total[1m])
  • start: 开始时间
  • end: 结束时间
  • step: 查询分辨率(例如,30 表示每 30 秒一个数据点)

对于每个查询,Querier 会分析 startend 时间范围,计算包含在该时间范围内的至少一个样本的所有已知块列表。对于每个查询的块列表,Querier 会计算持有这些块的 store-gateway 实例列表。Querier 会向每个匹配的 store-gateway 实例发送请求,以获取在 startend 时间范围内存与 query 匹配的序列的所有样本。

发送给每个 store-gateway 的请求包含预期要查询的块 ID 列表,store-gateway 返回给 Querier 的响应包含已查询的块 ID 列表。此块 ID 列表可能是请求块的子集,例如,当最近发生块重新分片事件且在过去几秒内完成时。

Querier 对从 store-gateway 收到的响应执行一致性检查,以确保所有预期的块都已查询。如果未查询到预期块,Querier 会从不同的 store-gateway 重试获取缺失块中的样本,最多重试 -store-gateway.sharding-ring.replication-factor(默认为 3)次或最多 3 次,取两者中较低的值。

如果在所有重试尝试后一致性检查失败,查询执行将失败。由于 Querier 未查询所有块而导致的查询失败可确保查询结果的正确性。

如果查询时间范围与 -querier.query-ingesters-within 时长重叠,Querier 还会将请求发送给 ingester。发送给 ingester 的请求会获取尚未上传到长期存储或尚未通过 store-gateway 可用于查询的样本。

配置的 -querier.query-ingesters-within 时长应大于以下两项

  • -querier.query-store-after
  • ingester 上传的块中存储的最旧样本被发现并可供查询的估计最短时间。使用默认配置运行 Grafana Mimir 时,上传块中最旧样本可供查询的估计最短时间为 3h

从 store-gateway 和 ingester 获取所有样本后,Querier 会运行 PromQL 引擎执行查询,并将结果发送回客户端。

连接到 store-gateway

您必须使用与配置 store-gateway 时相同的 -store-gateway.sharding-ring.* 标志(或其相应的 YAML 配置参数)配置 Querier,以便 Querier 可以访问 store-gateway 哈希环并发现 store-gateway 的地址。

连接到 ingester

您必须使用与配置 ingester 时相同的 -ingester.ring.* 标志(或其相应的 YAML 配置参数)配置 Querier,以便 Querier 可以访问 ingester 哈希环并发现 ingester 的地址。

缓存

Querier 支持以下缓存

缓存是可选的,但在生产环境中强烈推荐使用。

元数据缓存

Store-gateway 和 Querier 可以使用 Memcached 缓存以下 bucket 元数据

  • 租户列表
  • 每个租户的块列表
  • meta.json 存在性及内容
  • deletion-mark.json 存在性及内容
  • 租户 bucket-index.json.gz 内容

使用元数据缓存可减少对长期存储的 API 调用次数,并阻止 API 调用次数随 Querier 和 Store-gateway 副本数量线性增长。

要启用元数据缓存,请设置 -blocks-storage.bucket-store.metadata-cache.backend

注意

目前,Mimir 支持使用 memcached 后端进行缓存。

Memcached 客户端包含以 `-blocks-storage.bucket-store.metadata-cache.memcached.*` 前缀开头的标志提供的其他配置。

配置元数据缓存的其他标志以 `-blocks-storage.bucket-store.metadata-cache.*` 前缀开头。将 TTL 配置为零或负值将禁用给定项目类型的缓存。

注意

Store-gateway 和 Querier 应使用相同的 Memcached 后端集群。

Querier 配置

有关 Querier 配置的详细信息,请参阅Querier