背景:Es集群进行上云,需要把数据从本地迁移至云上。以下提供两种迁移方案,应对于不同的级别的集群场景。
一、Elasticdump
elasticsearch-dump是一款开源的ES数据迁移工具,github地址: https://github.com/taskrabbit/elasticsearch-dump。应用于少量数据的es集群。
安装npm,然后安装elasticdump
npm install elasticdump -g
以下是分了三个步骤进行,第一条命令先将索引的settings先迁移,如果直接迁移mapping或者data将失去原有集群中索引的配置信息如分片数量和副本数量等,当然也可以直接在目标集群中将索引创建完毕后再同步mapping与data。
# -*- coding:utf-8-*-
from elasticsearch import Elasticsearch
import re
import os
es = Elasticsearch("192.16.14.2:9200",port=9200, timeout=90)
f = es.indices
###获取所有的es索引进行遍历
for index in f.get("*"):
###去除系统索引
an = re.search('^\.', index)
if an:
pass
else:
###迁移setting
os.system("elasticdump --input=http://172.6.0.39:9200/%s --output=http://172.6.0.20:9200/%s --type=settings"%(index,index))
print("%s设置settings执行完成"%(index))
###迁移mapping
os.system("elasticdump --input=http://172.6.0.39:9200/%s --output=http://172.6.0.20:9200/%s --type=mapping"%(index,index))
print("%s设置mapping完成"%(index))
###迁移数据
os.system("elasticdump --input=http://172.6.0.39:9200/%s --output=http://172.6.0.20:9200/%s --type=data"%(index,index))
print("%s索引数据迁移完成"%(index))
二、reindex:
reindex的核心做跨索引、跨集群的数据迁移,应用于大量集群数据的迁移。
慢的原因及优化思路
- 批量大小值可能太小。需要结合堆内存、线程池调整大小;
- reindex的底层是scroll实现,借助scroll并行优化方式,提升效率;
- 跨索引、跨集群的核心是写入数据,考虑写入优化角度提升效率。
reindex迁移参数:
source:远程ElasticSearch信息
host:远程es的ip和port列表
socket_timeout:超时时间设置
connect_timeout:超时时间设置
index:源索引名称
size:批操作大小,修改大小可获取性能
query:满足条件的数据,全部迁移可去除该参数
dest.index:目标索引名称
迁移脚本
#/bin/bash
##适用于本地集群无用户名密码
ES_HOST="http://es1:9200" ##要写入的ES
OLD_ES_HOST="http://ip:9200" ##要迁移数据的es集群
OLD_ES_USER="xxxx"
OLD_ES_PASSWORD="xxxx"
###获取es索引列表
index_list=`curl -u OLD_ES_USER:OLD_ES_PASSWORD -XGET "$OLD_ES_HOST/_cat/indices?v"|awk -F' ' '{if (NR>1){print $3}}' |egrep -v "^\."`
###遍历列表, 空格隔开
#index_list=""
reindex() {
for index in $index_list;do
###开始执行reindex
echo -e "\n$(date '+%Y-%m-%d %H:%M:%S'), 索引$index,开始reindex"
cmd="curl -s -XPOST \"${ES_HOST}/_reindex\" -H 'Content-Type: application/json' -d'{
\"source\":{
\"remote\": {
\"host\": \"${OLD_ES_HOST}\",
\"username\": \"${OLD_ES_USER}\",
\"password\": \"${OLD_ES_PASSWORD}\"
},
\"index\": \"${index}\",
\"size\":\"6000\"
},
\"dest\": {
\"index\": \"${index}\",
\"op_type\": \"create\",
\"routing\": \"=cat\"
}
}'"
eval ${cmd}
echo -e "\n$(date '+%Y-%m-%d %H:%M:%S'), 索引$_index,reindex完成"
done
}
main() {
if [[ $1 == "auto_reindex" ]];then
reindex
elif [[ $1 == "static_reindex" ]];then
index_list=$2
reindex
else
echo "示例1:sh reindex.sh auto_reindex,自动获取非系统的所有索引,顺序执行reindex"
echo '示例2:sh reindex.sh static_reindex "index_name1 index_name2 index_name3", 手动填入需要reindex的索引,空格隔开索引名称'
exit
fi
}
main
版权声明:本文为weixin_40368523原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。