Elasticsearch跨集群数据备份和迁移

(一)、简述
不同集群的ES环境搭建在不同的环境中,可以在公有云和私有云进行搭建,用户也可以根据自己的业务需要选择合适的迁移方案,如果业务可以停服务的话或者暂停写操作,可以采用离线迁移,离线迁移有四种方式可供选择:

  • Elasticsearch-dump
  • snapshot
  • reindex
  • logstash(golang)
    (二)、使用方式
    1、elasticsearch-dump的安装和使用
1.1、elasticdump安装
####下载nodes
wget https://nodejs.org/dist/v10.13.0/node-v10.13.0-linux-x64.tar.xz
####解压
xz -d node-v10.13.0-linux-x64.tar.xz 
tar xvf node-v10.13.0-linux-x64.tar -C /opt
####配置和生效环境变量
vim /etc/profile
export NODE_HOME=/opt/node-v10.13.0-linux-x64
export PATH=$PATH:$NODE_HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_modules
source /etc/profile
npm -v
1.2、
####安装elasticdump工具
npm install elasticdump -g
elasticdump --help

1.3、迁移单个索引
####迁移setting、mapping、data
 elasticdump --input=http://10.16.0.8:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=settings
    elasticdump --input=http://10.16.0.8:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=mapping
    elasticdump --input=http://10.16.0.8:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=data

###备注

--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

2、snapshot

适用于数据量大的场景
snapshot api是Elasticsearch用于对数据进行备份和恢复的一组api接口,可以通过snapshot api进行跨集群的数据迁移,原理就是从源ES集群创建数据快照,然后在目标ES集群中进行恢复。需要注意ES的版本问题:
目标ES集群的主版本号(如5.6.4中的5为主版本号)要大于等于源ES集群的主版本号;
1.x版本的集群创建的快照不能在5.x版本中恢复;
具体步骤如下:

1、源ES集群中创建repository
创建快照前必须先创建repository仓库,一个repository仓库可以包含多份快照文件,2、2、2、repository主要有一下几种类型
fs: 共享文件系统,将快照文件存放于文件系统中
 url: 指定文件系统的URL路径,支持协议:http,https,ftp,file,jar
 s3: AWS S3对象存储,快照存放于S3中,以插件形式支持
 hdfs: 快照存放于hdfs中,以插件形式支持
 cos: 快照存放于腾讯云COS对象存储中,以插件形式支持
 如果需要从自建ES集群迁移至腾讯云的ES集群,可以直接使用fs类型仓库,注意需要在Elasticsearch配置文件elasticsearch.yml设置仓库路径:
 path.repo: ["/data/es/backup"]

 1、配置文件
vim elasticsearch.yml
path.repo: ["/data/es/backup"]
2、注册快照仓库repository到ES中
PUT /_snapshot/es_backup
{
  "type": "fs",
  "settings": {
    "location": "/data/es/backup/"
  }
}
3、创建索引并添加文档
DELETE test
PUT test/_doc/1
{
  "key": "value1",
  "name": "lqbyz",
  "age":30
}
4、创建快照
#创建所有索引的快照
PUT _snapshot/es_backup/snapshot4?wait_for_completion=true
#创建指定索引创建快照
PUT /_snapshot/es_backup/snapshot_3?wait_for_completion=true
{
  "indices": "test",
  "ignore_unavailable": true,
  "include_global_state": false,
  "metadata": {
    "taken_by": "lqbyz",
    "taken_because": "backup before delete"
  }
}
5、查看相关的快照
GET _snapshot/es_backup/_all
GET _snapshot/es_backup/
GET _cat/indices
6、删除相关的快照
DELETE _snapshot/my_backup
GET test/_search
7、恢复快照
POST _snapshot/es_backup/snapshot_3/_restore
{}
#指定索引进行restore
POST /_snapshot/es_backup/snapshot1/_restore
{
  "indices": "elk-info-test-2020-06-26",
  "index_settings": {
    "index.number_of_replicas": 1
  },
  "ignore_index_settings": [
     "index.refresh_interval"
    ]
}
8、删除索引和快照
DELETE test
DELETE _snapshot/my_fs_backup

#####相关操作的查询
#####删除es_backup仓库
DELETE _snapshot/es_backup
###查看仓库信息
GET _snapshot/_all
####查看快照的
GET _snapshot/snapshot4/_status
###创建一个snapshot快照(包含所有的索引)
PUT _snapshot/es_backup/snapshot4?wait_for_completion=true
###创建一个快照只包含test2的索引
PUT _snapshot/es_backup/snapshot2
{
  "indices": "test2"
}
###查看刚才创建的快照信息
GET /_snapshot/es_backup/snapshot2
###查看所有的快照信息
GET _snapshot/es_backup/_all
###删除一个快照
DELETE /_snapshot/es_backup/snapshot2
###删除一个仓库
DELETE /_snapshot/es_backup
如果要停止一个正在运行的snapshot任务(备份和恢复),将其删除即可。

3、reindex

reindex是Elasticsearch提供的一个api接口,可以把数据从源ES集群导入到当前的ES集群,同样实现了数据的迁移,限于腾讯云ES的实现方式,当前版本不支持reindex操作。简单介绍一下reindex接口的使用方式。

1、配置reindex.remote.whitelist参数

需要在目标ES集群中配置该参数,指明能够reindex的远程集群的白名单

2、调用reindex api
以下操作表示从源ES集群中查询名为test1的索引,查询条件为title字段为elasticsearch,将结果写入当前集群的test2索引
 POST _reindex
 {
     "source": {
         "remote": {
             "host": "http://10.16.0.8:9200"
         },
         "index": "test1",
         "query": {
             "match": {
                 "title": "elasticsearch"
             }
         }
     },
     "dest": {
         "index": "test2"
     }
 }

4、logstash(filebeat、golang)
logstash支持从一个ES集群中读取数据然后写入到另一个ES集群,因此可以使用logstash进行数据迁移,具体的配置文件如下:

 input {
        elasticsearch {
            hosts => ["http://10.16.0.8:9200"]
            index => "*"
            docinfo => true
        }
    }
    output {
        elasticsearch {
            hosts => ["http://10.16.0.9:9200"]
            index => "%{[@metadata][_index]}"
        }
    }

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

上一篇:请问你知道分布式系统设计模式的最低水位线思想么?


下一篇:maven deploy时报错 distributionManagement element or in -DaltDeploymentRepository=id::layout::url param