使用Reindex迁移Elasticsearch集群数据详解(下)

#作者:stackofumbrella

文章目录

使用Ingest Node

这个功能是最好用的,当source是因为不合理的结构,需要重新结构化所有的数据时,通过ingest node,可以很方便的在新的index中获得不一样的mapping和value

复制代码
POST _reindex
{
  "source": {
    "index": "source"
  },
  "dest": {
    "index": "dest",
    "pipeline": "some_ingest_pipeline"
  }
}

Reindex远程服务器的索引到本地

在本地目标Elasticsearch中需要在elasticsearch.yml中添加白名单设置,然后重启Elasticsearch服务

复制代码
reindex.remote.whitelist: ["elasticsearch.aliyuncs.com:9200"]
POST _reindex
{
  "source": {
    "remote": {
      "host": "http://remotehost:9200",
      "username": "elastic",
      "password": "password"
    },
    "index": "source",
    "query": {
      "match": {
        "test": "data"
      }
    }
  },
  "dest": {
    "index": "dest"
  }
}

默认的buffer的size是100M,在scroll size是1000的情况下,如果单个document的平均大小超过100K,则有可能会报错,因此遇到非常大的document需要减小batch的size

复制代码
POST _reindex
{
  "source": {
    "remote": {
      "host": "http://remotehost:9200"
    },
    "index": "source",
    "size": 100,
    "query": {
      "match": {
        "test": "data"
      }
    }
  },
  "dest": {
    "index": "dest"
  }
}

version_type用法

如果新的index中有数据,并且可能会发生冲突,这时可以设置"version_type": "internal",则Elasticsearch强制性的将文档转储到目标中,覆盖具有相同类型和id的任何内容

复制代码
POST _reindex
{
  "source": {
    "index": "old_index"
  },
  "dest": {
    "index": "new_index",
    "version_type": "internal"
  }
}

就像_update_by_query,reindex会生成源索引的快照,但它的目标必须是一个不同的索引,避免版本冲突,dest对象可以像index API一样进行配置,以乐观锁控制并发,Elasticsearch将会直接将文档转储到dest中,覆盖任何具有相同类型和id的document

复制代码
POST _reindex
{
  "source": {
    "index": "mm"
  },
  "dest": {
    "index": "new_mm",
    "version_type": "internal"
  }
}

如果把version_type设置为external,则Elasticsearch会从source读取version字段,当遇到具有相同类型和id的documents,只更新new version。简单来说,就是在reindex的时候,目标index可以不是一个新的index,而是有数据的,如果源index和目标index里面有相同类型和id的document,对于使用internal是直接覆盖,使用external的话,只有当source的version更加新的时候才更新。

POST _reindex

复制代码
{
  "source": {
    "index": "mm"
  },
  "dest": {
    "index": "mm",
    "version_type": "external"
  }
}

op_type用法

把op_type设置为create,只在目标index中添加不存在的document,如果相同的document已经存在,则会报version conflict的错误。

POST _reindex

复制代码
{
  "source": {
    "index": "mm"
  },
  "dest": {
    "index": "new_mm",
    "op_type": "create"
  }
}

conflicts用法

默认当发生version conflict的时候,_reindex会被abort,除非把conflict设置为"proceed"

复制代码
POST _reindex
{
  "conflicts": "proceed",
  "source": {
    "index": "mm"
  },
  "dest": {
    "index": "new_mm",
    "op_type": "create"
  }
}

query用法

通过query把需要_reindex的document限定在一定的范围

POST _reindex

复制代码
{
  "source": {
    "index": "mm",
    "type": "tweet",
    "query": {
      "term": {
        "user": "alen"
      }
    }
  },
  "dest": {
    "index": "new_mm"
  }
}

size设置

通过size可以控制复制多少内容

POST _reindex

复制代码
{
  "size": 1,
  "source": {
    "index": "mm"
  },
  "dest": {
    "index": "new_mm"
  }
}

sort配置

把时间排序前1000个document复制到目标索引

POST _reindex

复制代码
{
  "size": 1000,
  "source": {
    "index": "mm",
    "sort": { "date": "desc" }
  },
  "dest": {
    "index": "new_mm"
  }
}

查看进度

使用Task API查询进度

一般来说如果源index很大,则可能需要比较长的时间来完成reindex工作,如果需要查看进度,可以通过tasks API查看

GET _tasks?detailed=true&actions=*reindex

# 复制代码
{
  "nodes" : {
    "r1A2WoRbTwKZ516z6NEs5A" : {
      "name" : "r1A2WoR",
      "transport_address" : "127.0.0.1:9300",
      "host" : "127.0.0.1",
      "ip" : "127.0.0.1:9300",
      "attributes" : {
        "testattr" : "test",
        "portsfile" : "true"
      },
      "tasks" : {
        "r1A2WoRbTwKZ516z6NEs5A:36619" : {
          "node" : "r1A2WoRbTwKZ516z6NEs5A",
          "id" : 36619,
          "type" : "transport",
          "action" : "indices:data/write/reindex",
          "status" : { "total" : 6154, "updated" : 3500, "created" : 0, "deleted" : 0, "batches" : 4, "version_conflicts" : 0, "noops" : 0, "retries": { "bulk": 0, "search": 0 }, "throttled_millis": 0 },
          "description" : "" }
      }
    }
  }
}

取消reindex

这里的task_id可以通过tasks API获得

POST _tasks/task_id:1/_cancel

Reindex迁移注意事项

Reindex会占用大量资源,建议在低峰期执行

大数据量reindex建议使用slices并行处理

可以使用wait_for_completion=false异步执行

监控任务进度,避免影响集群性能

考虑版本兼容性问题,特别是跨大版本迁移时

相关推荐
艾莉丝努力练剑25 分钟前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
倒流时光三十年1 小时前
SpringBoot 数据库同步 Elasticsearch 性能优化
数据库·spring boot·elasticsearch
lili-felicity1 小时前
CANN异步推理实战:从Stream管理到流水线优化
大数据·人工智能
2501_933670792 小时前
2026 高职大数据专业考什么证书对就业有帮助?
大数据
xiaobaibai1532 小时前
营销自动化终极形态:AdAgent 自主闭环工作流全解析
大数据·人工智能·自动化
星辰_mya2 小时前
Elasticsearch更新了分词器之后
大数据·elasticsearch·搜索引擎
xiaobaibai1532 小时前
决策引擎深度拆解:AdAgent 用 CoT+RL 实现营销自主化决策
大数据·人工智能
悟纤2 小时前
学习与专注音乐流派 (Study & Focus Music):AI 音乐创作终极指南 | Suno高级篇 | 第33篇
大数据·人工智能·深度学习·学习·suno·suno api
ESBK20252 小时前
第四届移动互联网、云计算与信息安全国际会议(MICCIS 2026)二轮征稿启动,诚邀全球学者共赴学术盛宴
大数据·网络·物联网·网络安全·云计算·密码学·信息与通信
Elastic 中国社区官方博客3 小时前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索