首页/数据/NoSQL 速查/_rollover 滚动新索引
Elasticsearch89 条

_rollover 滚动新索引

rollover 在别名指向的写索引满足条件(最大年龄、主分片体积、文档数)时创建递增编号的新索引并把写别名切过去;索引名要符合 -数字 后缀规范。

NoSQL 速查数据更新于 2026-10-13

滚动索引解决什么

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_overtrue 表示确实发生了滚动条件未满足时为 false,属正常结果而非失败
shards_acknowledged新索引分片是否已就绪false 说明分片还在分配中
索引名里的尖括号与花括号属于日期数学语法,直接在 shell 或 HTTP 客户端里使用会因路径解析失败而报错,必须写成 %3C %3E %7B %7D;用 Kibana 控制台则可以原样书写。

易错点

  • 索引名最后一段必须是补零的六位序号,写成 logs-1 或 logs-2026-10-13 时滚动会直接报错
  • 别名没有设置 is_write_index: true,或同一个写别名同时指向多个索引,滚动都会失败
  • 滚动只切换写路径,旧索引不会自动关闭或删除,没有 ILM 接管时磁盘照样被占满
  • 滚动条件之间是「满足任一即滚动」,误以为要全部满足会导致索引比预期早切很多,分片数迅速膨胀

数据来源与参考

  • Elasticsearch Guide: Rollover API
  • Elasticsearch Guide: Date math in index names
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌