菜单
开源

Grafana Mimir query-frontend

Query-frontend 是一个无状态组件,提供与 querier 相同的 API,可用于加速读取路径。虽然 query-frontend 不是必需的,但我们建议您部署它。部署 query-frontend 后,您应该向 query-frontend 发送查询请求,而不是直接发送给 querier。在集群内部,querier 是必需的,用于执行查询。

Query-frontend 内部维护一个查询队列。在这种情况下,querier 作为工作节点从队列中拉取任务,执行任务,并将结果返回给 query-frontend 进行聚合。要连接 querier 和 query-frontend,请通过 -querier.frontend-address 标志配置 querier 的 query-frontend 地址。

为了高可用性,我们建议至少运行两个 query-frontend 副本。

Query-frontend architecture

以下步骤描述了查询如何通过 query-frontend。

注意

此场景未部署 query-scheduler。

  1. 一个 query-frontend 接收到查询。
  2. 如果查询是范围查询,query-frontend 会按时间进行拆分为多个可以并行执行的更小查询。
  3. Query-frontend 检查结果缓存。如果查询结果在缓存中,query-frontend 会返回缓存结果。如果不在,查询执行将按照以下步骤继续。
  4. 如果启用了查询分片,query-frontend 会尝试对查询进行分片,以进一步并行化。
  5. Query-frontend 将查询(如果初始查询被拆分或分片,则为多个查询)放入内存队列中,等待 querier 提取。
  6. Querier 从队列中提取查询并执行。如果查询被拆分或分片为多个子查询,不同的 querier 可以提取其中任意一个查询。
  7. Querier 或多个 querier 将结果返回给 query-frontend,query-frontend 随后聚合结果并转发给客户端。

功能

本节介绍 query-frontend 的功能。

排队

Query-frontend 使用排队机制来

  • 确保如果查询失败,可能会导致 querier 出现内存不足 (OOM) 错误的大型查询会重试。这使得管理员可以为查询分配较少的内存,或者并行运行更多小型查询,从而有助于降低总拥有成本。
  • 通过使用先进先出队列在所有 querier 之间分配查询,防止单个 querier 接收多个大型请求。
  • 通过公平地调度租户之间的查询,防止单个租户对其他租户造成拒绝服务。

拆分

Query-frontend 可以将长时间范围查询拆分为多个查询。默认情况下,拆分间隔为 24 小时。Query-frontend 在下游 querier 中并行执行这些查询,并将结果合并在一起。拆分可以防止大型多天或多月查询导致 querier 出现内存不足错误,并加速查询执行。

缓存

Query-frontend 会缓存查询结果,并在后续查询中重用。如果缓存结果不完整,query-frontend 会计算所需的局部查询并在下游 querier 中并行执行。Query-frontend 可选地将查询与其步长参数对齐,以提高查询结果的可缓存性。结果缓存由 Memcached 提供支持。

尽管将步长参数与查询时间范围对齐可以提高 Grafana Mimir 的性能,但这违反了 Grafana Mimir 的 PromQL 一致性。如果 PromQL 一致性对您来说不是优先事项,您可以通过设置 -query-frontend.align-queries-with-step=true 来启用步长对齐。

关于查询分片

Query-frontend 还提供查询分片

Query-frontend 可扩展性受限的原因

Query-frontend 的可扩展性受限于每个 querier 配置的工作节点数量。

当您不使用 query-scheduler 时,query-frontend 会存储一个待执行查询队列。一个 querier 运行 -querier.max-concurrent 个工作节点,每个工作节点连接到一个 query-frontend 副本以拉取待执行的查询。一个 querier 工作节点一次执行一个查询。

querier 工作节点与 query-frontend 之间的连接是持久的。连接建立后,多个查询通过该连接逐个发送。为了平衡连接到每个 query-frontend 的工作节点数量,querier 工作节点使用轮询方法选择要连接的 query-frontend 副本。

如果您运行的 query-frontend 副本数量多于每个 querier 的工作节点数量,querier 会增加内部工作节点的数量以匹配 query-frontend 副本。这确保了所有 query-frontend 都有一些工作节点连接,但也引入了可扩展性限制,因为您运行的 query-frontend 副本越多,每个 querier 运行的工作节点数量就越多,而与配置的 -querier.max-concurrent 无关。

Query-scheduler 是一个可选组件,您可以部署它来克服 query-frontend 的可扩展性限制。

DNS 配置和就绪性

当 query-frontend 启动时,它不会立即连接到 querier。/ready 端点仅当 query-frontend 至少连接到一个 querier 时才返回 HTTP 200 状态码,此时它才准备好服务查询。将 /ready 端点配置为负载均衡器中的健康检查;否则,query-frontend 扩容事件可能会导致查询失败或高延迟,直到 querier 连接到 query-frontend。

如果您将 query-frontend 与 query-scheduler 一起使用,/ready 端点仅在 query-frontend 连接到至少一个 query-scheduler 后才会报告 HTTP 200 状态码。