ElasticSearch迁移同步数据的几种方法
场景
在项目开发过程中,有时会遇到ElasticSearch(简称:ES)的数据需要迁移和同步。
例如:
- 索引结构发生变化,如字段修改了类型
- ES集群从开发环境迁移到测试环境
- ES集群虚拟机测试环境迁移到K8S容器环境
- ES线上环境数据导入到测试环境
- 其它场景
思路
迁移同步的数据包含索引和文档。
索引可以用mapping dsl来创建,而索引里的文档同步数通常有如下几种方法
- 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。
- 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类型字段丢失精度问题。
- 通过kinaba界面
导出:Discovery->Share->CSV Reports
Management->Saved Objects->Export
导入:Management->Saved Objects->Import
- 通过程序重新写数据
通过程序里生成的索引文档数据,保存到新的ES里或者同一个ES新的索引里。
总结
以前几种方式各有利弊,根据场景进行选择。
第1种方法比较推荐,因为_reindex是ES本身支持的api,使用方便且性能不错;
第2种方法使用上也比较方便,可在本机运行,但性能上一般,没有_reindex快;
第3种方法直接使用kibana图形界面的功能,实际体验一般,不能够很好满足需求;
第4种方法,如果程序方便指定不同的ES地址或者不同索引,可考虑。同时也需要考虑数据量、程序执行时间、是否影响程序所在的应用等问题。
参考
- ES数据库重建索引 -- Reindex(数据迁移) https://blog.csdn.net/qq_21383435/article/details/108953326
- elasticdump 导入/导出数据及常见报错 https://blog.csdn.net/zzddada/article/details/121744016
- elasticsearch-dump https://github.com/elasticsearch-dump/elasticsearch-dump
- ES业务数据迁移遇到的BUG精度问题 http://www.icodebang.com/article/328853