一、前言

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

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

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

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

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

二、ETL接口

adapter 的 ETL 接口为:/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. 解决方式

修改 adapter 的 conf/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. 解决方式

修改 adapter 的 conf/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. SwiftUI error All In One

    SwiftUI error All In One Instance member xxx cannot be used on type yyy Instance member 'game' canno ...

  2. pure CSS waterfall layout

    pure CSS waterfall layout 纯 CSS 瀑布流布局 flex layout .container{} .item{} https://caniuse.com/?search=c ...

  3. CSS3 & Flex Layout All In One

    CSS3 & Flex Layout All In One demos https://www.cnblogs.com/xgqfrms/p/10769302.html .flex-contai ...

  4. npm published cli package's default install missing the `-g` flag

    npm published cli package's default install missing the -g flag https://npm.community/t/npm-publishe ...

  5. Chrome & install App & PWA

    Chrome & install App & PWA Chrome & install website as an app chrome://apps https://medi ...

  6. MBP & battery

    MBP & battery 实际:3 + 1 个小时左右 4 个小时左右 shit apple 10 小时 Chrome bug https://appleinsider.com/articl ...

  7. Flutter: redux简单使用

    Pub redux flutter_redux import 'package:flutter/material.dart'; import 'package:redux/redux.dart'; i ...

  8. VAST生态驱动下,NGK算力增量效应初现!

    VAST维萨币上线的消息放出来之后,NGK算力的价格一直在上涨,其实这也不难理解,因为VAST维萨币需要VAST星光值进行兑换,VAST星光值又需要SPC算力福利代币进行挖矿释放的,SPC算力福利代币 ...

  9. pycharm + git+gitlab的可视化界面操作

    前言: 写这篇博​​客,主要为了记录一套经过本人实践,并运行通过的操作gitlab流程. 通过以下步骤,可实现最基本的远程服务器(gitlab)和本地工具(pycharm)的,针对两端文件增删改查的及 ...

  10. 刚学会 C++ 的小白用这个开源框架,做个 RPC 服务要多久?

    本文适合有 C++ 基础的朋友 本文作者:HelloGitHub-Anthony HelloGitHub 推出的<讲解开源项目>系列,本期介绍基于 C++ 的 RPC 开源框架--rest ...