使用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异步执行

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

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

相关推荐
stonewl259916 小时前
2026化工行业 GHS/CLP 国产标签打印软件合规打印方案
大数据·人工智能·物联网
Wzx19801217 小时前
Redis&ES——Retriever的抽象实现
数据库·人工智能·redis·elasticsearch
xywww16817 小时前
AWS 账号权限怎么分:根用户和 IAM 用户区别及日常使用建议
大数据·开发语言·人工智能·python·gpt·云计算·aws
牛奶咖啡1317 小时前
大数据Hadoop运维应用实践——双NameNode高可用Hadoop集群架构(下)
大数据·hadoop·hadoop集群配置文件解析·hadoop高可用集群安装部署·配置指定多台服务器相互免密·配置hadoop服务开机自启·ansible部署hadoop
在水一缸17 小时前
深度解析 GPT-5.6:大模型架构演进与复杂任务实战指南
大数据·人工智能·gpt·架构·大模型·架构演进·gpt-5.6
无忧智库18 小时前
智慧电厂:引领发电行业新革命(PPT)
大数据·人工智能
小果因子实验室19 小时前
量化研究--编写第一个回测算法策略研究
大数据·区块链
chenyulin454519 小时前
企业微信API二次开发:万级并发回调下的极致幂等性设计与防重放架构实战
大数据·人工智能·安全·架构·企业微信
Elasticsearch20 小时前
让向量听懂孤独:我是如何用 Elastic Agent Builder 构建一个情绪疗愈 agent 的
elasticsearch
BizObserver20 小时前
传统制造企业官网升级:2026数字化品牌阵地建设与服务商能力评估
大数据·人工智能·制造