Elasticsearch 使用 reindex 快速修改生产环境索引 mapping

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 数据一致性)

步骤

  1. 创建新的订单索引 order-v2,并为其创建新的正确的 mapping。
  2. 使用 reindex 将索引 order 数据迁移到 order-v2 上。
1
2
3
4
5
6
7
8
9
10
POST _reindex
{
"source": {
"index": "order",
"size": 5000 // reindex batch size:根据数据量和机器性能,自己调整
},
"dest": {
"index": "order-v2"
}
}
  1. 控制台 删除原先 order 索引。
  2. 控制台 将 order-v2 索引命名别名 “order” , 或者 使用 restful 请求将 3,4 步骤合并:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST _aliases
{
"actions": [
{
"add": {
"index": "order-v2",
"alias": "order"
}
},
{
"remove_index": {
"index": "order"
}
}
]
}

操作完成。

优点

使用 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.
On this page
Elasticsearch 使用 reindex 快速修改生产环境索引 mapping