如何设置 Loki 保留 30 天并自动清理?

解读

面试官把“CouchDB 岗位”与“Loki 保留策略”放在一起,并不是在考 Loki 本身,而是在验证候选人是否具备“跨系统日志生命周期治理”的实战能力。国内互联网、金融、政企场景下,CouchDB 集群往往以容器或裸金属形态部署在阿里云、腾讯云、华为云或私有 KVM 池,日志统一接入 Loki + Grafana 做可观测性。能否用最小权限、最小资源、最小风险完成“30 天自动清理”,直接体现你对存储成本、合规审计、集群稳定性的平衡能力。回答时务必把“配置项—验证手段—回滚方案”三步讲全,让面试官听到你可落地的 SRE 思维

知识点

  1. Loki 存储模型:Index(BoltDB/Shipper、TSDB)+ Chunk(对象存储或文件系统),保留策略必须两端同步。
  2. compactor 组件:唯一具备“全局删除”能力的单实例角色,必须启用 retention_enabled=true,否则无论配置多久都不会物理删除。
  3. 保留粒度table_manager 模式(老版本)与 compactor 模式(2.9+ 推荐)二选一;国内云原生团队 2024 年后基本统一后者。
  4. 时间单位:Loki 内部全部按小时维度截断,30 天需写成 720h,写 30d 会被直接拒绝。
  5. 合规红线:金融、证券、医疗客户常要求“删除前 24 h 只读镜像”,需要额外设置 retention_delete_delay=24h。
  6. 验证命令:logcli query ‘{job=“couchdb”}’ –since=720h –limit=1 若返回空且对象存储 720h 之前前缀消失,证明清理成功。
  7. 回滚手段:一旦误删,CouchDB 业务日志无法再生,必须提前对 compactor 做快照盘级备份对象存储版本控制

答案

生产级落地分三步,全部配置放在单独 ConfigMap 并走 GitOps 审批流,确保可审计。

第一步:启用 compactor 保留
在 loki.yaml 的 compactor 段写入

compactor:
  retention_enabled: true        # 物理删除开关,**默认 false**
  retention_delete_delay: 2h     # 国内常规 2 小时缓冲
  retention_table_timeout: 600s  # 大表删除超时
  working_directory: /loki/compactor

并保证 compactor 以单副本 Deployment 运行,反亲和性避开其他组件。

第二步:设置全局保留 30 天
同一配置文件续写

limits_config:
  retention_period: 720h         # **必须带 h 单位,30d 非法**
  max_query_lookback: 720h       # 防止用户查到已删数据
  max_query_length: 720h

若按租户划分,可在 runtime-config.yaml 里对 CouchDB namespace 单独写

overrides:
  couchdb:
    retention_period: 720h

第三步:验证与监控

  1. 上线后立刻执行
    logcli query ‘{job=“couchdb”}’ –since=720h –limit=1
    预期返回空;若有结果,说明保留未生效。
  2. 在 Grafana 增加告警:
    increase(loki_compactor_deleted_chunks_total[5m]) < 1 连续 1 h 为 0 即触发,防止 compactor 僵死。
  3. 每周抽样核对对象存储 720h 之前前缀是否归零,零则合规

完成以上三步即可实现30 天自动清理,且满足国内等保、ISO27001 对日志生命周期的审查要求。

拓展思考

  1. 成本优化:CouchDB 日志量大但价值密度低,可再降采样:Loki 2.9 支持多租户 + 不同 retention_period,把 trace 级日志保留 7 天,错误日志保留 30 天,预计存储费用下降 55%
  2. 多云容灾:若使用阿里云 OSS+华为云 OBS 双写,compactor 只能删一方,需自建幂等删除队列(Kafka topic),保证两边最终一致。
  3. 法律冻结:国内法院调查令常要求指定 instance 日志延长保留 90 天,可在 runtime-config 对该 instance 临时写 retention_period: 2160h,秒级热更新无需重启
  4. 与 CouchDB 自身 purge 联动:CouchDB 的 _purge 操作也会生成审计日志,可给这类日志打标 {audit=“purge”},单独保留 180 天,实现数据库与日志系统生命周期对齐