3.3 索引的生老病死:创建、设置、别名与删除


文档摘要

3.3 索引的生老病死:创建、设置、别名与删除 本节摘要:索引不只是"建了就用"的容器,它有完整的生命周期:创建时定静态参数,运行中调动态参数,扩容或改映射时借别名无缝切换,归档后可关闭或删除。本节把这些操作串成一条线,并完整演练一次零停机重建——它是"主分片数不可改、字段类型不可改"两大限制的标准出路,也是第 9 章容量规划的基本功。 索引的一生 前两节给索引填好了映射与分析器,这一节管容器本身。

3.3 索引的生老病死:创建、设置、别名与删除

本节摘要:索引不只是"建了就用"的容器,它有完整的生命周期:创建时定静态参数,运行中调动态参数,扩容或改映射时借别名无缝切换,归档后可关闭或删除。本节把这些操作串成一条线,并完整演练一次零停机重建——它是"主分片数不可改、字段类型不可改"两大限制的标准出路,也是第 9 章容量规划的基本功。

索引的一生

前两节给索引填好了映射与分析器,这一节管容器本身。一个索引从生到死要经历四个阶段,每个阶段都有对应的操作面:

阶段 操作 要点
出生 创建请求带 settings 与 mappings 静态参数此时定死,错过不再来
成长 动态设置随负载调整 副本数、刷新间隔可随时改
变形 新索引承接数据、别名切换 解决改类型与改分片数两大限制
退场 关闭省资源或彻底删除 关闭的分片不占内存只占磁盘

静态与动态的分界

创建之后哪些还能改、哪些不能?记一条分界线:凡与数据物理分布有关的都是静态的。主分片数决定文档路由(第 1 章的公式),分词器决定倒排结构,字段类型决定存储格式——它们都随数据一起落盘,改了就要重组,所以只能在创建时声明。副本数、刷新间隔、每个分片的副本数上限这些运行时参数则随时可调:

PUT tickets_v3/_settings { "number_of_replicas": 2, "refresh_interval": "5s" }

这条请求把副本加到 2(读流量上涨前的准备),刷新间隔放宽到 5 秒(写入高峰的常见减压手段——机制在 8.3 展开)。生效即刻,无需重启。

关闭与删除的差别

关闭一个索引,分片从内存里卸载,磁盘数据保留,随时可重新打开;删除则是物理清除,不可恢复。归档场景(三年前的工单)适合关闭:省内存、留数据、可秒开。确认无用再删除,删除前用索引统计接口核对文档数,给自己一次反悔的机会:

GET tickets_2023/_stats/docs # 确认文档数与预期一致 POST tickets_2023/_close # 关闭 内存卸载 POST tickets_2023/_open # 需要时重新打开

零停机重建:别名是主角

单数名词的索引用起来顺手,生产上却有个隐藏成本:一切"改分片数、改映射、改分析器"的需求都等价于重建。硬切必然停写,解法是让应用永远只面向别名(alias)——一个指向真实索引的软链接。

别名切换时间线

别名切换时间线

完整演练一遍,从给现有索引挂别名开始:

POST _aliases { "actions": [ { "add": { "index": "tickets_v3", "alias": "tickets" } } ] }

应用改造一次,从此读写都用 tickets。某天要把分片数从 3 提到 6、顺带换上 3.2 的自定义分析器,四步走:

PUT tickets_v4 { "settings": { "number_of_shards": 6, "number_of_replicas": 1 }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "reply_analyzer" }, "status": { "type": "keyword" } } } }
POST _reindex { "source": { "index": "tickets_v3" }, "dest": { "index": "tickets_v4" } }

数据搬完后,原子切换再拆除旧索引:

POST _aliases { "actions": [ { "remove": { "index": "tickets_v3", "alias": "tickets" } }, { "add": { "index": "tickets_v4", "alias": "tickets" } } ] }
DELETE tickets_v3 # 观察几天确认无误后删除

这次演练的解读与变式

解读:重建全程应用无感知,切换动作是集群状态的一次原子更新,不存在"别名悬空"的中间态。变式一:数据量太大、一次搬运太久时,用双写方案——新旧索引同时写,存量慢慢搬,搬完切别名、停双写。变式二:日志类数据按月建索引(名带年月后缀),用带过滤条件的别名把"最近三个月"聚成一个名字供查询,配合第 8 章的生命周期管理自动滚动与删除。变式三:搜索请求要求"主写索引优先",可以给别名设置索引属性 is_write_index,多个索引挂同一别名时指明写入落点。

⚠️ 常见坑:重建索引接口按批次拉取再写入,源索引写入不停时可能出现少量覆盖竞态。低峰期执行、或以时间戳字段为界只搬历史段,双写补最新增量,是工程上常见的兜底组合。

考核与自测

考核知识点清单

考核点 达标标准
静态动态分界 判断给定参数属于哪类,并说出判断依据
别名原子切换 写出同一请求内一删一挂的动作,解释为何不存在中间态
重建四步 按顺序说出建新、搬运、切别名、删旧与各自的校验点
关闭与删除 区分两者适用场景,写出删除前的核对动作
双写变式 说出数据量大或写入不停时的替代方案与取舍

易错点补充

  • 以为重建索引接口会搬设置与别名:它只搬文档,目标索引的映射、设置与别名都要提前建好。
  • 按天滚动的索引不配模板:新索引第一天就触发动态推断,映射漂移,第 3 章的纪律在滚动场景的第一课。
  • 切完别名立刻删旧索引:保留几天观察期给回滚留窗口,删除不可逆,核对文档数再动手。
  • 别名指向多个索引时写入无主:未指明写入索引,写请求会被拒绝,挂多索引的读别名要另配写入落点。
  • 重建期间忘了更新模板:新索引继承了旧模板里的过时设置,容量问题原样复制一遍,重建前先审设置再动手。

生命周期收口

  • 静态参数(分片数、映射、分析器)创建时定死;动态参数(副本、刷新间隔)随负载调整。
  • 关闭保留磁盘卸载内存,删除物理清除,归档与清理是两件事。
  • 别名是生产索引的标配:应用面向别名,重建与切换才有零停机可言。
  • 四步重建流程:建新、搬数、切别名、删旧,配合双写可覆盖持续写入的业务。

容器、登记表、剪刀都齐了。下一章文档正式上路:写入请求发出后,它如何被路由、被持久化、被并发世界温柔以待。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U