4. 日志存储与索引:Elasticsearch 基础概念、索引生命周期管理、分片与副本策略

Elasticsearch 是日志检索系统的核心存储与检索引擎。本章聚焦其基础数据模型、索引生命周期管理(ILM)以及分片与副本策略,帮助学员理解如何高效、可靠地存储海量日志数据。

4.1 Elasticsearch 基础概念

在配置日志存储前,必须掌握以下核心概念:

概念 说明 日志场景中的角色
索引(Index) 具有相似特征的文档集合,类似关系数据库中的“表”。 每个日志来源(如 syslog、应用日志)对应一个独立索引。
文档(Document) 索引中的基本数据单元,以 JSON 格式存储。 每一条日志记录就是一个文档。
映射(Mapping) 定义文档中字段的数据类型与分词规则。 确保时间戳、IP、错误码等字段被正确解析。
节点(Node) 集群中的单个 Elasticsearch 实例。 承担数据存储、索引、搜索任务。
集群(Cluster) 一组节点的集合,共同持有全部数据并提供联合索引与搜索能力。 日志系统的高可用与横向扩展基础。
实践提示: 在日志场景中,建议按日期或日志类型创建索引(如 syslog-2025-04-01),便于后续按时间范围检索与生命周期管理。

4.2 索引生命周期管理(ILM)

日志数据具有明显的时效性:近期日志需要频繁检索,历史日志则逐渐冷门。ILM 提供自动化策略,让索引在不同阶段自动迁移到不同存储层,并最终删除。

4.2.1 ILM 四个阶段

阶段 动作 存储介质示例 典型保留时间
Hot 持续写入与高频查询 SSD 热节点 最近 7 天
Warm 只读,偶尔查询 HDD 温节点 7 ~ 30 天
Cold 只读,极少查询,可压缩 冷节点 / 对象存储 30 ~ 90 天
Delete 删除索引释放空间 — 超过 90 天

4.2.2 ILM 策略配置示例

PUT _ilm/policy/log_retention_policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_size": "50GB",
            "max_age": "1d"
          }
        }
      },
      "warm": {
        "min_age": "7d",
        "actions": {
          "allocate": {
            "require": {
              "data_type": "warm"
            }
          },
          "forcemerge": {
            "max_num_segments": 1
          }
        }
      },
      "cold": {
        "min_age": "30d",
        "actions": {
          "allocate": {
            "require": {
              "data_type": "cold"
            }
          }
        }
      },
      "delete": {
        "min_age": "90d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}
注意: ILM 策略必须与索引模板配合使用。在索引模板中指定 "index.lifecycle.name": "log_retention_policy",新创建的索引才会自动绑定该策略。

4.3 分片与副本策略

分片(Shard)是 Elasticsearch 实现分布式存储与并行查询的核心机制。副本(Replica)则提供数据冗余与查询吞吐扩展。

4.3.1 分片与副本核心概念

概念 定义 日志场景建议
主分片(Primary Shard) 索引被切分成的不可变数据块,每个分片是一个完整的 Lucene 索引。 主分片数在索引创建后不可修改,建议按节点数 × 1~3 设置。
副本分片(Replica Shard) 主分片的完整拷贝,用于故障切换与分担查询压力。 至少 1 个副本,生产环境建议 1~2 个。
分片分配 Elasticsearch 自动将分片均匀分布到集群各节点。 确保节点数 ≥ 副本数 + 1,避免单点故障。

4.3.2 分片与副本关系示意图

下图展示了一个索引(3 个主分片,每个主分片 1 个副本)在 3 节点集群中的分布情况:

分片与副本分布示意图 索引分片与副本分布(3 节点 / 3 主分片 / 1 副本) Node 1 主分片 P0 (日志 2025-04-01 段 A) 副本 R1 (主分片 P1 的副本) Node 2 主分片 P1 (日志 2025-04-01 段 B) 副本 R2 (主分片 P2 的副本) Node 3 主分片 P2 (日志 2025-04-01 段 C) 副本 R0 (主分片 P0 的副本) 主分片 副本分片 副本同步关系

4.3.3 分片与副本配置建议

  • 主分片数: 建议按集群节点数的 1~3 倍设置。例如 5 节点集群,主分片数设为 5~15。避免过多分片导致管理开销过大。
  • 副本数: 生产环境至少 1 个副本。如果查询压力大,可增加到 2 个副本以提升查询吞吐。
  • 分片大小: 单个分片建议控制在 10GB ~ 50GB。日志场景下,可通过 ILM rollover 按大小或时间滚动索引。
  • 节点数: 必须满足 节点数 ≥ 副本数 + 1,否则副本无法完整分配。
关键公式: 集群总可用分片数 = 主分片数 × (副本数 + 1)。例如 3 主分片、1 副本,总可用分片数为 6,分布在 3 个节点上,每个节点承载 2 个分片。

4.4 日志索引模板配置

结合 ILM 与分片策略,通过索引模板实现自动化配置:

PUT _index_template/logs_template
{
  "index_patterns": ["syslog-*", "applog-*"],
  "template": {
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 1,
      "index.lifecycle.name": "log_retention_policy",
      "index.lifecycle.rollover_alias": "logs-write"
    },
    "mappings": {
      "properties": {
        "@timestamp": { "type": "date" },
        "host":       { "type": "keyword" },
        "severity":   { "type": "keyword" },
        "message":    { "type": "text" },
        "source_ip":  { "type": "ip" }
      }
    }
  },
  "priority": 100
}

该模板确保所有匹配 syslog-* 或 applog-* 的索引自动获得 3 主分片、1 副本,并绑定 ILM 策略与 rollover 别名。

4.5 本章小结

  • Elasticsearch 以索引、文档、映射为基本数据模型,日志场景需按时间或来源组织索引。
  • ILM 实现 Hot → Warm → Cold → Delete 的自动化生命周期管理,降低存储成本。
  • 分片决定数据的分布式存储粒度,副本提供高可用与查询扩展能力。
  • 通过索引模板统一管理分片数、副本数与 ILM 策略,实现日志存储的标准化运维。