基于canal实现跨数据库订阅

天涯浪子 提交于 2019-12-03 12:11:42

文章内容

  1. canal项目介绍
  2. canal server部署实践
  3. canal client应用示例
  4. 总结

1.canal项目介绍

项目地址:https://github.com/alibaba/canal

wiki文档:https://github.com/alibaba/canal/wiki

简单来说,canal的原理就是模拟一个slave客户端与数据库(master)进行通信,以binlog的方式实现对原始数据的订阅,并对binlog推送数据进行解析,打包,推送给同样关注此记录的canal client,client 拿到最新数据进而完成下游业务逻辑;

参考以下“MySQL主备复制实现”:

canal简单架构图:

这里写图片描述

由于canal与业务数据库的交互只是通过binlog的方式,所以对于业务数据库性能影响甚小;只会有很小的数据传输的开销;

对于,要实现具体的业务逻辑,我们需要实现相应的客户端(canal client)功能,由于canal提供客户端开发SDK(java),这样我们只需要关注于具体的业务逻辑,关注数据该处理;

canal已经运用在很多阿里云产品中,最典型的就是数据传输服务DTS

2. canal server部署实践

以下以单实例模式介绍canal server的部署

参考:QuickStart

整理步骤如下:

  1. 数据库(master)初始化
    1.1 开启binlog日志
    1.2 创建用户并授权

  2. server安装
    2.1 下载canal
    2.2 修改配置
    2.3 启动server并测试连接

其中有如下几点需要注意:

1.关于binlog模式选择

binlog-format=ROW #选择row模式

除了推荐的方式,还有一种常用的方式为MIXED,如果设置为MIXED模式,canal client只能获取到更新的字段数据,比如,有一张用户表(user),包含用户名(user_name),性别(sex)…如果用户只修改了用户名,那么对应的客户端也只能获取到用户名的最新数据;这种方式有它的优势和劣势,需要分情况而定;

2.关于server版本选择

刚开始选择的是v1.0.25,但是在服务启动之后,在与master数据库交互的过程中会报错,使用v1.0.24或者之后的版本是个不错的选择;

3.关于数据库编码和表过滤规则

编码一般为UTF-8
过滤规则(canal.instance.filter.regex)需要注意“\”转义

3. canal client应用示例

应用场景

微服务平台下,每个服务独享自己的数据库,然而跨服务的数据聚合查询又必不可少,比如全局搜索,报表等;于是,通过canal将不停数据库中的数据订阅同步到一个专门完成查询功能的数据库(这也是一种很好的弥补微服务不足的方式);

这里以同步到ES为例

源码参考:github.com/Aavon/EsCanalSync

此客户端的处理逻辑大致为:
1. 订阅canal server,获取数据库修改(ROW模式);
2. 通过ElasticSearch提供的bulk api批量更新或者创建文档;
3. 业务接口通过ElasticSearch接口实现自定义查询;

4. 总结

canal最显著的特点(优势)体现在它对业务代码的入侵几乎为0,同时,能以很小的代价实现数据的同步;下游的应用场景也非常的丰富,除了之前的提到的与ES的同步,可以应用在缓存失效或更新,数据库备份等;
结合HA部署方案或者otter分布式数据库同步系统,能够建立稳定可靠的实时数据同步平台;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!