Elasticsearch迁移方案

迁移方案

  • 通过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
    }
}
快照指定索引

默认行为是备份所有打开的索引。不过如果你在用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里不需要把索引名加上,这样就可以自动把原机器上的所有索引迁移到目标机器

上一篇:【hibernate框架】面向对象的查询语法(QBE和QBC)


下一篇:MySql数据类型