集群迁移或者ES数据迁移的方法有三种:
elasticsearch-dump
reindex
snapshot
logstash
- 适用场景
适合数据量不大,迁移索引个数不多的场景 - 使用方式
elasticsearch-dump是一款开源的ES数据迁移工具,github地址: https://github.com/taskrabbit/elasticsearch-dump - 安装elstichearch-dump
elasticsearch-dump使用node.js开发,可使用npm包管理工具直接安装
#下载包(解压即用) cd /data/ wget https://npm.taobao.org/mirrors/node/v13.8.0/node-v13.8.0-linux-x64.tar.gz tar -xf node-v13.8.0-linux-x64.tar.gz #配置node npm变量并生效 vim /etc/profile.d/node.sh export NODE_HOME=/data/node-v13.8.0-linux-x64 export PATH=$PATH:$NODE_HOME/bin #验证变量可用 npm -v #安装elasticsearch-dump npm install elasticdump -g
- 主要参数说明
--input: 源地址,可为ES集群URL、文件或stdin,可指定索引,格式为:{protocol}://{host}:{port}/{index} --input-index: 源ES集群中的索引 --output: 目标地址,可为ES集群地址URL、文件或stdout,可指定索引,格式为:{protocol}://{host}:{port}/{index} --output-index: 目标ES集群的索引 --type: 迁移类型,默认为data,表明只迁移数据,可选settings, analyzer, data, mapping, alias --limit:每次向目标ES集群写入数据的条数,不可设置的过大,以免bulk队列写满
- 迁移单个索引
以下 *** 作通过elasticdump命令将源集群中的index索引迁移至集群目标集群。注意第一条命令先将索引的settings先迁移,如果直接迁移mapping或者data将失去原有集群中索引的配置信息如分片数量和副本数量等,当然也可以直接在目标集群中将索引创建完毕后再同步mapping与data
#编写迁移脚本(或使用单条语句一句一句执行) vim /data/index #拷贝analyzer分词 elasticdump --input=http://源端host:9200/index(索引名称) --output=http://目标端host:9200/index(索引名称) --type=analyzer --limit=1000 #批量拉取文件大小 #拷贝映射 elasticdump --input=http://源端host:9200/index(索引名称) --output=http://目标端host:9200/index(索引名称) --type=mapping --limit=1000 #拷贝数据 elasticdump --input=http://源端host:9200/index(索引名称) --output=http://目标端host:9200/index(索引名称) --type=data --limit=1000 #后台启动该文件并打印日志(迁移进度可查看日志) nohup sh /data/index | tee index.txt > /dev/null &
- 迁移所有索引
以下 *** 作通过elasticdump命令将源集群中的index索引迁移至集群目标集群。 注意此 *** 作并不能迁移索引的配置如分片数量和副本数量,必须对每个索引单独进行配置的迁移,或者直接在目标集群中将索引创建完毕后再迁移数据
elasticdump --input=http://源端host:9200 --output=http://目标端host:9200
!!!注意,如果索引有特殊要求或结构,需要提前创建好索引,因为直接使用elsticsearch-dump不会同步所有结构类型和分片数量,只会创建一个1分片1副本的索引
二、reindexreindex是Elasticsearch提供的一个api接口,可以把数据从源ES集群导入到当前的ES集群,同样实现了数据的迁移,通过配置白名单,来实现源端集群和目标端集群的连接。可用于数据量较大的索引及集群
- 配置配置reindex.remote.whitelist参数(白名单参数,elsticsearch.yml文件)
仅需要在目标ES集群中配置该参数,指明能够reindex的远程集群的白名单,如果双方都需要连接那就双方都配置白名单 - 调用reindex api (全量同步)
以下 *** 作表示从源ES集群中查询名为test1的索引,查询条件为title字段为elasticsearch,将结果写入当前集群的test2索引,或者取消查询条件,把索引里的全部数据同步过去
POST _reindex { "source": { "remote": { "host": "http://源端host:9200" }, "index": "test1", "size": 30, #批量拉取文件的次数,可根据文件大小来决定 "query": { #可取消 "match": { #可取消 "title": "elasticsearch" #可取消 } #可取消 } #可取消 }, "dest": { "index": "test2" } }
- 调用reindex api (增量同步)
可用于实时同步,主要用于该索引数据使用的一些特殊字段来区分数据,如时间字段,该功能可以保证正式业务在较短时间内完成迁移工作,不会因为迁移数据量太大而导致停服时间太长
POST _reindex { "source": { "remote": { "host": "http://源端host:9200" }, "index": "index1", "size": 30, "query": { "range": { "c_update_dt": { #update字段来区分全量同步和增量同步的数据 "gte": "2021-10-19T20:30:00.000+08:00" } } } }, "dest": { "index": "recruitment_search_v4" } }
!!!注意,如果索引有特殊要求或结构,需要提前创建好索引,因为直接使用reindex也不会同步所有结构类型和分片数量,只会创建一个1分片1副本的索引
三、snapshot- 适用场景
适用数据量大的场景 - 使用方式
snapshot api是Elasticsearch用于对数据进行备份和恢复的一组api接口,可以通过snapshot api进行跨集群的数据迁移,原理就是从源ES集群创建数据快照,然后在目标ES集群中进行恢复。需要注意ES的版本问题:
目标ES集群的主版本号(如5.6.4中的5为主版本号)要大于等于源ES集群的主版本号; 1.x版本的集群创建的快照不能在5.x版本中恢复;
- 源ES集群中创建repository
创建快照前必须先创建repository仓库,一个repository仓库可以包含多份快照文件,repository主要有一下几种类型
fs: 共享文件系统,将快照文件存放于文件系统中 url: 指定文件系统的URL路径,支持协议:http,https,ftp,file,jar s3: AWS S3对象存储,快照存放于S3中,以插件形式支持 hdfs: 快照存放于hdfs中,以插件形式支持 cos: 快照存放于对象存储中,以插件形式支持
如果需要从自建ES集群迁移其他的云ES集群,注意需要在Elasticsearch配置文件elasticsearch.yml设置仓库路径
path.repo: ["/usr/local/services/test"]
之后调用snapshot api创建repository:
curl -XPUT http://源端host:9200/_snapshot/my_backup -H 'Content-Type: application/json' -d '{ "type": "fs", #仓库存储类型 "settings": { "location": "/usr/local/services/test" #自建ES需要添加location地址 "compress": true } }'
如果需要从云厂商的ES集群迁移至其他云ES集群,或者云内部的ES集群迁移,可以使用对应云厂商他提供的仓库类型,如AWS的S3, 阿里云的OSS,腾讯云的COS等
curl -XPUT http://源端host:9200/_snapshot/my_s3_repository { "type": "s3", "settings": { "bucket": "my_bucket_name", #云ES需要添加仓库名称 "region": "us-west" } }
- 源ES集群中创建snapshot
调用snapshot api在创建好的仓库中创建快照
curl -XPUT http://源端host:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true
- 目标ES集群中创建repository
目标ES集群中创建仓库和在源ES集群中创建仓库类似.存储类型等 - 移动源ES集群snapshot至目标ES集群的仓库
把源端ES集群创建好的snapshot上传至目标ES集群创建好的仓库中 - 从快照恢复
curl -XPUT http://目标端host:9200/_snapshot/my_backup/snapshot_1/_restore #检查快照恢复状态 curl http://172.16.0.20:9200/_snapshot/_status四、logstash
logstash支持从一个ES集群中读取数据然后写入到另一个ES集群,因此可以使用logstash进行数据迁移,具体的配置文件如下:
input { elasticsearch { hosts => ["http://源端host:9200"] index => "*" docinfo => true } } output { elasticsearch { hosts => ["http://目标端host:9200"] index => "%{[@metadata][_index]}" } }
上述配置文件将源ES集群的所有索引同步到目标集群中,当然可以设置只同步指定的索引,logstash的更多功能可查阅logstash官方文档
五、总结- elasticsearch-dump和logstash做跨集群数据迁移时,都要求用于执行迁移任务的机器可以同时访问到两个集群,不然网络无法连通的情况下就无法实现迁移。而使用snapshot的方式没有这个限制,因为snapshot方式是完全离线的。因此elasticsearch-dump和logstash迁移方式更适合于源ES集群和目标ES集群处于同一网络的情况下进行迁移,而需要跨云厂商的迁移,比如从阿里云ES集群迁移至腾讯云ES集群,可以选择使用snapshot的方式进行迁移,当然也可以通过打通网络实现集群互通,但是成本较高。
- elasticsearchdump工具和mysql数据库用于做数据备份的工具mysqldump工具类似,都是逻辑备份,需要将数据一条一条导出后再执行导入,所以适合数据量小的场景下进行迁移。
- snapshot的方式适合数据量大的场景下进行迁移。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)