首页 > 区块链 > 区块链 > 全量同步 Elasticsearch 方案之 Canal
Canal 是阿里的一款开源项目,纯
Java 开发。基于数据库增量日志解析,提供增量数据订阅 & 消费,目前主要支持了
MySQL(也支持
mariaDB)。

Canal 除了支持
binlog 实时
增量同步 数据库之外也支持
全量同步 ,本文主要分享使用 Canal 来实现从 MySQL 到 Elasticsearch 的全量同步;
可通过使用
adapter 的
REST 接口手动触发
ETL 任务,实现全量同步。
在执行全量同步的时候,同一个
destination的增量同步任务会被 阻塞,待全量同步完成被阻塞的增量同步会被 重新唤醒
adapter 的
ETL 接口为:
/etl/{type}/{task}
8081
例子:
curl -X POST http://127.0.0.1:8081/etl/es7/sys_user.yml
执行成功输出:
{"succeeded":true,"resultMessage":"导入ES 数据:17 条"}
当同步的数据量比较大时,执行一段时间后会出现下图的错误

查看
canal 源码得知当同步的数据量大于 1w 时,会分批进行同步,每批 1w 条记录,并使用多线程来并行执行任务,而
adapter 默认的连接池为 3,当线程获取数据库连接等待超过 1 分钟就会抛出该异常。
线程数为当前服务器 cpu 的可用线程数
修改
adapter 的
conf/application.yml 文件中的
srcDataSources 配置项,增加
maxActive 配置数据库的最大连接数为当前服务器 cpu 的可用线程数
cpu 线程数可以下命令查看
grep 'processor' /proc/cpuinfo | sort -u | wc -l
当同步的表字段比较多时,几率出现以下报错

由于
adapter 的表映射配置文件中的
commitBatch 提交批大小设置过大导致 (6000)
修改
adapter 的
conf/es7/xxx.yml 映射文件中的
commitBatch 配置项为 3000
三千万的数据量用时 3.5 小时左右

由于当数据量大于 1w 时
canal 会对数据进行分批同步,每批 1w 条通过分页查询实现;所以当数据量较大时会出现深分页的情况导致查询非常慢。
预先使用 ID、时间或者业务字段等进行数据分批后再进行同步,减少每次同步的数据量。
使用 ID 进行数据分批,适合增长类型的 ID,如自增 ID、雪花 ID 等;
计算过程:
(1) 计算同步的次数
总数据量 / 每次同步量 = 10
(2) 计算每批 ID 的增量值
(最大ID - 最小ID) / 次数 = 847405488993555.9
(3) 计算每批 ID 的值
最小ID + 增量值 = ID2ID2 + 增量值 = 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;ID2curl -X POST http://127.0.0.1:8081/etl/es7/sys_user.yml?params=ID2;ID3...
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70019616/viewspace-2905622/ ,如需转载,请注明出处,否则将追究法律责任。