一、前言


最近需要对es集群进行拆分,所以部分索引需要迁移到新集群。这里新集群的版本与老集群保持了一致。

这里我们选择使用_reindex 方法来进行索引的迁移。

注意:5.X版本后新增_reindex API 。Reindex可以直接在Elasticsearch集群里面对数据进行重建。并且支持跨集群间的数据迁移。

  • 旧集群版本:5.6.4
  • 新集群版本:5.6.4

二、实战


1. 设置白名单

在目标集群的elasticsearch.yml配置文件,设置远程集群的白名单,添加如下配置:

# reindex.remote.whitelist: A的IP:端口,例如:
reindex.remote.whitelist: 10.11.36.142:9200

#跨域问题
http.cors.enabled: true
http.cors.allow-origin: "*"

(如果是A集群 --> B集群,就需要在B中的elasticsearch.yml 设置A地址为白名单)

2. reindex

和同集群数据迁移基本一样,就是多了一个设置白名单而已。

设置好索引、number_of_replicas: 0、refresh_interval: -1

在remote中设置远程集群的地址与账号密码(如果配置了的话)。

也可以添加query属性,只查询符号条件的。

3. 具体实施

1、原集群test_analyze索引mapping如下:

{
  "mappings": {
    "test": {
      "properties": {
        "content": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

2、在新集群上新建一个同名索引:

curl -u admin:DYn^sMz8qmF6Z*qd  -X PUT "10.11.36.144:9200/test_analyze?pretty" -d '
{
  "mappings": {
    "test": {
      "properties": {
        "content": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}
'

3、开始迁移

curl -u admin:DYn^sMz8qmF6Z*qd   -XPOST "http://10.11.36.144:9200/_reindex" -d '
{
  "source": {
    "remote": {
      "host": "http://10.11.36.142:29200",
      "username": "admin",
      "password": "DYn^sMz8qmF6Z*qd"
    },
    "index": "test_analyze"
  },
  "dest": {
    "index": "test_analyze"
  }
}'

4、查看文档数量

curl -X GET 'http://localhost:9200/_cat/count/test_analyze?v&pretty'

5、建大索引是一个比较慢的过程,可以通过:

GET _tasks?detailed=true&actions=*reindex   #查看重建进度。

三、总结:


  1. 跨集群迁移,需要注意在配置文件中添加白名单。目前没找到是否可以动态进行白名单设置。A集群 --> B集群,就需要在B中的elasticsearch.yml 设置A地址为白名单
  2. 索引需要提前创建。
  3. 在remote中设置远程集群的地址与账号密码(如果配置了的话)。
  4. 也可以添加query属性,只查询符号条件的。

四、扩展:


关于ES数据迁移还有其他3种方式

  • elasticsearch-dump
  • snapshot
  • logstash

elasticsearch-dump

logstash

snapshot

reindex

基本原理

逻辑备份,类似mysqldump将数据一条一条导出后再执行导入

从一个 ES 集群中读取数据然后写入到另一个 ES 集群

从源 ES 集群通过备份api创建数据快照,然后在目标 ES 集群中进行恢复

reindex是Elasticsearch提供的一个api接口,可以把数据从一个集群迁移到另外一个集群

网络要求

网络需要互通

网络需要互通

无网络互通要求

网络需要互通

迁移速度


一般


一般

运维配置复杂度

复杂,索引的分片数量和副本数量需要对每个索引单独进行迁移,或者直接在目标集群提前将索引创建完成,再迁移数据

复杂,需要提前在目标集群创建mapping和setting等,再迁移数据

简单

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

适合场景

适用于数据量小的场景

适用于数据量一般,近实时数据传输

适用于数据量大,接受离线数据迁移的场景

本地索引更新Mapping实现索引层面迁移,或者跨集群的索引迁移