es数据跨集群的两种迁移方式

背景: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版权协议,转载请附上原文出处链接和本声明。