一、前言
最近需要对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 #查看重建进度。
三、总结:
- 跨集群迁移,需要注意在配置文件中添加白名单。目前没找到是否可以动态进行白名单设置。
A集群 --> B集群,就需要在B中的elasticsearch.yml 设置A地址为白名单
- 索引需要提前创建。
- 在remote中设置远程集群的地址与账号密码(如果配置了的话)。
- 也可以添加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实现索引层面迁移,或者跨集群的索引迁移 |