一、前言

Canal 是阿里的一款开源项目,纯 Java 开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了 MySQL(也支持 mariaDB)。

Canal 除了支持 binlog 实时 增量同步 数据库之外也支持 全量同步 ,本文主要分享使用Canal来实现从MySQL到Elasticsearch的全量同步;

可通过使用 adapterREST 接口手动触发 ETL 任务,实现全量同步。

在执行全量同步的时候,同一个 destination 的增量同步任务会被 阻塞,待全量同步完成被阻塞的增量同步会被 重新唤醒

PS:关于Canal的部署与 实时同步 请看文章《Canal高可用架构部署

二、ETL接口

adapterETL 接口为:/etl/{type}/{task}

  • 默认web端口为 8081
  • type 为类型(hbase/es7/rdb)
  • task 为任务名对应配置文件名,如sys_user.yml

例子

curl -X POST http://127.0.0.1:8081/etl/es7/sys_user.yml

执行成功输出:

{"succeeded":true,"resultMessage":"导入ES 数据:17 条"}

三、实践过程中遇到的坑

3.1. 连接池不够

当同步的数据量比较大时,执行一段时间后会出现下图的错误

3.1.1. 原因分析

查看 canal 源码得知当同步的数据量大于1w时,会分批进行同步,每批1w条记录,并使用多线程来并行执行任务,而 adapter 默认的连接池为3,当线程获取数据库连接等待超过1分钟就会抛出该异常。

线程数为当前服务器cpu的可用线程数

3.1.2. 解决方式

修改 adapterconf/application.yml 文件中的 srcDataSources 配置项,增加 maxActive 配置数据库的最大连接数为当前服务器cpu的可用线程数

cpu线程数可以下命令查看

grep 'processor' /proc/cpuinfo | sort -u | wc -l

3.2. es连接超时

当同步的表字段比较多时,几率出现以下报错

3.2.1. 原因分析

由于 adapter 的表映射配置文件中的 commitBatch 提交批大小设置过大导致(6000)

3.2.2. 解决方式

修改 adapterconf/es7/xxx.yml 映射文件中的 commitBatch 配置项为3000

3.3. 同步慢

三千万的数据量用时3.5小时左右

3.3.1. 原因分析

由于当数据量大于1w时 canal 会对数据进行分批同步,每批1w条通过分页查询实现;所以当数据量较大时会出现深分页的情况导致查询非常慢。

3.3.2. 解决方式

预先使用ID、时间或者业务字段等进行数据分批后再进行同步,减少每次同步的数据量。

3.3.3. 案例

使用ID进行数据分批,适合增长类型的ID,如自增ID、雪花ID等;

  1. 查出 最小ID最大ID总数据量
  2. 根据每批数据量大小计算每批的 ID区间

计算过程

  • 最小ID = 1333224842416979257
  • 最大ID = 1341698897306914816
  • 总数据量 = 3kw
  • 每次同步量 = 300w

(1) 计算同步的次数

总数据量 / 每次同步量 = 10

(2) 计算每批ID的增量值

(最大ID - 最小ID) / 次数 = 847405488993555.9

(3) 计算每批ID的值

最小ID + 增量值 = ID2

ID2 + 增量值 = ID3

...

ID9 + 增量值 = 最大ID

(4) 使用分批的ID值进行同步

修改sql映射配置,的 etlCondition 参数:

etlCondition: "where id >= {} and id < {}"

调用etl接口,并增加 params 参数,多个参数之间使用 ; 分割

curl -X POST http://127.0.0.1:8081/etl/es7/sys_user.yml?params=最小ID;ID2

curl -X POST http://127.0.0.1:8081/etl/es7/sys_user.yml?params=ID2;ID3

...

全量同步Elasticsearch方案之Canal的更多相关文章

  1. Logstash学习之路(四)使用Logstash将mysql数据导入elasticsearch(单表同步、多表同步、全量同步、增量同步)

    一.使用Logstash将mysql数据导入elasticsearch 1.在mysql中准备数据: mysql> show tables; +----------------+ | Table ...

  2. Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录

    在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景:每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备份 ...

  3. Mysql数据同步Elasticsearch方案总结

    Mysql数据同步Elasticsearch方案总结 https://my.oschina.net/u/4000872/blog/2252620

  4. git 全量同步分支

    当前分支是maser分支,我想将stable分支上的代码完全覆盖brush分支,首先切换到brush分支. git reset --hard origin/stable 执行上面的命令后brush分支 ...

  5. 将mysql数据同步到ES6.4(全量+增量)

    下载安装包时注意下载到指定文件夹 这里我放在OPT文件夹下一:安装logstash进入到opt文件夹打开终端 执行以下命令wget -c https://artifacts.elastic.co/do ...

  6. Elasticsearch 索引的全量/增量更新

    Elasticsearch 索引的全量/增量更新 当你的es 索引数据从mysql 全量导入之后,如何根据其他客户端改变索引数据源带来的变动来更新 es 索引数据呢. 首先用 Python 全量生成 ...

  7. datax实例——全量、增量同步

    一.全量同步 本文以mysql -> mysql为示例: 本次测试的表为mysql的系统库-sakila中的actor表,由于不支持目的端自动建表,此处预先建立目的表: CREATE TABLE ...

  8. Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录

    Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳 ...

  9. solr与mysql数据同步的方案

    1.使用activeMQ http://blog.csdn.net/zhou2s_101216/article/details/77855413 2.通过配置实现定时同步 http://blog.cs ...

随机推荐

  1. 如何将 js 同步方法转换成异步方法

    如何将 js 同步方法转换成异步方法 // promise export const getUserToken = () => new Promise((resolve, reject) =&g ...

  2. Linux 创建/编辑/查看 文件/文件夹的命令汇总

    Linux 创建/编辑/查看 文件/文件夹的命令汇总 Linux 创建文件的命令Linux,编辑文件的命令Linux 查看文件的命令,touch,vim,vi,gedit,cat,ls -a, ls ...

  3. 如何给 GitHub 添加 SSH key, 如何生成 SSH key 详细图文教程!

    如何给 GitHub 添加  SSH key, 如何生成  SSH key 详细图文教程! 一. 生成  SSH key https://ide.c9.io/xgqfrms/ 创建一个空项目:(或使用 ...

  4. what's the difference amount of pdf, epub, and mobi format

    what's the difference amount of pdf, epub, and Mobi format What is the difference between pdf, epub ...

  5. Python Lambda & Functional Programming

    Python Lambda & Functional Programming 函数式编程 匿名函数 纯函数 高阶函数 # higher-order functions def apply_tw ...

  6. 05.其他创建numpy数组的方法

    >>> import numpy as np >>> np.zeros(10,dtype=int) array([0, 0, 0, 0, 0, 0, 0, 0, 0 ...

  7. ext文件系统机制原理剖析

    本文转载自ext文件系统机制原理剖析 导语 将磁盘进行分区,分区是将磁盘按柱面进行物理上的划分.划分好分区后还要进行格式化,然后再挂载才能使用(不考虑其他方法).格式化分区的过程其实就是创建文件系统. ...

  8. Hadoop生态常用数据模型

    Hadoop生态常用数据模型 一.TextFile 二.SequenceFile 1.特性 2.存储结构 3.压缩结构与读取过程 4.读写操作 三.Avro 1.特性 2.数据类型 3.avro-to ...

  9. 死磕以太坊源码分析之EVM动态数据类型

    死磕以太坊源码分析之EVM动态数据类型 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家交流学习. So ...

  10. 采用lua脚本获取mysql、redis数据以及jwt的校验

    一.安装配置Openresty 1,安装 wget https://openresty.org/download/ngx_openresty-1.9.7.1.tar.gz # 下载 tar xzvf ...