日志保留
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 配置示例激活保留功能。
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 小时。
此示例配置了应用于所有租户的全局保留(除非通过配置每个租户的覆盖进行覆盖)
...
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 表达式。
可以通过配置运行时覆盖来定义每个租户的保留。例如
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
给定流的保留期限根据此列表中的第一个匹配项决定
- 如果多个每个租户的
retention_stream
选择器匹配该流,则选择优先级最高的保留期限。 - 如果多个全局
retention_stream
选择器匹配该流,则选择优先级最高的保留期限。如果设置了每个租户的retention_stream
,则不考虑此值。 - 如果指定了每个租户的
retention_period
,则将应用它。 - 如果没有匹配上述任何规则,将应用全局
retention_period
。 - 如果未指定全局
retention_period
,则使用默认值744h
(30 天) 保留。
注意
优先级值越大,优先级越高。
流匹配使用与 Prometheus 标签匹配相同的语法
=
: 选择与提供的字符串完全相等的标签。!=
: 选择与提供的字符串不相等的标签。=~
: 选择与提供的字符串正则表达式匹配的标签。!~
: 选择与提供的字符串正则表达式不匹配的标签。
上面定义的示例配置将导致以下保留期限
- 对于租户
29
- 具有命名空间标签
prod
的流将有336h
(2 周) 的保留期限,即使容器标签是loki
,因为prod
规则的优先级更高。 - 具有容器标签
loki
但不在命名空间prod
中的流将有72h
的保留期限。 - 对于此租户中的其余流,将应用每个租户覆盖的
retention_period
值168h
。
- 具有命名空间标签
- 对于租户
30
- 具有标签
nginx
和级别debug
的流将有24h
的保留期限。 - 对于此租户中的其余流,将应用全局保留期限
744h
,因为没有指定覆盖。
- 具有标签
- 除
29
和30
外的所有租户- 具有命名空间标签
dev
的流将有24h
的保留期限。 - 除具有命名空间标签
dev
的流外,其他流将有744h
的保留期限。
- 具有命名空间标签
表管理器(已弃用)
通过表管理器实现的保留依赖于对象存储 TTL 功能,并且适用于boltdb-shipper 存储以及 chunk/索引存储。
为了启用保留支持,需要配置表管理器以启用删除和保留期限。请参阅 Loki 配置参考的table_manager
部分,了解所有可用选项。另外,可以使用 table-manager.retention-period
和 table-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 天保留期的配置示例
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