Elasticsearch 使用 reindex 快速修改生产环境索引 mapping
前言
正常情况下,在使用 elasticsearch 之前就应该把 mapping 指定写好。但特殊情况下,索引的 mapping 必须修改,比如一开始指定的 mapping 不合理,或者当有程序意外将原先 mapping 污染的时候等等。
现生产环境有一个索引 order mapping 因为业务规则更改而必须修改,但是索引中已经存在几个 G 的数据,如果删除索引重新创建 mapping 再重新导入数据太耗时(实测速度大概是bulk导入数据的5-10倍),所以采用 ES reindex 和 alias 的方式来操作。
建议在没有操作 es 目标索引的窗口期执行(我们的这个 es 索引是通过 canal 监听 binlog 同步到 es 的,并且我在配置中心里设置了canal client 端是否消费 canal 服务端 binlog 的开关,这里直接在窗口期将此开关关闭,待操作完成后再打开开关,自动消费堆积的 binlog 即可,不影响数据库与 es 数据一致性)
步骤
- 创建新的订单索引 order-v2,并为其创建新的正确的 mapping。
- 使用 reindex 将索引 order 数据迁移到 order-v2 上。
1 | POST _reindex |
- 控制台 删除原先 order 索引。
- 控制台 将 order-v2 索引命名别名 “order” , 或者 使用 restful 请求将 3,4 步骤合并:
1 | POST _aliases |
操作完成。
优点
使用 reindex 和 alias 可以让数据平滑迁移,不需要修改代码且用户无感知。
当我们对 es 进行了扩容,原先索引创建的分片、副本不足,导致数据入库、查询较慢,需要扩大 es 的分片、副本数量时,也可以用 ES Reindex。
- Title: Elasticsearch 使用 reindex 快速修改生产环境索引 mapping
- Author: 薛定谔的汪
- Created at : 2019-11-30 19:44:48
- Updated at : 2023-11-17 19:37:37
- Link: https://www.zhengyk.cn/2019/11/30/elasticsearch/es-reindex/
- License: This work is licensed under CC BY-NC-SA 4.0.