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="xxx.xxx.xxx.xxx"
ES_USER="TEST"
ES_PASSWORD='123'
###获取es索引列表
index_list=`curl -u ES_USER:ES_PASSWORD -XGET "http://$ES_HOST:9200/_cat/indices?v"|awk -F' ' '{if (NR>1){print $3}}' |egrep -v "^\."`
###遍历列表
for index in $index_list;do
  ###开始执行reindex 
  echo -e "\n$(date '+%Y-%m-%d %H:%M:%S'), 索引$index,开始reindex"
  curl -POST -H "Content-Type: application/json" -s -u $ES_USER:$ES_PASSWORD "http://$ES_HOST:9200/_reindex" -d '
       {
          "conflicts": "proceed",
            "source": {
               "remote": {
                  "host": "http://xxx.xxx.xxx.xxx:9200",
                  "username": "xxxx",
                  "password": "xxxxxxxxxxxxx",
                   "socket_timeout": "30s",
                   "connect_timeout": "30s"
                    },
                   "index": "'$index'",
                   "size": 5000
                  },
            "dest": {
               "index": "'$index'",
                    "op_type": "create",
                    "routing": "=cat"
           }
        }'
        echo -e "\n$(date '+%Y-%m-%d %H:%M:%S'), 索引$_index,reindex完成"
done

你可能感兴趣的:(es数据跨集群的两种迁移方式)