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 节点集群中的分布情况:
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 策略,实现日志存储的标准化运维。