菜单
开源

日志保留

Grafana Loki 中的保留通过 Compactor 实现。默认情况下未设置 compactor.retention-enabled 标志,因此发送到 Loki 的日志会永久保留。

注意

如果您在对象存储上配置了生命周期策略,请确保其时长长于保留期限。

Compactor 还支持按租户或按流级别应用细粒度保留策略。

注意

Compactor 不支持对旧式索引类型进行保留。在使用旧式索引类型时,请使用Table Manager。Table Manager 和旧式索引类型均已弃用,并可能在 Loki 的未来主要版本中移除。

Compactor

Compactor 负责索引文件的压缩和日志保留的实施。

注意

将 Compactor 作为单例运行(一个实例)。

Compactor 循环在每个 compactor.compaction-interval 间隔应用压缩和保留,如果落后则尽快应用。压缩和保留都是幂等的。如果 Compactor 重启,它将从上次中断的地方继续。

Compactor 应用保留的算法如下:

  • 对于每一天或每个表(每个表对应一天,索引周期为 24 小时)
    • 将表中的多个索引文件压缩成每个租户一个索引文件。压缩结果是每个租户每天一个索引文件。
    • 遍历每个租户的索引。使用租户配置识别需要移除的 chunk。
    • 从索引中移除对匹配 chunk 的引用,并将 chunk 引用添加到磁盘上的标记文件。
    • 上传新的修改后的索引文件。

在对索引应用保留算法时,chunk 并不会被删除。它们由 sweeper 进程异步删除,此延迟可通过设置 -compactor.retention-delete-delay 进行配置。标记文件用于跟踪待删除的 chunk。

出于以下原因,chunk 不能立即删除:

  • Index Gateway 下载索引文件的副本以服务查询,并定期刷新它们。设置延迟允许 Index Gateway 拉取修改后的索引文件,这些文件将不包含对标记删除的 chunk 的任何引用。如果没有延迟,Gateway 上过时的索引文件可能会引用已删除的 chunk,从而导致查询失败。

  • 它提供了一个短暂的时间窗口,以便在配置错误时取消 chunk 删除。

标记文件应存储在持久磁盘上,以确保即使 Compactor 进程重启,待删除的 chunk 也能被处理。

注意

Grafana Labs 建议将 Compactor 作为有状态部署运行(使用 Kubernetes 时为 StatefulSet),并使用持久存储来存储标记文件。

保留配置

此 Compactor 配置示例激活保留功能。

yaml
compactor:
  working_directory: /data/retention
  compaction_interval: 10m
  retention_enabled: true
  retention_delete_delay: 2h
  retention_delete_worker_count: 150
  delete_request_store: gcs
schema_config:
    configs:
      - from: "2020-07-31"
        index:
            period: 24h
            prefix: index_
        object_store: gcs
        schema: v13
        store: tsdb
storage_config:
    tsdb_shipper:
        active_index_directory: /data/index
        cache_location: /data/index_cache
    gcs:
        bucket_name: loki

注意

仅当索引周期为 24 小时时,保留功能才可用。单存储 TSDB 和单存储 BoltDB 需要 24 小时索引周期。

retention_enabled 应设置为 true。否则,Compactor 只会压缩表。

delete_request_store 应设置为配置删除请求的存储。启用保留时必须设置此项。

working_directory 是用于保存标记的 chunk 和临时表的目录。

compaction_interval 指定应用压缩和/或保留的频率。如果 Compactor 落后,则尽快进行压缩和/或保留。

retention_delete_delay 是 Compactor 删除标记的 chunk 之前的延迟。

retention_delete_worker_count 指定实例化用于删除 chunk 的 goroutine worker 的最大数量。

配置保留期限

保留期限在 limits_config 配置部分进行配置。

设置保留策略有两种方式

  • retention_period 应用于所有日志流的全局保留期限。
  • retention_stream 仅应用于匹配选择器的日志流。

注意

最小保留期限为 24 小时。

此示例配置了应用于所有租户的全局保留(除非通过配置每个租户的覆盖进行覆盖)

yaml
...
limits_config:
  retention_period: 744h
  retention_stream:
  - selector: '{namespace="dev"}'
    priority: 1
    period: 24h
  per_tenant_override_config: /etc/overrides.yaml
...

注意

您只能在 retention_stream 定义的 selector 字段中使用标签匹配器。不支持任意 LogQL 表达式。

可以通过配置运行时覆盖来定义每个租户的保留。例如

yaml
overrides:
    "29":
        retention_period: 168h
        retention_stream:
        - selector: '{namespace="prod"}'
          priority: 2
          period: 336h
        - selector: '{container="loki"}'
          priority: 1
          period: 72h
    "30":
        retention_stream:
        - selector: '{container="nginx", level="debug"}'
          priority: 1
          period: 24h

给定流的保留期限根据此列表中的第一个匹配项决定

  1. 如果多个每个租户的 retention_stream 选择器匹配该流,则选择优先级最高的保留期限。
  2. 如果多个全局 retention_stream 选择器匹配该流,则选择优先级最高的保留期限。如果设置了每个租户的 retention_stream,则不考虑此值。
  3. 如果指定了每个租户的 retention_period,则将应用它。
  4. 如果没有匹配上述任何规则,将应用全局 retention_period
  5. 如果未指定全局 retention_period,则使用默认值 744h (30 天) 保留。

注意

优先级值越大,优先级越高。

流匹配使用与 Prometheus 标签匹配相同的语法

  • =: 选择与提供的字符串完全相等的标签。
  • !=: 选择与提供的字符串不相等的标签。
  • =~: 选择与提供的字符串正则表达式匹配的标签。
  • !~: 选择与提供的字符串正则表达式不匹配的标签。

上面定义的示例配置将导致以下保留期限

  • 对于租户 29
    • 具有命名空间标签 prod 的流将有 336h (2 周) 的保留期限,即使容器标签是 loki,因为 prod 规则的优先级更高。
    • 具有容器标签 loki 但不在命名空间 prod 中的流将有 72h 的保留期限。
    • 对于此租户中的其余流,将应用每个租户覆盖的 retention_period168h
  • 对于租户 30
    • 具有标签 nginx 和级别 debug 的流将有 24h 的保留期限。
    • 对于此租户中的其余流,将应用全局保留期限 744h,因为没有指定覆盖。
  • 2930 外的所有租户
    • 具有命名空间标签 dev 的流将有 24h 的保留期限。
    • 除具有命名空间标签 dev 的流外,其他流将有 744h 的保留期限。

表管理器(已弃用)

通过表管理器实现的保留依赖于对象存储 TTL 功能,并且适用于boltdb-shipper 存储以及 chunk/索引存储。

为了启用保留支持,需要配置表管理器以启用删除和保留期限。请参阅 Loki 配置参考的table_manager 部分,了解所有可用选项。另外,可以使用 table-manager.retention-periodtable-manager.retention-deletes-enabled 命令行标志。提供的保留期限需要是一个字符串表示的持续时间,可以使用 Prometheus 通用模型 ParseDuration 进行解析。示例:7d, 1w, 168h

警告

保留期限必须是period_config 块中配置的索引和 chunk 表 period 的倍数。更多信息请参阅表管理器文档。

注意

为避免查询超出保留期限的数据,limits_config 中的 max_query_lookback 配置必须设置为小于或等于 table_manager.retention_period 中设置的值。

使用 S3 或 GCS 时,存储 chunk 的 bucket 需要正确设置过期策略。更多详细信息请查阅S3 文档GCS 文档

如果您必须删除已摄取的日志,可以在对象存储中删除旧的 chunk。但请注意,这只会删除日志内容并保留标签索引不变;您仍然可以看到相关的标签,但无法检索已删除的日志内容。

有关表管理器内部机制的更多详细信息,请参阅表管理器文档。

另外,如果为索引存储配置了 BoltDB Shipper,您可以启用日志条目删除来删除特定流的日志条目。

配置示例

使用 GCS 并设置 28 天保留期的配置示例

yaml
schema_config:
  configs:
  - from: 2018-04-15
    store: tsdb
    object_store: gcs
    schema: v13
    index:
      prefix: loki_index_
      period: 24h

storage_config:
  tsdb_shipper:
    active_index_directory: /loki/index
    cache_location: /loki/index_cache
  gcs:
    bucket_name: GCS_BUCKET_NAME

limits_config:
  max_query_lookback: 672h # 28 days
  retention_period: 672h   # 28 days

compactor:
  working_directory: /data/retention
  delete_request_store: gcs
  retention_enabled: true