Frontend

简要概述

这是可选的服务,提供查询器的API端点,并可以用于加速读取路径。

当使用查询前端时,应将传入的查询请求定向到查询前端而不是查询器,在集群中仍然需要查询器服务,以执行实际的查询操作。

通过使用查询前端,可以将查询请求分配给前端服务,并由前端处理请求的负载均衡和路由。查询前端可以缓存查询结果、处理身份验证和授权、记录查询日志等。这样可以减轻查询器的负载并提高查询的性能和响应速度。

但请注意,查询前端本身并不执行实际的查询操作,它仅用于处理查询请求的转发和管理。实际的查询操作仍由查询器服务执行,因此查询器服务仍然是集群中必需的组件。

要使用查询前端加速读取路径,您需要相应地配置和部署查询前端服务,并确保将查询请求正确地定向到查询前端而不是查询器。具体的配置和部署步骤可能会因您所使用的具体系统和工具而有所不同,建议参考相关的文档和配置指南,以了解如何正确设置和使用查询前端。

总结:查询前端是一个可选的服务,用于加速读取路径。通过将查询请求定向到查询前端而不是查询器,可以提高查询性能和响应速度。查询前端负责请求的负载均衡和路由,但实际的查询操作仍由查询器服务执行。

查询队列

查询前端的排队机制用于以下目的:

  1. 确保在查询器出现内存不足错误(OOM错误)时,能够对可能导致该错误的大型查询进行重试。这使管理员可以为查询分配较少的内存,或者乐观地并行运行更多的小型查询,从而有助于降低总拥有成本(TCO)。
  2. 通过使用先进先出队列(FIFO)将大量请求分布在所有查询器上,防止多个大型请求在单个查询器上进行队列传送。这样可以平均地将这些请求分配给各个查询器。
  3. 通过在不同租户之间公平调度查询,防止单个租户通过服务拒绝攻击(DOS攻击)的方式影响其他租户。
  4. 通过查询前端的排队机制,可以实现对大型查询的重试、请求的公平分发和租户之间查询的公平调度。这有助于提高系统的可靠性、资源利用率和用户体验。

水平分割

查询前端将多天的查询拆分为多个单天的查询,并在下游的查询器上并行执行这些查询,然后将结果再次合并在一起。这样可以防止大型(多天)查询在单个查询器中引发内存不足问题,并帮助更快地执行这些查询。

通过将多天的查询拆分为单天的查询并并行执行,查询前端可以更好地处理大型查询,减少内存压力,并提高查询速度。这有助于保持系统的稳定性和性能,并提供更好的用户体验。

缓存数据

查询前端支持缓存查询结果,并在后续查询中重复使用这些结果。如果缓存的结果不完整,查询前端会计算所需的子查询,并在下游的查询器上并行执行它们。查询前端还可以选择将查询与其步长参数对齐,以改善查询结果的可缓存性。结果缓存与任何Cortex缓存后端兼容(目前支持memcached、redis和内存缓存)。

通过查询结果的缓存和重用,查询前端可以提高查询性能和响应时间,特别是对于重复查询或具有相同参数的查询。缓存查询结果可以减少对下游查询器的负载,并提供更快速的查询体验。同时,通过对查询进行步长对齐,可以进一步提高缓存的有效性,增加查询结果的可重用性。这些功能有助于提高系统的性能和可伸缩性,并降低查询成本。

配置示例

导出默认参数

frontend:
  log_queries_longer_than: 0s
  max_body_size: 10485760
  query_stats_enabled: false
  max_outstanding_per_tenant: 100
  querier_forget_delay: 0s
  scheduler_address: ""
  scheduler_dns_lookup_period: 10s
  scheduler_worker_concurrency: 5
  grpc_client_config:
    max_recv_msg_size: 104857600
    max_send_msg_size: 16777216
    grpc_compression: ""
    rate_limit: 0
    rate_limit_burst: 0
    backoff_on_ratelimits: false
    backoff_config:
      min_period: 100ms
      max_period: 10s
      max_retries: 10
    tls_enabled: false
    tls_cert_path: ""
    tls_key_path: ""
    tls_ca_path: ""
    tls_server_name: ""
    tls_insecure_skip_verify: false
  instance_interface_names:
  - eth0
  - en0
  address: ""
  port: 0
  downstream_url: ""

query_range:
  split_queries_by_interval: 0s
  align_queries_with_step: false
  results_cache:
    cache:
      enable_fifocache: false
      default_validity: 0s
      background:
        writeback_goroutines: 10
        writeback_buffer: 10000
      redis:
        endpoint: ""
        master_name: ""
        timeout: 500ms
        expiration: 0s
        db: 0
        pool_size: 0
        password: ""
        tls_enabled: false
        tls_insecure_skip_verify: false
        idle_timeout: 0s
        max_connection_age: 0s
      fifocache:
        max_size_bytes: ""
        max_size_items: 0
        validity: 0s
        size: 0
      prefix: frontend.
    compression: ""
    cache_queryable_samples_stats: false
  cache_results: false
  max_retries: 5
  forward_headers_list: []

使用 redis 缓存

frontend:
  downstream_url: http://192.168.31.201:9009
  log_queries_longer_than: 3s

http_prefix: ""

query_range:
  align_queries_with_step: true
  cache_results: true
  max_retries: 3
  results_cache:
    cache:
      redis:
        db: 1
        endpoint: 192.168.30.125:6379
        password: '********'
  split_queries_by_interval: 24h0m0s

server:
  http_listen_port: 9091

target: query-frontend

数据结构

frontend.CombinedFrontendConfig

github.com/cortexproject/cortex/pkg/frontend/config.go

// This struct combines several configuration options together to preserve backwards compatibility.
type CombinedFrontendConfig struct {
    Handler    transport.HandlerConfig `yaml:",inline"`

	// 以下三个均各配置为兼容 prometheus 的后端地址,如组件:Querier
	// 三个同时设置,仅其中一个有效,优先级:DownstreamURL > FrontendV2 > FrontendV1

    FrontendV1 v1.Config               `yaml:",inline"`
    FrontendV2 v2.Config               `yaml:",inline"`

    DownstreamURL string `yaml:"downstream_url"`
}
InitFrontend

github.com/cortexproject/cortex/pkg/frontend/config.go

transport.HandlerConfig

github.com/cortexproject/cortex/pkg/frontend/transport/handler.go

// Config for a Handler.
type HandlerConfig struct {
    // 记录慢查询日志,设置为0s关闭记录,设置小于0则记录所有,如:"3s"
    LogQueriesLongerThan time.Duration `yaml:"log_queries_longer_than"`
	// 允许客户端请求内容的最大字节
    MaxBodySize          int64         `yaml:"max_body_size"`
	// 开启查询统计会新增以下四个指标
    // cortex_query_seconds_total
	// cortex_query_fetched_series_total
	// cortex_query_fetched_chunks_bytes_total
	// cortex_query_fetched_data_bytes_total
    QueryStatsEnabled    bool          `yaml:"query_stats_enabled"`
}

v1.Config

github.com/cortexproject/cortex/pkg/frontend/v1/frontend.go

// Config for a Frontend.
type Config struct {
    MaxOutstandingPerTenant int           `yaml:"max_outstanding_per_tenant"`
    QuerierForgetDelay      time.Duration `yaml:"querier_forget_delay"`
}

v2.Config

github.com/cortexproject/cortex/pkg/frontend/v2/frontend.go

// Config for a Frontend.
type Config struct {
    SchedulerAddress  string            `yaml:"scheduler_address"`
    DNSLookupPeriod   time.Duration     `yaml:"scheduler_dns_lookup_period"`
    WorkerConcurrency int               `yaml:"scheduler_worker_concurrency"`
    GRPCClientConfig  grpcclient.Config `yaml:"grpc_client_config"`

    // Used to find local IP address, that is sent to scheduler and querier-worker.
    InfNames []string `yaml:"instance_interface_names"`

    // If set, address is not computed from interfaces.
    Addr string `yaml:"address" doc:"hidden"`
    Port int    `doc:"hidden"`
}

queryrange.Config

github.com/cortexproject/cortex/pkg/querier/tripperware/queryrange/query_range_middlewares.go

// Config for query_range middleware chain.
type Config struct {
    SplitQueriesByInterval time.Duration `yaml:"split_queries_by_interval"`
    AlignQueriesWithStep   bool          `yaml:"align_queries_with_step"`
    ResultsCacheConfig     `yaml:"results_cache"`
    CacheResults           bool `yaml:"cache_results"`
    MaxRetries             int  `yaml:"max_retries"`
    // List of headers which query_range middleware chain would forward to downstream querier.
    ForwardHeaders flagext.StringSlice `yaml:"forward_headers_list"`

    // Populated based on the query configuration
    VerticalShardSize int `yaml:"-"`
}

ResultsCacheConfig

// ResultsCacheConfig is the config for the results cache.
type ResultsCacheConfig struct {
    CacheConfig                cache.Config `yaml:"cache"`
    Compression                string       `yaml:"compression"`
    CacheQueryableSamplesStats bool         `yaml:"cache_queryable_samples_stats"`
}

cache.Config

github.com/cortexproject/cortex/pkg/chunk/cache/cache.go

// Config for building Caches.
type Config struct {
    EnableFifoCache bool `yaml:"enable_fifocache"`

    DefaultValidity time.Duration `yaml:"default_validity"`

    Background     BackgroundConfig      `yaml:"background"`
    Memcache       MemcachedConfig       `yaml:"memcached"`
    MemcacheClient MemcachedClientConfig `yaml:"memcached_client"`
    Redis          RedisConfig           `yaml:"redis"`
    Fifocache      FifoCacheConfig       `yaml:"fifocache"`

    // This is to name the cache metrics properly.
    Prefix string `yaml:"prefix" doc:"hidden"`

    // For tests to inject specific implementations.
    Cache Cache `yaml:"-"`
}

cache.RedisConfig

// RedisConfig defines how a RedisCache should be constructed.
type RedisConfig struct {
    Endpoint           string         `yaml:"endpoint"`
    MasterName         string         `yaml:"master_name"`
    Timeout            time.Duration  `yaml:"timeout"`
    Expiration         time.Duration  `yaml:"expiration"`
    DB                 int            `yaml:"db"`
    PoolSize           int            `yaml:"pool_size"`
    Password           flagext.Secret `yaml:"password"`
    EnableTLS          bool           `yaml:"tls_enabled"`
    InsecureSkipVerify bool           `yaml:"tls_insecure_skip_verify"`
    IdleTimeout        time.Duration  `yaml:"idle_timeout"`
    MaxConnAge         time.Duration  `yaml:"max_connection_age"`
}



最后修改 2023.09.24: refactor: update cortex (ba4ddf9)