滚动索引解决什么
rollover 的作用是把一个写别名从当前索引切换到新的递增编号索引上。日志、指标这类持续写入的数据如果永远只往一个索引写,分片会一路膨胀到无法迁移、无法恢复的地步;滚动让每个索引只承载一段时间的量,之后可以按整个索引删除、归档或缩容,配合 ILM 形成热温冷的分层管理。
基本信息
| 接口 | POST /<写别名>/_rollover,不带条件时无条件滚动 |
|---|---|
| 索引命名 | 必须形如 logs-000001,最后一段是补零的六位序号 |
| 别名要求 | 写别名需 is_write_index: true 指向当前写索引 |
| 触发条件 | max_age / max_docs / max_primary_shard_size / max_size 任一满足即滚动 |
| 自动化 | ILM 的 rollover 动作调用同一接口,不建议两套机制同时管一个别名 |
典型使用场景
- 日志与指标按期切分:每周或每达到体积上限就滚出一个新索引
- 配合 ILM 做生命周期:热节点高配、冷节点降配、到期整索引删除
- 控制单分片体积,让分片维持在便于迁移与恢复的量级
- 版本升级后需要立即启用新 mapping 时手动滚动一次
- 滚动后对已封存索引做 force merge 与 shrink,降低段数与分片数
完整滚动流程
完整滚动流程
# 1. 建初始索引,尖括号花括号是日期数学语法,curl 下必须百分号编码
PUT /%3Clogs-%7Bnow%2Fd%7D-000001%3E
{"aliases":{"logs-write":{"is_write_index":true}}}
# 2. 写入侧只认别名,不写具体索引名,由 ES 自动生成 _id
POST /logs-write/_doc
{"msg":"hello"}
# 3. 条件满足任一即滚动,返回新旧索引名与 rolled_over 标志
POST /logs-write/_rollover
{"conditions":{"max_age":"7d","max_primary_shard_size":"50gb"}}
# 4. 确认别名当前指向哪个索引
GET /_cat/aliases/logs-write?v返回字段读法
| 字段 | 含义 | 注意 |
|---|---|---|
| acknowledged | 请求是否被集群接受 | false 时看错误信息而不是重试 |
| old_index | 滚动前的写索引名 | 用于确认滚的是不是预期索引 |
| new_index | 滚动后新的写索引名 | 编号自动递增一位 |
| rolled_over | true 表示确实发生了滚动 | 条件未满足时为 false,属正常结果而非失败 |
| shards_acknowledged | 新索引分片是否已就绪 | false 说明分片还在分配中 |
索引名里的尖括号与花括号属于日期数学语法,直接在 shell 或 HTTP 客户端里使用会因路径解析失败而报错,必须写成 %3C %3E %7B %7D;用 Kibana 控制台则可以原样书写。