Elasticearch 集群数据迁移

Elasticearch 集群数据迁移,第1张

Elasticearch 集群数据迁移

集群迁移或者ES数据迁移的方法有三种:
elasticsearch-dump
reindex
snapshot
logstash

一、elasticsearch-dump
  1. 适用场景
    适合数据量不大,迁移索引个数不多的场景
  2. 使用方式
    elasticsearch-dump是一款开源的ES数据迁移工具,github地址: https://github.com/taskrabbit/elasticsearch-dump
  3. 安装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
  1. 主要参数说明
    --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队列写满
  1. 迁移单个索引
    以下 *** 作通过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 &
  1. 迁移所有索引
    以下 *** 作通过elasticdump命令将源集群中的index索引迁移至集群目标集群。 注意此 *** 作并不能迁移索引的配置如分片数量和副本数量,必须对每个索引单独进行配置的迁移,或者直接在目标集群中将索引创建完毕后再迁移数据
elasticdump --input=http://源端host:9200 --output=http://目标端host:9200

!!!注意,如果索引有特殊要求或结构,需要提前创建好索引,因为直接使用elsticsearch-dump不会同步所有结构类型和分片数量,只会创建一个1分片1副本的索引

二、reindex

reindex是Elasticsearch提供的一个api接口,可以把数据从源ES集群导入到当前的ES集群,同样实现了数据的迁移,通过配置白名单,来实现源端集群和目标端集群的连接。可用于数据量较大的索引及集群

  1. 配置配置reindex.remote.whitelist参数(白名单参数,elsticsearch.yml文件)
    仅需要在目标ES集群中配置该参数,指明能够reindex的远程集群的白名单,如果双方都需要连接那就双方都配置白名单
  2. 调用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"
  	}
}
  1. 调用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
  1. 适用场景
    适用数据量大的场景
  2. 使用方式
    snapshot api是Elasticsearch用于对数据进行备份和恢复的一组api接口,可以通过snapshot api进行跨集群的数据迁移,原理就是从源ES集群创建数据快照,然后在目标ES集群中进行恢复。需要注意ES的版本问题:
目标ES集群的主版本号(如5.6.4中的5为主版本号)要大于等于源ES集群的主版本号;
1.x版本的集群创建的快照不能在5.x版本中恢复;
  1. 源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"
	}
}
  1. 源ES集群中创建snapshot
    调用snapshot api在创建好的仓库中创建快照
curl -XPUT http://源端host:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true
  1. 目标ES集群中创建repository
    目标ES集群中创建仓库和在源ES集群中创建仓库类似.存储类型等
  2. 移动源ES集群snapshot至目标ES集群的仓库
    把源端ES集群创建好的snapshot上传至目标ES集群创建好的仓库中
  3. 从快照恢复
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官方文档

五、总结
  1. elasticsearch-dump和logstash做跨集群数据迁移时,都要求用于执行迁移任务的机器可以同时访问到两个集群,不然网络无法连通的情况下就无法实现迁移。而使用snapshot的方式没有这个限制,因为snapshot方式是完全离线的。因此elasticsearch-dump和logstash迁移方式更适合于源ES集群和目标ES集群处于同一网络的情况下进行迁移,而需要跨云厂商的迁移,比如从阿里云ES集群迁移至腾讯云ES集群,可以选择使用snapshot的方式进行迁移,当然也可以通过打通网络实现集群互通,但是成本较高。
  2. elasticsearchdump工具和mysql数据库用于做数据备份的工具mysqldump工具类似,都是逻辑备份,需要将数据一条一条导出后再执行导入,所以适合数据量小的场景下进行迁移。
  3. snapshot的方式适合数据量大的场景下进行迁移。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5677667.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存