沪ICP备2021032517号-1

Elasticsearch 数据迁移

  |   0 评论   |   0 浏览

ES数据迁移

elaticsearch-dump安装

nodejs安装

curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -

yum install nodejs -y

安装 elasticdump

npm install elasticdump -g

elasticdump --help #查看帮助

遇到错误

/opt/node_modules/elasticdump/lib/processor.js:40   
 async _loop (limit, offset, totalWrites) {   
 ^^^^^   
  
SyntaxError: Unexpected identifier   
 at createScript (vm.js:56:10)   
 at Object.runInThisContext (vm.js:97:10)   
 at Module._compile (module.js:549:28)   
 at Object.Module._extensions..js (module.js:586:10)   
 at Module.load (module.js:494:32)   
 at tryModuleLoad (module.js:453:12)   
 at Function.Module._load (module.js:445:3)   
 at Module.require (module.js:504:17)   
 at require (internal/module.js:20:19)   
 at Object.<anonymous> (/opt/node_modules/elasticdump/elasticdump.js:3:28)   
  

解决办法

升级nodejs

nodejs升级参考

npm install npm@latest -g
npm cache clean -f
npm install -g n
n stable   
node --version

如升级后还显示原来版本

rm -f  /usr/bin/node
ln -s /usr/local/bin/node /usr/bin/node   

1、先查看索引数据及大小

在kibana上操作

image.png

GET /_cat/indices   

或者在linux执行如下命令

curl -XGET 10.10.0.27:9200/_cat/indices  

如果需要用户名和密码登录才可以访问,通过下面的方式指定用户名和密码

curl --user username:password 'localhost:9200/_cat/nodes?v'  

2、迁移注意事项

1、迁移前确保新的集群数据迁入后存储容量不会超过85%,否则迁移过程中不会在新的集群创建副本。  
  
2、单个索引迁移时分别先迁移settings、mapping最后再迁移data  
  
3、迁移前先关闭被迁移索引的写入(或停止索引的写入)  

索引迁移

先将索引的settings先迁移,如果直接迁移mapping或者data将失去原有集群中索引的配置信息如分片数量和副本数量等,当然也可以直接在目标集群中将索引创建完毕后再同步mapping与data

特别注意:

1、导入 setting 前需确认两个环境的索引模板、生命周期等是否有单独或者特殊配置,如有不建议直接导入 setting。否则会导致目标集群导入的索引无法分配分片。从而导致目标集群 red状态 。生产环境稳妥的办法,可以先在目标es手动创建模板和索引然后迁移 mappingdata

elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=settings  
  
elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=mapping  
  
elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=data  

迁移所有索引

注意此操作并不能迁移索引的配置如分片数量和副本数量,必须对每个索引单独进行配置的迁移,或者直接在目标集群中将索引创建完毕后再迁移数据

elasticdump --input=http://172.16.0.39:9200 --output=http://172.16.0.20:9200

如有账号和密码。密码特殊字符可加 '' 号

elasticdump --input=http://username:passowrd@10.10.1.10:9200/my_index --output=http://username:password@10.10.1.11:9200/my_index --type=data

注意:

迁移前确保新的集群数据迁入后存储容量不会超过85%,否则迁移过程中不会在新的集群创建副本。

将索引导出为文件

索引导出

elasticdump --input=http://旧es_ip:9200/索引名称  --output=/opt/es/索引名称.index.json --type=data  

索引导入

elasticdump --input=/opt/es/索引名称.index.json --output=http://新es_ip:9200  

Logstash 迁移数据

使用logstash迁移数据的速度是elasticdump的40倍。

input {
  elasticsearch {
  hosts => [ "10.12.3.9:9200" ]
  index => "content_audio_base"
  size => 1000
  scroll => "5m"
  docinfo => true
  docinfo_fields => ["_routing","_index","_type","_id"]
  }
}

filter {
 
  mutate { 
  remove_field => ["@timestamp","@version"]
  }
  
}

output {

  elasticsearch {
  hosts => [ "10.10.15.8:9200" ]
  document_type => "%{[@metadata][_type]}"
  document_id => "%{[@metadata][_id]}"
  index => "content_audio_base"
  user => "elastic"
  password => "123456"
  }

}


  • docinfo:设置为true,将会提取ES文档的元信息,例如index、type和id
  • docinfo_fields:指定文档元信息,默认不带routing元信息
  • %{[@metadata][_index]}:使用源索引名称
  • %{[@metadata][_type]}:使用源类型
  • %{[@metadata][_id]}:使用源 id

标题:Elasticsearch 数据迁移
作者:zifuy
地址:https://www.zifuy.cn/articles/2020/03/23/1584949635901.html