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

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

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

相关推荐
极客数模7 小时前
【2026美赛赛题初步翻译F题】2026_ICM_Problem_F
大数据·c语言·python·数学建模·matlab
编程彩机9 小时前
互联网大厂Java面试:从分布式架构到大数据场景解析
java·大数据·微服务·spark·kafka·分布式事务·分布式架构
vx-bot55566610 小时前
企业微信接口在多租户SaaS平台中的集成架构与数据隔离实践
大数据·架构·企业微信
bubuly12 小时前
软件开发全流程注意事项:从需求到运维的全方位指南
大数据·运维·数据库
xixixi7777714 小时前
基于零信任架构的通信
大数据·人工智能·架构·零信任·通信·个人隐私
Hello.Reader14 小时前
Flink 自适应批执行(Adaptive Batch Execution)让 Batch 作业“边跑边优化”
大数据·flink·batch
LaughingZhu16 小时前
Product Hunt 每日热榜 | 2026-01-31
大数据·人工智能·经验分享·搜索引擎·产品运营
babe小鑫16 小时前
中专学历进入快消大厂终端销售岗位的可行性分析
大数据
samFuB16 小时前
【工具变量】区县5A级旅游景区DID数据集(2000-2025年)
大数据
百夜﹍悠ゼ16 小时前
数据治理DataHub安装部署
大数据·数据治理