菜单
开源

配置缓存以加速查询

Loki 支持两种类型的缓存:查询结果缓存和块缓存,以提高查询性能并减少对存储层的调用。Loki Helm Chart 中包含了 Memcached,并且默认启用了 chunksCacheresultsCache。本节介绍建议的 Memcached 配置,以启用块和查询结果的缓存。

结果缓存

结果缓存存储 index-stat、instant-metric、label 和 volume 查询的结果,并支持日志查询的负缓存。在某些配置中,它有时被称为前端缓存。有关每种支持的请求类型的详细信息,请参阅组件部分。查询前端会查询结果缓存,以便在后续查询中使用。如果缓存结果不完整,查询前端会计算所需的子查询并将其发送给查询器执行,然后也缓存这些结果。为了协调上述所有过程,结果缓存使用计算并存储在标头中的查询哈希作为键。

索引查找缓存仅支持旧版 BoltDB 索引存储,并且默认配置为内存缓存。由于迁移到 TSDB 索引,现在使用附加磁盘/持久卷作为缓存,内存索引查找缓存已弃用。

块缓存

块使用 chunkRef 作为缓存键进行缓存,chunkRef 是 Loki ingesters 中块生成时的唯一引用。每次计算一组 chunkRef 以服务查询时,查询器都会在访问存储层之前查询块缓存。

查询结果比块小得多。随着 Loki 集群摄取量的增加,结果缓存可以继续发挥作用,而块缓存需要按比例增加内存需求。为了能够支持集群不断增长的需求,我们在 2023 年引入了对 memcached-extstore 的支持。Extstore 是 Memcached 的一个附加功能,它支持将 SSD 磁盘附加到 Memcached Pod 以最大限度地提高其容量。

请参阅这篇博客文章,了解 Grafana Cloud(我们的 SaaS 产品)在使用 memcached-extstore 方面的经验。有关如何调整 memcached-extstore 的更多信息,请查阅开源 memcached 文档

开始之前

  • 建议将不同类型的 Memcached 作为单独的组件部署(memcached_frontendmemcached_chunks)。
  • 截至 2025-02-06,建议使用 memcached:1.6.32-alpine 版本的库。
  • 请查阅 Loki ksonnet memcached 部署和 ksonnet memcached 库
  • TSDB 索引格式不需要索引缓存。
  • 有关扩展缓存的建议,请参阅集群规模调整页面。

步骤

启用和配置 Memcached

  1. 部署每个 Memcached 服务至少包含三个副本,并按如下方式配置每个服务

    1. 块缓存
      --memory-limit=4096 --max-item-size=2m --conn-limit=1024
    2. 查询结果缓存
      --memory-limit=1024 --max-item-size=5m --conn-limit=1024
  2. 配置 Loki 使用缓存。

    1. 如果使用 Helm Chart

      memcached.chunk_cache.host 设置为块缓存的 Memcached 地址,将 memcached.results_cache.host 设置为查询结果缓存的 Memcached 地址,并将 memcached.chunk_cache.enabledmemcached.results_cache.enabled 设置为 true。

      确保 Memcached 的连接限制至少为 number_of_clients * max_idle_conns

      hostservice 选项取决于安装类型。例如,使用 bitnami/memcached Helm Chart 并执行以下命令时,service 值始终为 memcached

      helm upgrade --install chunk-cache -n loki bitnami/memcached -f memcached-overrides-chunk.yaml
      helm upgrade --install results-cache -n loki bitnami/memcached -f memcached-overrides-results.yaml

      当前的 Helm Chart 仅支持块缓存和结果缓存。

      在这种情况下,Loki 配置如下

      yaml
      loki:
        memcached:
          chunk_cache:
            enabled: true
            host: chunk-cache-memcached.loki.svc
            service: memcached-client
            batch_size: 256
            parallelism: 10
          results_cache:
            enabled: true
            host: results-cache-memcached.loki.svc
            service: memcached-client
            default_validity: 12h
    2. 如果使用 Loki 配置文件,请修改 Loki 配置文件中的以下两个部分。

      1. 配置块缓存
        yaml
        chunk_store_config:
          chunk_cache_config:
            memcached:
              batch_size: 256
              parallelism: 10
            memcached_client:
              host: <chunk cache memcached host>
              service: <port name of memcached service>
      2. 配置查询结果缓存
        yaml
        query_range:
          cache_results: true
          results_cache:
            cache:
              memcached_client:
                consistent_hash: true
                host: <memcached host>
                service: <port name of memcached service>
                max_idle_conns: 16
                timeout: 200ms
                update_interval: 1m