菜单
文档面包屑箭头 Grafana Loki面包屑箭头 管理面包屑箭头 自动流分片
开源

使用自动流分片管理大容量日志流

自动流分片可以通过向现有流添加新的标签和值来将流保持在 desired_rate 下。如果配置得当,这可以消除由于每流速率限制导致日志生产者被限速的问题。

启用自动流分片

  1. 编辑 Loki 配置文件中的全局 limits_config

    yaml
    limits_config:
      shard_streams:
          enabled: true
  2. 如果发现系统仍然达到 per_stream_rate_limit,可以选择降低字节单位的 desired_rate

    yaml
    limits_config:
      shard_streams:
        enabled: true
        desired_rate: 2097152 #2MiB
  3. 可以选择启用 logging_enabled 以调试流分片。

    注意

    这可能会影响 Loki 的摄取性能。

    yaml
    limits_config:
      shard_streams:
        enabled: true
        logging_enabled: true

何时使用自动流分片

大日志流给 Loki 带来了几个问题,主要是 Ingesters 和 Distributors 上资源使用增加且不均匀。一般的建议是探索现有日志流中是否有可用于查询且基数足够低的附加标签值。然而,在许多情况下,无法再提取更多标签,或者某个标签的基数非常大。为了保护自身免受此类容量导致的运行故障,Loki 实现了每流速率限制;但这导致一些数据丢失。每流限制还需要人工干预来更改,这在日志容量增加和减少时并不理想。

Loki 使用自动流分片来避免任何日志流的速率限制和大流,通过确保它接近配置的 desired_rate

自动流分片的工作原理

自动流分片通过向流添加一个新标签 __stream_shard__,并增加其值来努力将所有流保持在配置的 desired_rate 以下。

该功能为 Ingesters 添加了一个新的 API,用于报告所有现有日志流的大小。Distributors 每秒查询一次该 API,以获取系统中所有流速率的概况。Distributors 使用现有的流速率数据和配置的 desired_rate 来确定给定流应该有多少个分片。所需数量的新日志流会使用标签 __stream_shard__ 创建,日志会平均分配到这些流中。

由于自动流分片是反应式的,并且依赖于对 Ingesters 的连续调用,所以当前速率的视图总是有些滞后。因此,分片流的实际大小将始终高于 desired_rate。实际上,这仍然足以防止日志生产者受到每流速率限制的限速。

自动流分片指标

使用这些指标来帮助调整 Loki,使其能够足够积极地进行流分片,从而避免达到每流速率限制

  • loki_rate_store_refresh_failures_total: 分发器刷新流速率视图的失败尝试总次数。
  • loki_rate_store_streams: 所有 Ingesters 报告的唯一流数量。分片的流被报告为未分片。
  • loki_rate_store_max_stream_shards: 系统中任何租户的最大分片数量。
  • loki_rate_store_stream_shards: 所有流中分片计数的分布直方图。
  • loki_rate_store_max_stream_rate_bytes: 系统中任何租户的最大流大小,单位为字节/秒。分片的流被报告为未分片。
  • loki_rate_store_max_unique_stream_rate_bytes: 所有租户中任何流的最大大小。流分片被单独报告。
  • loki_rate_store_stream_rate_bytes: 所有租户中流大小分布的直方图,单位为字节/秒。
  • loki_stream_sharding_count: 流被分片的总次数。用于计算分片速率。