文章内容
- canal项目介绍
- canal server部署实践
- canal client应用示例
- 总结
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
整理步骤如下:
数据库(master)初始化
1.1 开启binlog日志
1.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分布式数据库同步系统,能够建立稳定可靠的实时数据同步平台;
来源:CSDN
作者:villare
链接:https://blog.csdn.net/villare/article/details/80973525