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

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

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

相关推荐
阿里云大数据AI技术3 小时前
云栖实录|MaxCompute全新升级:AI时代的原生数据仓库
大数据·数据库·云原生
QYResearch5 小时前
导航浮标灯市场现状及前景分析
大数据
QYResearch5 小时前
2025年全球半导体用电子湿化学品行业总体规模、主要企业国内外市场占有率及排名
大数据
搞科研的小刘选手6 小时前
【通信&网络安全主题】第六届计算机通信与网络安全国际学术会议(CCNS 2025)
大数据·人工智能·网络安全·vr·通信工程·网络技术·计算机工程
阿里云大数据AI技术9 小时前
云栖实录 | 通义实验室基于MaxCompute进行大模型数据管理及处理
大数据·人工智能
yumgpkpm10 小时前
CMP (类ClouderaCDP7.3(404次编译) )华为鲲鹏Aarch64(ARM)信创环境多个mysql数据库汇聚的操作指南
大数据·hive·hadoop·zookeeper·big data·cloudera
CryptoPP11 小时前
获取越南股票市场列表(包含VN30成分股)实战指南
大数据·服务器·数据库·区块链
跨境小新11 小时前
TG弹出“只能给双向联系人发送消息”的飞机双向限制怎么办?
大数据
数智顾问12 小时前
破解 Shuffle 阻塞:Spark RDD 宽窄依赖在实时特征工程中的实战与未来
大数据·分布式·spark