(可选) Grafana Mimir 查询调度器
查询调度器是一个可选的无状态组件,它维护一个待执行查询队列,并将工作负载分发给可用的 querier。
以下流程描述了查询如何在 Grafana Mimir 集群中流转
- query-frontend 接收查询,然后将其拆分和分片,或从缓存中提供服务。
- query-frontend 将查询排入查询调度器队列。
- 查询调度器将查询存储在内存队列中,等待 querier 提取并执行。
- Querier 提取查询并执行。
- 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 通过环发现查询调度器实例
- 为查询调度器配置哈希环。
- 为 query-scheduler、query-frontend 和 querier 设置
-query-scheduler.service-discovery-mode=ring
(或其对应的 YAML 配置参数)。 - 为 query-scheduler、query-frontend 和 querier 设置
-query-scheduler.ring.*
标志(或其对应的 YAML 配置参数)。
从基于 DNS 的服务发现迁移到基于环的服务发现
要将查询调度器从基于 DNS 的服务发现迁移到基于环的服务发现,请执行以下步骤
配置 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.*
等待 query-scheduler 实例完成滚动发布。
确保更改已成功应用;打开查询调度器环状态页面,并确保所有查询调度器实例已注册到环中。此时,querier 和 query-frontend 仍通过 DNS 发现查询调度器。
配置 query-frontend 和 querier 实例通过环发现查询调度器
-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
。