基于canal的client-adapter数据同步必读指南

基于canal的client-adapter数据同步必读指南

本文将介绍canal项目中client-adapter的使用,以及落地生产中需要考虑的可靠性、高可用与监控报警。(基于canal 1.1.4版本)

 

canal作为mysql的实时数据订阅组件,实现了对mysql binlog数据的抓取。

虽然阿里也开源了一个纯粹从mysql同步数据到mysql的项目otter(github.com/alibaba/otter,基于canal的),实现了mysql的单向同步、双向同步等能力。但是我们经常有从mysql同步数据到es、hbase等存储的需求,就需要用户自己用canal-client获取数据进行消费,比较麻烦。

从1.1.1版本开始,canal实现了一个配套的落地模块,实现对canal订阅的消息进行消费,就是client-adapter(github.com/alibaba/canal/wiki/ClientAdapter)。

目前的最新稳定版1.1.4版本中,client-adapter已经实现了同步数据到RDS、ES、HBase的能力。

1. Client-Adapter基本能力

目前Adapter具备以下基本能力:

  • 对接上游消息,包括kafka、rocketmq、canal-server
  • 实现mysql数据的增量同步
  • 实现mysql数据的全量同步
  • 下游写入支持mysql、es、hbase

2.Client-Adapter架构

Adapter本质上是为了将canal-server订阅到的实时增量数据进行消费,所以必须有上游canal-server产生数据。

整体架构如下:

基于canal的client-adapter数据同步必读指南

 

3. 迁移与同步配置(以Mysql为例)

官方文档地址:github.com/alibaba/canal/wiki/Sync-RDB

下面给出实践过程中的注意事项。

3.1 参数配置

1)总配置文件application.yml

基于canal的client-adapter数据同步必读指南

 

说明:

  • 一份数据可以被多个group同时消费, 多个group之间会是一个并行执行, 一个group内部是一个串行执行多个outerAdapters, 比如例子中logger和hbase
  • 目前client adapter数据订阅的方式支持两种,直连canal server 或者 订阅kafka/RocketMQ的消息
  • zookeeperHosts填了以后,可以支持分布式锁;如果对接Canal-Server为集群模式,那么还是需要填写的,具体原因见下面高可用部分。

2)对应任务的Adapter配置

同步到mysql去的任务配置在conf/rdb路径下,本文使用的任务配置文件名叫 mysql1.yml

基于canal的client-adapter数据同步必读指南

 

注意!targetPk下面填的是源主键和目标主键的映射关系, srcPk:targetPk。

3)日志格式修改

logback.xml中默认日志等级为debug,线上使用时,记得改到info,否则日志会打爆

3.2 增量同步能力

1) DML 增量同步

完成上面的配置,启动后就能正常订阅增量数据了。Adapter能够接收到mq到信息,并在目标库投递成功。

具体会打出如下日志。

基于canal的client-adapter数据同步必读指南

 

2)DDL同步

如果需要使用DDL同步能力,必须在rdb中配置mirroDb为true才可以。

基于canal的client-adapter数据同步必读指南

 

3.3 全量同步能力

Adapter提供了全量同步的能力,具体操作可以参考官网 github.com/alibaba/canal/wiki/ClientAdapter中的3.2节。

这里我们使用命令

curl http://127.0.0.1:8081/etl/rdb/mysql1/mysql1.yml -X POST 

输出结果如下

基于canal的client-adapter数据同步必读指南

 

4. 动态配置

4.1 任务开关

curl http://127.0.0.1:8081/syncSwitch/dts-dbvtest-insertdata/on -X PUT

如果在application.yml里面配置了zk地址,那么会使用分布式开关,这个任务开关会注册到zk上,对任意机器执行开关,会把所有同样任务的机器进行启停。

相关源码实现如下:

  • 获取zk上的任务开关状态信息
  • 如果是false,就断开连接
基于canal的client-adapter数据同步必读指南

 

4.2 配置变更

1)本地配置文件

adapter默认是读取本地的配置文件进行配置的。

有个比较意外的地方,就是修改配置文件,任务会自动刷新配置,实现了动态配置。

我们看下实现原理。

  • 继承了FileAlterationListenerAdaptor
  • 发现文件变更后
  • 销毁目前的canalAdapterService
  • 刷新contextRefresher
  • sleep 2秒
  • 重新初始化canalAdapterService
基于canal的client-adapter数据同步必读指南

 

最终日志会打印

基于canal的client-adapter数据同步必读指南

 

2)基于mysql的远程配置

如果配置了多个adapter,可以采用mysql存储配置信息,实现全局统一的配置。

这个的实现原理也比较简单:

  • 本地异步线程轮训mysql
  • 如果有更新就将更新的配置写入本地配置文件
  • 动态更新

5. 数据可靠性分析

5.1 ack机制

Adapter的一个任务采用一个多线程模型。

  • 主线程抓取mq的message写入队列queue,CountDownLatch等待
  • 异步线程poll队列queue,投递下游
  • 投递成功后,主线程释放latch,向mq返回ack

这里需要注意,这里同步的行为是重新执行一次,比如update一行数据,如果目标库由于某种原因没有这条数据的主键id,导致update返回0,也是认为消费成功了

5.2 重试机制

application.yml里面的retries参数用于从queue队列poll后,投递下游的重试。

需要仔细权衡一下,重试间隔0.5s,可以设置个x次,避免网络抖动丢失数据。

重试次数到了,会自动ack。所以这里在使用过程中需要注意采集失败的日志,及时报警提醒。

6. 性能问题分析

具体性能要求还是需要通过压测来得到结论。

这里给出两个从源码中看到的性能优化相关的点。

6.1 全量同步多线程

全量同步的时候,同步效率是一个值得考虑的问题。

adapter对全量数据同步效率做了一些设计,当全量同步数量大于1W会开多线程,代码如下所示:

基于canal的client-adapter数据同步必读指南

 

但是这里有个mysql的深分页的问题,可以注意一下,会对源数据库造成比较大的性能压力。

6.2 全量同步select *

全量同步的另一个效率问题,就在于select * ,避免客户端内存被打爆。

看了下源码,果然也已经考虑了这个问题,开启了JDBC的流式查询。

基于canal的client-adapter数据同步必读指南

 

7. 监控告警

如果要在生产使用,少不了监控告警的辅助。

虽然Adapter不像canal-server那样提供了监控指标的相关api,但是我们还是可以做一些辅助的监控告警。

1) mq的消息堆积告警

利用mq已有的topic下的堆积告警,如果Adapter出现故障,造成了mq的消息堆积,可以及时发现。

2) 日志异常告警

Adapter有自己的日志格式,可以跟已有监控系统确认下日志收集的配置方式与日志解析格式。

然后通过修改 conf/logback.xml的pattern来修改日志的打印格式,进行配置采集。

8. 高可用

通过源码阅读发现

tcp模式支持通过zk做HA(非自身高可用),mq模式不支持zk做HA

基于canal的client-adapter数据同步必读指南

 

TCP模式需要HA跟我们的HA理解又不太一样。

因为需要直接对接上游的Canal-Server,而Canal-Server的HA会导致ip变化,所以adapter的tcp模式的HA是为了支持这个,可以监听IP变化,对接不同的上游server,并不是自身的高可用架构。

而MQ模式本身是不支持HA的。

但是,我们如果我们对接上游MQ的模式,就可以做一个取巧的高可用。

目前从binlog抓取mq以后,只会投递到指定topic的一个队列中(即使哈希做了多队列,道理也一样),因此,mq消费时采用集群模式,就会只有一个client能够顺序消费对应队列中的消息。

这样,我们部署两台adapter,有两个mq的消费者同时运行,正常情况下,只会有一台机器在消费任务,一旦一台机器挂了,mq会自动用另一台机器的任务进行继续消费。做了一个简易的高可用。

基于canal的client-adapter数据同步必读指南

 

缺点也比较明显,任务无法负载均衡,只能跑在一台机器上

因此,需要考虑分多个消费者组进行任务处理。

 

推荐阅读:

canal十分钟入门

canal集群版 + admin控制台 最新搭建姿势

canal源码分析大纲

 

都看到最后了,原创不易,点个关注,点个赞吧~

文章持续更新,可以微信搜索「阿丸笔记 」第一时间阅读,回复关键字【学习】有我准备的一线大厂面试资料。

知识碎片重新梳理,构建Java知识图谱:
github.com/saigu/JavaK…(历史文章查阅非常方便)

 

 
 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2609.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 用HTML+CSS做一个漂亮简单的个人网页

    用HTML+CSS做一个漂亮简单的个人网页1.刚好帮我妹写了一个作业做一个个人网页设计,简单的三个小页面,就从网上随便找了图片自己随便设计了下东拼西凑哈哈哈!!!可能有点low但是对她来说或者需要做简单的个人网站应该就够了吧!图片是从站酷上面找的(因为我不会设计图),如果有侵权了什么的请联系我立刻马上删掉哈!(首页的首屏有下雪了的特效,右下角有音乐播放提示)2.先看一下效果哈!效…

  • 解决java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have availa[通俗易懂]

    解决java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have availa[通俗易懂]解决java.lang.RuntimeException:com.netflix.client.ClientException:Loadbalancerdoesnothaveavailableserverforclient:xxx-xxx-xxx小弟第一次发博客,不喜勿喷,工作经验(1个月)各位大佬你们,最近在接触微服务项目,在运行的过程中遇到许多问题,第一次写博客,就发…

  • JavaScript 引擎性能比较之一SpiderMonkey[通俗易懂]

    JavaScript 引擎性能比较之一SpiderMonkey[通俗易懂]1.下载https://people.mozilla.org/~sstangl/mozjs-31.2.0.rc0.tar.bz2bunzip2mozjs-31.2.0.rc0.tar.bz2tarxvfmozjs-31.2.0.rc0.tar2.构建https://developer.mozilla.org/en-US/docs/Mozilla/Projects/

  • 投影矩阵 视图模型矩阵「建议收藏」

    投影矩阵 视图模型矩阵「建议收藏」
        OpenGL在设置场景时,要用到两个矩阵:投影矩阵和模型视图矩阵通过glMatrixMode来指定下面的矩阵操作是针对哪一个矩阵进行的。
        gluLookatup,glTranslate,glRotate,glScale,glOrtho,gluPerspective等函数只根据其参数计算出一个矩阵M,然后与当前的栈顶元素T相乘;但这些函数本身不能自动找到应该对应的矩阵堆栈,你可以将它们放在任何矩阵堆栈操作中,比如可以将gluLookatup放在glMat

  • PyCharm几个常用的快捷键「建议收藏」

    PyCharm几个常用的快捷键「建议收藏」咪哥杂谈本篇阅读时间约为3分钟。1前言PyCharm作为一款Python语言的代码编辑器,在市场上广为人知。尤其是一些工程性项目来说,PyCharm非常友好。实际上,如果你要是了…

  • 良心推荐JVM性能调优工具

    良心推荐JVM性能调优工具良心推荐JVM性能调优工具该工具源于几年前关注的一个阿里大佬专做jvm性能调优,现在已经创业开发出社区版的在线性能调优!我觉得很香就推荐给大家!工具地址https://console.perfma.com/下面简单介绍社区版三个产品XXFox-Java虚拟机参数分析参数查询:查询指定JVM参数的官方定义、使用方法、默认值、专家建议参数检查:对JVM参数的用法,赋值及组合进行正确性与合理性检查参数变迁:给出JVM参数在不同配置环境下推荐取值或替代参数参数优化:全面诊断JVM参数,给出综

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号