3. 日志存储与管理:存储选型、生命周期与冷热分层

日志存哪儿、存多久、怎么管,是审计日志落地时最容易被低估的环节。我见过不少团队,前期把精力全扑在采集和告警上,结果三个月后存储爆了,查个历史日志要等半小时。说白了,存储选型不是技术炫技,是成本与查询效率的平衡。

3.1 存储选型:三大主流方案怎么挑?

目前业界主流的审计日志存储方案,基本就是 Elasticsearch、S3 和 HDFS 三足鼎立。它们各有各的脾气,选错了后面会很痛苦。

特性 Elasticsearch S3(对象存储) HDFS
查询能力 全文检索、聚合分析、实时 弱,需配合 Athena 等 弱,需配合 Hive/Spark
写入吞吐 中等,受分片数限制 极高,可无限扩展 高,适合批量写入
存储成本 高(副本+索引开销) 低(按量付费) 中等(依赖本地盘)
适用场景 近实时检索、安全分析 长期归档、冷数据 离线批处理、数仓

我的建议:不要只用一种存储。我习惯用 Elasticsearch 存最近 30 天的热数据,S3 存 30 天到 1 年的温数据,超过 1 年的冷数据丢到 HDFS 或 Glacier。这叫「分层存储」,后面会细讲。

3.2 生命周期管理:日志不是越久越好

审计日志有合规要求,但合规不等于无限保留。PCI DSS 要求保留 1 年,SOC 2 要求 6 个月,GDPR 甚至要求某些数据到期必须删除。你想想看,如果所有日志都存 3 年,Elasticsearch 集群早就撑爆了。

我建议按以下策略管理生命周期:

  • 热数据(0-7 天): 保留在 Elasticsearch,SSD 存储,副本数 2,用于实时告警和调查。
  • 温数据(7-90 天): 迁移到 Elasticsearch 冷节点或 S3 Standard,HDD 存储,副本数 1,用于月度审计。
  • 冷数据(90 天 - 1 年): 归档到 S3 Glacier 或 HDFS,压缩存储,查询时需解冻。
  • 过期数据(超过保留期): 彻底删除,避免合规风险。

避坑指南:我曾经遇到一个客户,把所有日志都塞进 Elasticsearch,结果 6 个月后集群挂了。后来我们加了 ILM(Index Lifecycle Management)策略,自动把 7 天前的索引迁移到冷节点,集群才稳定下来。记住,ILM 是你的好朋友。

3.3 冷热分层架构:一张图看懂

冷热分层不是新概念,但在审计日志场景下特别实用。下面这张图展示了我常用的分层架构:

审计日志冷热分层架构图 审计日志冷热分层存储架构 日志采集层 热层:Elasticsearch SSD · 副本2 · 保留7天 温层:S3 Standard HDD · 副本1 · 保留90天 冷层:S3 Glacier / HDFS 压缩归档 · 保留1年+ 自动迁移策略 ILM 策略 S3 Lifecycle 定时任务

这个架构的核心思路是:数据自动流动,查询按需取用。热层负责快速写入和实时查询,温层做月度审计,冷层只用于合规归档。你不需要手动搬数据,ILM 和 S3 Lifecycle 策略会自动处理。

3.4 数据保留策略:合规与成本的博弈

保留策略不是拍脑袋定的。我一般会先问三个问题:

  1. 合规要求是什么? 金融行业通常要求保留 3-7 年,互联网公司可能只要 6 个月。
  2. 查询频率有多高? 如果每月只查一次,没必要放热层。
  3. 预算有多少? Elasticsearch 的存储成本是 S3 的 5-10 倍。

注意:不要为了省钱把所有日志都压缩归档。我曾经有个项目,为了省成本把 3 个月的日志全丢到 S3 Glacier,结果安全事件发生时,解冻数据花了 12 小时,错过了黄金响应时间。热数据一定要保留足够窗口。

下面是我常用的保留策略模板,你可以根据实际情况调整:

数据层级 存储介质 保留时长 查询延迟 月成本(1TB)
热 Elasticsearch SSD 7 天 < 1 秒 ~$300
温 S3 Standard 90 天 几秒 ~$25
冷 S3 Glacier Deep Archive 1 年+ 12 小时 ~$1

我的习惯:在 Elasticsearch 里用 ILM 策略,设置 rollover 条件(比如 50GB 或 7 天),自动创建新索引并迁移旧索引。在 S3 上配置 Lifecycle 规则,30 天后自动转为 Standard-IA,90 天后转为 Glacier。这样基本不用人工干预。

3.5 实战:Elasticsearch ILM 配置示例

光说不练假把式。下面是我在一个金融项目中用过的 ILM 策略,你可以直接参考:

PUT _ilm/policy/audit_log_policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_size": "50GB",
            "max_age": "7d"
          },
          "set_priority": {
            "priority": 100
          }
        }
      },
      "warm": {
        "min_age": "7d",
        "actions": {
          "shrink": {
            "number_of_shards": 1
          },
          "forcemerge": {
            "max_num_segments": 1
          },
          "set_priority": {
            "priority": 50
          }
        }
      },
      "cold": {
        "min_age": "30d",
        "actions": {
          "freeze": {},
          "set_priority": {
            "priority": 0
          }
        }
      },
      "delete": {
        "min_age": "90d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

这个策略的意思是:索引在热节点存 7 天或 50GB,然后自动滚到温节点,30 天后冻结为冷索引,90 天后自动删除。你只需要在索引模板里引用这个策略就行。

核心要点:存储选型没有银弹。Elasticsearch 适合查询,S3 适合归档,HDFS 适合批处理。把它们组合起来,用生命周期策略自动管理,你就能在合规、成本和查询效率之间找到最佳平衡点。