重建后把 orders 别名从 orders_v1 切到 orders_v2,读请求走新索引,新写入的文档在 orders_v1 还能查到,orders_v2 一直是 0。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

POST _aliases
{"actions": [{"remove": {"index": "orders_v1", "alias": "orders"}},
{"add": {"index": "orders_v2", "alias": "orders", "is_write_index": true}}]}

一个别名指向多个索引时,必须有一个标了 is_write_index,写入才会落到它上面。切换时只做 remove 加 add,没给新索引打写入标记,写入就落到还挂着别名的旧索引。读请求同时查两个索引,看着像新数据没生效。这一点先确认清楚,后面就不用反复试。

碰到「索引别名切换」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

具体做法是,用一次 aliases 请求原子完成 remove 和 add;add 时带上 is_write_index true 明确写入目标;确认旧索引已经从别名摘掉 而不是只把新索引加上;切完看 _cat/aliases 的写入标记。

改完照着核一遍,_cat/aliases 里 orders 只指向 v2 且带 * 标记,新写入的文档在 v2 能查到。

作者 9823189