ElasticSearch迁移同步数据的几种方法

场景

在项目开发过程中,有时会遇到ElasticSearch(简称:ES)的数据需要迁移和同步。

例如:

  • 索引结构发生变化,如字段修改了类型
  • ES集群从开发环境迁移到测试环境
  • ES集群虚拟机测试环境迁移到K8S容器环境
  • ES线上环境数据导入到测试环境
  • 其它场景

思路

迁移同步的数据包含索引和文档。
索引可以用mapping dsl来创建,而索引里的文档同步数通常有如下几种方法

  1. reindex
    通过_reindex api。
    例:
POST _reindex?wait_for_completion=false
{
  "source": {
    "remote": {
      "host": "http://host:port",
      "username": "xxx",
      "password": "xxx"
    },
    "index": "index_aaa",
    "size": 5000
  },
  "dest": {
    "index": "index_bbb"
  },
  "conflicts": "proceed"
}

如果数据量较大,通过wait_for_completion=false异步执行,返回taskId。
查询任务执行情况:

GET _tasks/taskId

如果想取消任务,可执行:

POST _tasks/taskId/_cancel

通过remote参数,可同步远程ES实例的数据,如果是同一个ES,不同索引间同步数据可去掉该参数;

通过指定size参数,设置批量同步的文档数。可根据场景设置,比如尽可能避免影响线上环境,设置一个较小的值,在系统空闲时段运行;

通过指定"conflicts": "proceed",避免文档版本冲突时,_reindex被abort。

  1. elasticdump
    通过elasticdump工具。
    安装:cnpm install elasticdump -g
    例:
elasticdump \
  --input=http://elastic:password@host:port/index_aaa \
  --output=http://elastic:password@host:port/index_bbb \
  --type=data --limit 1000 --support-big-int

通过指定--limit 1000,设置每批次同步文档数量。

注:通过指定--support-big-int参数,解决long类型字段丢失精度问题。

  1. 通过kinaba界面
    导出:Discovery->Share->CSV Reports
    Management->Saved Objects->Export

导入:Management->Saved Objects->Import

  1. 通过程序重新写数据
    通过程序里生成的索引文档数据,保存到新的ES里或者同一个ES新的索引里。

总结

以前几种方式各有利弊,根据场景进行选择。
第1种方法比较推荐,因为_reindex是ES本身支持的api,使用方便且性能不错;
第2种方法使用上也比较方便,可在本机运行,但性能上一般,没有_reindex快;
第3种方法直接使用kibana图形界面的功能,实际体验一般,不能够很好满足需求;
第4种方法,如果程序方便指定不同的ES地址或者不同索引,可考虑。同时也需要考虑数据量、程序执行时间、是否影响程序所在的应用等问题。

参考

posted @ 2022-06-08 20:05  cdfive  阅读(2821)  评论(0编辑  收藏  举报