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

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

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

相关推荐
鲁邦通物联网33 分钟前
PLC数据接入MES的边缘计算网关架构设计:别让MES直接理解控制变量
大数据·边缘计算·数据采集·工业数据采集·边缘计算网关·5g数采·plc数采
Never_every991 小时前
位图转矢量工具哪个好?实测抠抠图AI位图转矢量工具
大数据·前端
4SAPI1 小时前
AI 数据分析工具大模型 API 选型指南
大数据·人工智能·架构·php·1024程序员节
北京青蓝智慧马老师2 小时前
比外部黑客更难防的,是那个有权限的自己人(3 个脱敏复盘)
大数据·数据库·人工智能
云上先途4 小时前
开发专属 AI 工具,数据安全和隐私风险怎么规避?
大数据·人工智能·深度学习
2601_967212725 小时前
高防护轨道式插座安全结构与工程适配技术说明
大数据·经验分享·安全
ha_lydms6 小时前
AnalyticDB MySQL 技术架构
大数据·hadoop·mysql·adb·spark·dataworks·1024程序员节
爱喝雪碧的可乐9 小时前
OpenAI Codex完成率
大数据·人工智能·1024程序员节
m0_622023539 小时前
产业资本运作:新金融博弈下的产业链安全底盘搭建
大数据·深度学习·重构·1024程序员节
微功夫信息技术10 小时前
非急救转运如何规范管理
大数据·交通物流