全量同步Elasticsearch方案之Canal

一、前言
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等;
- 查出 最小ID、最大ID 与 总数据量
- 根据每批数据量大小计算每批的 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的更多相关文章
- Logstash学习之路(四)使用Logstash将mysql数据导入elasticsearch(单表同步、多表同步、全量同步、增量同步)
一.使用Logstash将mysql数据导入elasticsearch 1.在mysql中准备数据: mysql> show tables; +----------------+ | Table ...
- Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录
在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景:每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备份 ...
- Mysql数据同步Elasticsearch方案总结
Mysql数据同步Elasticsearch方案总结 https://my.oschina.net/u/4000872/blog/2252620
- git 全量同步分支
当前分支是maser分支,我想将stable分支上的代码完全覆盖brush分支,首先切换到brush分支. git reset --hard origin/stable 执行上面的命令后brush分支 ...
- 将mysql数据同步到ES6.4(全量+增量)
下载安装包时注意下载到指定文件夹 这里我放在OPT文件夹下一:安装logstash进入到opt文件夹打开终端 执行以下命令wget -c https://artifacts.elastic.co/do ...
- Elasticsearch 索引的全量/增量更新
Elasticsearch 索引的全量/增量更新 当你的es 索引数据从mysql 全量导入之后,如何根据其他客户端改变索引数据源带来的变动来更新 es 索引数据呢. 首先用 Python 全量生成 ...
- datax实例——全量、增量同步
一.全量同步 本文以mysql -> mysql为示例: 本次测试的表为mysql的系统库-sakila中的actor表,由于不支持目的端自动建表,此处预先建立目的表: CREATE TABLE ...
- Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录
Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳 ...
- solr与mysql数据同步的方案
1.使用activeMQ http://blog.csdn.net/zhou2s_101216/article/details/77855413 2.通过配置实现定时同步 http://blog.cs ...
随机推荐
- npm 安装 electron 失败的解决方案
npm 安装 electron 失败的解决方案 shit GFW npm 安装 electron 失败 解决方案 https://www.npmjs.com/package/nrm $ nrm ls ...
- vue mixin执行覆盖
https://cn.vuejs.org/v2/guide/mixins.html 完整代码 vue-option-overwrite-strategies vue 自带的mixin如果钩子函数重复会 ...
- 如何理解NGK的Layer2-侧链?
对于 NGK来说,Layer-2越来越重要,并成为共识.但是,"Layer-2" 是个不精确的标签.有些人说起 "Layer-2" 时,仅仅指的是 " ...
- Scrapy项目_阳光热线问政平台
目的: 爬取阳光热线问政平台问题中每个帖子的标题.详情URL.详情内容.图片以及发布时间 步骤: 1.创建爬虫项目 1 scrapy startproject yangguang 2 cd yangg ...
- 无情面试官之包含min函数的栈
0 我是一个无情的面试官. 面人无数,挂人无数. 若想过我的面试,标准只有一个,那就是公司很缺人. 招新人,填旧坑. 1 今天是我的第1001次当面试官,要求却不是千里挑一,而是一击必中. 因为我招聘 ...
- Dokcer中Mysql的数据导入导出
导出 1.首先进入容器,输入提取数据库文件命令 mysqldump -u root -p rw 数据库名> 输出.sql,提取到当前容器 2.退出容器,进入linux:输入拷贝命令 docker ...
- vue子组件的样式没有加scoped属性会影响父组件的样式
scoped是一个vue的指令,用来控制组件的样式生效区域,加上scoped,样式只在当前组件内生效,不加scoped,这个节点下的样式会全局生效. 需要注意的是:一个组件的样式肯定是用来美化自己组件 ...
- CSS实现页面切换时的滑动效果
最近在开发手机端APP页面功能时遇到一个需求:某个页面查询的数据有三种分类,需要展示在同一页面上,用户通过点击分类标签来查看不同类型的数据, 期望效果是 用户点击标签切换时另一个页面能够以一个平滑切入 ...
- MySQL like查询使用索引
在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万级,千万级的时候,查询的效率就很容易显现出来.这个时候查询的效率就 ...
- 基于docker搭建gitlab
一.概述 GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目. 它拥有与Github类似的功能,能够浏览 ...