从关系型库中迁移数据算是比较常见的场景,这里借助两个工具来完成本次的数据迁移,考虑到数据量并不大(不足两千万),未采用snapshot快照的形式进行。


Elasticsearch-jdbc,Github地址:https://github.com/jprante/elasticsearch-jdbc,从插件管方的兼容版本看,是不支持直接写入elasticsearch 5.6.1及更高版本中。

Release date JDBC Importer version Elasticsearch version
Aug 28 2016 2.3.4.1 2.3.4

不能直接写入es5,此处方案采用elasticsearch2.3.4做一个数据中转,(主因是前期采用的elasticsearch 2.3.4,本次升级才采用5.6.1)


Elasticsearch-dump,Github地址:https://github.com/taskrabbit/elasticsearch-dump,官方简介提示如下

Version 3.0.0 of Elasticdump has the default queries updated to only work for ElasticSearch version 5+. The tool may be compatible with earlier versions of Elasticsearch, but our version detection method may not work for all ES cluster topologies

Elasticdump是支持es2.x至es5.x版本的。


下面开始数据迁移数据。

1、准备工作

  1. 安装elasticsearch-jdbc,其依赖jvm环境,事先要准备好jvm环境。从官方下载压缩包,解压即可使用,解压后有两个目录(bin/lib),脚本存放在bin目录,下面有示例脚本供参考。安装过程参考官方文档。

  2. Elasticdump依赖node环境,所以需要事先安装Node环境,再通过npm命令安装。安装过程参考官方文档。

2、准备elasticsearch-jdbc迁移脚本


  1. #!/bin/sh

  2. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

  3. bin=${DIR}/../bin

  4. lib=${DIR}/../lib

  5. echo '

  6. {

  7.    "type": "jdbc",

  8.    "jdbc": {

  9.        "elasticsearch.autodiscover": true,

  10.        "url": "jdbc:mysql://192.168.1.102:3306/test",

  11.        "user": "root",

  12.        "password": "root",

  13.        "sql": "select *,tid as _id from tb_db_info",

  14.        "elasticsearch": {

  15.            "host": "192.168.12.1",

  16.            "port": 9300

  17.        },

  18.        "elasticsearch.cluster":"my-application",

  19.        "index": "testIndex",

  20.        "type": "testType"

  21.    }

  22. }

  23. ' | java \

  24.    -cp "${lib}/*" \

  25.    -Dlog4j.configurationFile=${bin}/log4j2.xml \

  26.    org.xbib.tools.Runner \

  27.    org.xbib.tools.JDBCImporter

脚本内容很容易理解,执行此脚本,查看数据是否从mysql中写入elasticsearch索引库中。

  • 建议以后台挂起的方式执行任务,防止连接中断导致任务中断。

  • 若对目标索引有特殊要求,比如某些字段不进行analyze等,可提前建立好索引及映射机制,再使用脚本进行数据导入工作。

3,采用Elasticdump迁移数据

从官方的介绍中可以看到,大致分三个步骤:


  1. # Copy an index from production to staging with analyzer and mapping:

  2. elasticdump \

  3.  --input=http://production.es.com:9200/my_index \

  4.  --output=http://staging.es.com:9200/my_index \

  5.  --type=analyzer

  6. elasticdump \

  7.  --input=http://production.es.com:9200/my_index \

  8.  --output=http://staging.es.com:9200/my_index \

  9.  --type=mapping

  10. elasticdump \

  11.  --input=http://production.es.com:9200/my_index \

  12.  --output=http://staging.es.com:9200/my_index \

  13.  --type=data

为提高脚本的执行效率,特殊关注下limit参数,数据批的大小,默认是100条,比较小的,这个需要根据具体的环境来调整,建议1000以上。脚本执行过程中会有日志输出,显示数据传输的进程。

  • 若对目标索引需要特殊处理的情况,而不采用上面两个脚本——type类型为:analyzer及mapping,制定好自己的索引及映射关系后,再使用工具进行迁移。

  • 为应对脚本针对大数据量的迁移执行中断的情况,工具中有参数offset,但只针对写索引有效,并不能按我们的预期直接从offset中断处继续读中断后的数据进而去迁移数据,而是继续从头开始,此处需要特别注意。

  • limit参数不宜调试过大,容易导致timeout的情况发生,近而导致任务中断,执行失败。

  • 脚本运行建议以后台挂起的形式运行,防止因连接中断导致任务中断。

实际操作时请结合自身的具体环境,希望能帮到你。

扩展阅读:

MYSQL千万级别数据量迁移Elasticsearch5.6.1实战的更多相关文章

  1. 千万级别数据量mysql优化策略

    表结构优化 1.  使用独立表空间 独立表空间指的是innodb表的一种数据结构 独占表空间:  每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件 ...

  2. Mysql 千万级别数据数据查询

    1.构建数据 --创建MyISAM模式表方便批量跑数据 CREATE TABLE `logs1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `logtype` v ...

  3. mysql数据库千万级别数据的查询优化和分页测试

    原文地址:原创 mysql数据库千万级别数据的查询优化和分页测试作者:于堡舰 本文为本人最近利用几个小时才分析总结出的原创文章,希望大家转载,但是要注明出处 http://blog.sina.com. ...

  4. 从SQL Server到MySQL,近百亿数据量迁移实战

    从SQL Server到MySQL,近百亿数据量迁移实战 狄敬超(3D) 2018-05-29 10:52:48 212 沪江成立于 2001 年,作为较早期的教育学习网站,当时技术选型范围并不大:J ...

  5. mysql处理大数据量的查询速度究竟有多快和能优化到什么程度

    mysql处理大数据量的查询速度究竟有多快和能优化到什么程度 深圳-ftx(1433725026) 18:10:49  mysql有没有排名函数啊 横瓜(601069289) 18:13:06  无 ...

  6. (转载)MYSQL千万级数据量的优化方法积累

    转载自:http://blog.sina.com.cn/s/blog_85ead02a0101csci.html MYSQL千万级数据量的优化方法积累 1.分库分表 很明显,一个主表(也就是很重要的表 ...

  7. DB-SQL-MySQL-杂项-调优:Mysql千万以上数据优化、SQL优化方法

    ylbtech-DB-SQL-MySQL-杂项-调优:Mysql千万以上数据优化.SQL优化方法 1.返回顶部 1. 1,单库表别太多,一般保持在200以下为宜 2,尽量避免SQL中出现运算,例如se ...

  8. mysql的大数据量的查询

    mysql的大数据量查询分页应该用where 条件进行分页,limit 100000,100,mysql先查询100100数据量,查询完以后,将 这些100000数据量屏蔽去掉,用100的量,但是如果 ...

  9. elasticsearch5.0集群大数据量迁移方法及注意事项

    当es集群的数据量较小的情况下elasticdump这个工具比较方便,但是当数据量达到一定级别比如上百G的时候,elasticdump速度就很慢了,此时我们可以使用快照的方法进行备份 elasticd ...

随机推荐

  1. PHP获得指定日期所在星期的第一天和最后一天

    function getdays($day){ $lastday=date('Y-m-d',strtotime("$day Sunday")); $firstday=date('Y ...

  2. canvas——粒子系统(1)

    这个动画在很早之前就见过,当时就没迷住了.最近在学canavs动画,动手实现了一下.代码在这里.展示效果在这里. 这属于粒子系统的一种,粒子系统就是需要管理一堆粒子嘛,动画实现的关键在于,遍历这些粒子 ...

  3. QString转换为LPTSTR(使用了reinterpret_cast,真是叹为观止,但是也开阔了思路),三篇文章合起来的各种转换方法

    醉了,windows下宏定义了很多char类型 LPTSTR .今天,直接使用,qt报错,真TM费事. 将“CPU”转化为wcha_t * QString str = "CPU"; ...

  4. 零元学Expression Blend 4 - Chapter 14 用实例了解布局容器系列-「Pathlistbox」II

    原文:零元学Expression Blend 4 - Chapter 14 用实例了解布局容器系列-「Pathlistbox」II 本章将延续上一章的范例,步骤解析. 本章将延续上一章的范例,步骤解析 ...

  5. C#从列表中取元素的某个字段组成新的列表

    using System; using System.Collections.Generic; using System.Linq; namespace CSharpDemo { class Prog ...

  6. BAT-把当前用户以管理员权限运行(用户帐户控制:用于内置管理员帐户的管理员批准模式)

    相关资料: http://jingyan.baidu.com/article/72ee561a5dc24fe16138df95.html 网友求助:联想Y400,Win8系统 怎样获得管理员身份 要求 ...

  7. 比快更快——微软LightGBM

    LightGBM介绍 xgboost是一种优秀的boosting框架,但是在使用过程中,其训练耗时过长,内存占用比较大.微软在2016年推出了另外一种boosting框架--lightgbm,在不降低 ...

  8. Java程序员的现代RPC指南(Windows版预编译好的Protoc支持C++,Java,Python三种最常用的语言,Thrift则支持几乎主流的各种语言)

    Java程序员的现代RPC指南 1.前言 1.1 RPC框架简介 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦.于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大 ...

  9. 发布Qt Widgets桌面应用程序的方法(自定义进程步骤,用QT Creator直接生成)

    发布Qt Widgets桌面应用程序的方法 Qt是一款优秀的跨平台开发框架,它可以在桌面.移动平台以及嵌入式平台上运行.目前Qt 5介绍程序发布的文章帖子比较少.大家又非常想要知道如何发布Qt应用程序 ...

  10. QTableWidget简单应用之文件浏览器

     实现下面这个简单的文件浏览功能,常用的QTableWidget设置都用到了.  基本设置 ui->tableWidget->setColumnCount(5); //设置表格列数 ui- ...