迁移方案
- 通过logstash的input和output配置迁移(配置灵活适用于长期数据同步等)
- 通过迁移工具如elasticdump等(适用于备份一次性小量数据操作,支持备份到文件)
- 通过elasticsarch自带快照功能(适用于一次性迁移大量数据)
迁移的方式主要有通过Logstash迁移、通过snapshot、通过reindex方式、通过elasticsearch-dump
Logstash迁移Elasticsearch
原理:通过logstash从源elasticsearch Cluster读数据,写入到目标elasticsearh
在logstash的目录下创建一个logstash的用于数据同步的conf文件
vim ./logstash-5.5.3/es-es.conf
- 只迁移指定index
input {
elasticsearch {
hosts => ["********源es_ip:port********"]
user => "*******"
password => "*********"
index => "***indexname*****"
size => 1000
scroll => "1m"
}
}
#filter是可选的
filter {
}
output {
elasticsearch {
hosts => ["********目标es_ip:port********"]
user => "********"
password => "**********"
index => "***indexname*****"
}
}
- 迁移所有索引
执行后,logstash会将源Cluster中所有的index全部copy到目标Cluster中去,并将mapping信息携带过去,随后开始逐步做index内的数据迁移。
input {
elasticsearch {
hosts => ["yourhost"]
user => "**********"
password => "*********"
index => "*" #该通配符代表需要读取所有index信息
size => 1000
scroll => "1m"
codec => "json"
docinfo => true
}
}
#filter是可选的
filter {
}
output {
elasticsearch {
hosts => ["yourhost"]
user => "********"
password => "********"
index => "%{[@metadata][_index]}"
}
}
conf文件配置完成后执行logstash开始迁移
bin/logstash -f es-es.conf
如果执行顺利,执行下面这个命令就可以在目标的elasticsearch中看到对应的index
curl -u username:password host:port/_cat/indices
通过snapshot快照迁移
如果是自建ES安装elasticsearch-repository-oss插件
解压插件到your-es-root/plugins/
- 非5.5.3需要修改plguins/plugin-descriptor.properties中的elasticsearch.version和version,改为自己es集群的版本
- 重启es
购买OSS实例并创建和阿里云ECS相同region的bucket
在自建ES创建仓库
PUT _snapshot/my_backup
{
"type": "oss",
"settings": {
"endpoint": "xxxx", <1>
"access_key_id": "xxxx",
"secret_access_key": "xxxxxx",
"bucket": "xxxxxx", <2>
"compress": true
}
}
- <1> 本处的OSS, 要求和你的elasticsearch集群在同一个region中, 这里的endpoint填的是这个region对应的地址 ,具体参考 https://help.aliyun.com/document_detail/31837.html?spm=5176.doc31922.6.577.YxqZYt
- <2> 需要一个已经存在的OSS bucket
快照指定索引
默认行为是备份所有打开的索引。不过如果你在用Kibana,你不是真的想要把所有诊断相关的 .kibana 索引也备份起来。可能你就压根没那么大空间备份所有数据。这种情况下,你可以在快照你的集群的时候指定备份哪些索引:
PUT _snapshot/my_backup/snapshot_1
{
"indices": "index_1,index_2"
}
这个快照命令现在只会备份 index1 和 index2 了。
在阿里云ES上创建相同仓库my_backup
PUT _snapshot/my_backup
{
"type": "oss",
"settings": {
"endpoint": "xxxx", <1>
"access_key_id": "xxxx",
"secret_access_key": "xxxxxx",
"bucket": "xxxxxx", <2>
"compress": true
}
}
注意 这里的endpoint要填该region的内网地址
在阿里云ES上恢复快照
一旦你备份过了数据,恢复它就简单了:只要在你希望恢复回集群的快照 ID 后面加上 _restore 即可:
POST _snapshot/my_backup/snapshot_1/_restore
默认行为是把这个快照里存有的所有索引都恢复。如果snapshot_1包括五个索引,这五个都会被恢复到我们集群里。和snapshot API一样,我们也可以选择希望恢复具体哪个索引。
还有附加的选项用来重命名索引。这个选项允许你通过模式匹配索引名称,然后通过恢复进程提供一个新名称。如果你想在不替换现有数据的前提下,恢复老数据来验证内容,或者做其他处理,这个选项很有用。让我们从快照里恢复单个索引并提供一个替换的名称:
POST /_snapshot/my_backup/snapshot_1/_restore
{
"indices": "index_1", <1>
"rename_pattern": "index_(.+)", <2>
"rename_replacement": "restored_index_$1" <3>
}
- <1> 只恢复 index_1 索引,忽略快照中存在的其余索引。
- <2> 查找所提供的模式能匹配上的正在恢复的索引。
- <3> 然后把它们重命名成替代的模式。
这个会恢复 index_1 到你及群里,但是重命名成了 restored_index_1 。
通过reindex方式
https://help.aliyun.com/knowledge_detail/61145.html
通过elasticsearch-dump迁移
采用elasticsearch-dump插件
安装
yum install nodejs npm
npm install elasticdump
cd node_modules/elasticdump/bin
导出mapping
elasticdump --input=http://源ip:9200/索引名称 --output=http://目标ip:9200/索引名称 --type=mapping
导出数据
elasticdump --input=http://源ip:9200/索引名称 --output=http://目标ip:9200/索引名称 --type=data
如果索引很多,你还是懒得一个个去迁移,那么你可以改用这个命令:
./elasticdump --input=http://192.168.1.1:9200/ --output=http://localhost:9200/ --all=true
1
加个–all=true,input与output里不需要把索引名加上,这样就可以自动把原机器上的所有索引迁移到目标机器