ElasticSearch必知必会-Reindex重建索引

时间:2022-06-29 00:56:56
作者: 京东物流 康睿

1.重建索引需求背景

1.1 集群版本升级

ES版本兼容性

  1. 同一大版本范围内升级,索引读写兼容
  2. 不同大版本升级,索引读写不兼容,需要重建索引

ElasticSearch必知必会-Reindex重建索引

1.2 集群迁移

集群索引迁移

  1. 集群迁移,索引服务不停机,数据提前迁移

1.3 索引分片数量调整

分片数量变更

  1. 原有分片数量太少,重建变多
  2. 原有分片数量太多,重建变少
  3. ES索引分片,一旦创建,原索引是不能修改分片数量的

ElasticSearch必知必会-Reindex重建索引

1.4 索引文档结构变更

文档结构变更

  1. 字段类型变更,已有索引字段类型是不可以修改的
  2. 字段属性变更,历史数据的字段属性是不会刷新的
  3. 文档对象结构变更

ElasticSearch必知必会-Reindex重建索引

2.常用重建索引方式

2.1 Reindex初识

索引重建说明

  1. 重建是创建新索引,原有索引保留
  2. 原有索引_source必须开启,否则找不到原始数据
  3. 索引重建建议,严格业务场景,目标索引mapping结构建议先创建好,不使用es动态推测字段类型的方式。
POST_reindex
{
"source": {
"index": "原始索引"
},
"dest": {
"index": "新目标索引"
}
}

2.2 Url参数解读

URL参数

  1. refresh,目标索引是否立即刷新
  2. waif\_for\_active_shards, 重建索引分片响应设置
  3. Scroll, 快照查询时间
  4. slicing, 重建并行任务切片
  5. Max_docs , 单次最大数据量,条数
  6. requests\_per\_second . 单次执行的重建文档数据量

2.3 Request body参数解读

请求参数

  1. confilicts, 索引数据冲突如何解决,直接覆盖还是中断
  2. source: 原索引配置信息
  3. dest,新索引配置信息
  4. script,脚本处理,修改原索引信息后再写入新索引

2.4 Response 参数解读

响应参数

  1. 成功数
  2. 更新数
  3. 新增数
  4. 失败数

2.5 重建索引任务管控

任务管控必要性

  1. 重建索引是一个异步任务,由ES后台进程完成调度执行,集群可能有并行其他异步任务,有时需要中断停止或查看进度

任务管控API

  1. _tasks,服务端API

3.高级索引重建方式

3.1 单秒数据量阈值控制

单秒数据量控制

  1. requests\_per\_second
  2. 默认1000,设置-1则不限制
  3. 生产重建时,建议控制范围500-1000左右
  4. 控制重建速度,防止集群瞬间IO过大

3.2人工切片

数据切片应用

  1. 人为指定切片数量,并行任务
  2. 用于降低索引redinx速度
POST_reindex
{
"source": {
"index": "my-index-000001",
"slice": {
"id": 0, // 执行下标,从0开始,即0切第一批数据做迁移,1切第二批数据做迁移
"max": 2 // 切分分片数
}
},
"dest": {
"index": "my-new-index-000001"
}
}

ElasticSearch必知必会-Reindex重建索引

3.3 自动切片

自动切片

  1. 仅需指定自动切片大小即可,后续的调度由es完成
POST_reindex?slices=5&refresh
{
"source": {
"index": "my-index-000001"
},
"dest": {
"index": "my-new-index-000001"
}
}

3.4 限制reindex重建数据的范围

3.4.1 query

限制查询条件

  1. 基于DEL语言规则编写,可以任意复杂,限制数据范围
POST_reindex
{
"source": {
"index": "my-index-000001",
"query": {
"term": {
"user.id": "kimchy"
}
}
},
"dest": {
"index": "my-new-index-000001"
}
}

3.4.2 max docs

限制数据条数

  1. 限制重建数据总条数,默认全部
POST_reindex
{
"max_docs": 1,
"source": {
"index": "my-index-000001"
},
"dest": {
"index": "my-new-index-000001"
}
}

3.5 多索引重建

多索引重建

  1. ES也支持将多个索引数据合并到一个索引里面去
  2. 若多个索引数据ID相同,则会相互覆盖
POST_reindex
{
"source": {
"index": ["my-index-000001", "my-index-000002"]
},
"dest": {
"index": "my-new-index-000002"
}
}

3.6 限制重建索引数据字段

限制重建索引数据字段

  1. source filter
  2. 原有数据字段过多,需要限制筛选部分进行重建
POST_reindex
{
"source": {
"index": "my-index-000001",
"_source": ["user.id", "_doc"]
},
"dest": {
"index": "my-new-index-000001"
}
}

3.7 字段重命名

字段名重命名

  1. 原有的数据字段名称不合理,重新按照新字段命名
  2. 基于脚本机制修改
  3. ES字段名称原始是不允许修改的,但通过脚本可以操作

3.8 修改原始文档数据

修改原始文档数据

  1. 基于脚本

4.跨集群索引重建

跨集群操作

  1. 基于集群通信,类同远程机制
  2. 需设置跨集群白名单,配置在dist集群

5.索引重建注意事项

5.1 数据量阈值控制

控制好索引重建速率,防止过快

5.2 索引访问交叉影响

建议先新建好dist索引