菜单
文档breadcrumb arrow Grafana Mimirbreadcrumb arrow 参考breadcrumb arrow 高级架构breadcrumb arrow 组件breadcrumb arrow (可选) Query-scheduler
开源

(可选) Grafana Mimir 查询调度器

查询调度器是一个可选的无状态组件,它维护一个待执行查询队列,并将工作负载分发给可用的 querier

Query-scheduler architecture

以下流程描述了查询如何在 Grafana Mimir 集群中流转

  1. query-frontend 接收查询,然后将其拆分和分片,或从缓存中提供服务。
  2. query-frontend 将查询排入查询调度器队列。
  3. 查询调度器将查询存储在内存队列中,等待 querier 提取并执行。
  4. Querier 提取查询并执行。
  5. Querier 将结果发送回 query-frontend,query-frontend 再将结果转发给客户端。

使用查询调度器的益处

查询调度器支持 query-frontend 的伸缩。当您伸缩 query-frontend 时,可能会遇到挑战。要了解更多关于 query-frontend 伸缩限制的信息,请参考为什么 query-frontend 的伸缩性有限

查询调度器如何解决 query-frontend 的伸缩限制

使用查询调度器时,队列从 query-frontend 移至查询调度器,query-frontend 可以伸缩到任意数量的副本。

查询调度器也受 query-frontend 相同的伸缩限制影响,但由于单个查询调度器副本可以处理大量查询吞吐量,即使对于非常大的 Grafana Mimir 集群,通常也不需要将查询调度器伸缩到超过 -querier.max-concurrent 数量的副本。

配置

要使用查询调度器,query-frontend 和 querier 需要发现查询调度器实例的地址。查询调度器支持两种服务发现机制

  • 基于 DNS 的服务发现
  • 基于环的服务发现

基于 DNS 的服务发现

要使用基于 DNS 的服务发现来使用查询调度器,请配置 query-frontend 和 querier 连接到查询调度器

  • Query-frontend: -query-frontend.scheduler-address
  • Querier: -querier.scheduler-address

注意

配置的查询调度器地址应采用 host:port 格式。

如果运行多个查询调度器,主机应是解析到所有查询调度器实例的 DNS 名称。

注意

querier 仅从 query-frontend 或查询调度器拉取查询,不同时从两者拉取。-querier.frontend-address-querier.scheduler-address 选项互斥,您只能设置其中一个选项。

基于环的服务发现

要使用基于环的服务发现来使用查询调度器,请配置查询调度器加入其哈希环,并配置 query-frontend 和 querier 通过环发现查询调度器实例

  1. 为查询调度器配置哈希环
  2. 为 query-scheduler、query-frontend 和 querier 设置 -query-scheduler.service-discovery-mode=ring(或其对应的 YAML 配置参数)。
  3. 为 query-scheduler、query-frontend 和 querier 设置 -query-scheduler.ring.* 标志(或其对应的 YAML 配置参数)。

从基于 DNS 的服务发现迁移到基于环的服务发现

要将查询调度器从基于 DNS 的服务发现迁移到基于环的服务发现,请执行以下步骤

  1. 配置 query-scheduler 实例加入一个环

    -query-scheduler.service-discovery-mode=ring
    
    # Configure the query-scheduler ring backend (e.g. "memberlist").
    -query-scheduler.ring.store=<backend>
    
    # If the configured <backend> is "memberlist", then ensure memberlist is configured for the query-scheduler.
    -memberlist.join=<same as other Mimir components>
    
    # If the configured <backend> is "consul" or "etcd", then set their backend configuration
    # for the query-scheduler ring:
    # - Consul: -query-scheduler.ring.consul.*
    # - Ecd:    -query-scheduler.ring.etcd.*
  2. 等待 query-scheduler 实例完成滚动发布。

  3. 确保更改已成功应用;打开查询调度器环状态页面,并确保所有查询调度器实例已注册到环中。此时,querier 和 query-frontend 仍通过 DNS 发现查询调度器。

  4. 配置 query-frontendquerier 实例通过环发现查询调度器

    -query-scheduler.service-discovery-mode=ring
    
    # Remove the DNS-based service discovery configuration:
    # -query-frontend.scheduler-address
    
    # Configure the query-scheduler ring backend (e.g. "memberlist").
    -query-scheduler.ring.store=<backend>
    
    # If the configured <backend> is "memberlist", then ensure memberlist is configured for the query-scheduler.
    -memberlist.join=<same as other Mimir components>
    
    # If the configured <backend> is "consul" or "etcd", then set their backend configuration
    # for the query-scheduler ring:
    # - Consul: -query-scheduler.ring.consul.*
    # - Ecd:    -query-scheduler.ring.etcd.*

注意

如果您使用 Jsonnet 部署 Mimir 集群,请参考从基于 DNS 的服务发现迁移查询调度器到基于环的服务发现

操作注意事项

为了高可用性,运行两个查询调度器副本。

如果您运行的 Grafana Mimir 集群具有非常高的查询吞吐量,可以添加更多查询调度器副本。如果您伸缩查询调度器,请确保添加的副本数量小于或等于配置的 -querier.max-concurrent