首先介绍下canal他可以做什么,基于日志增量订阅&消费支持的业务, 监控mysql数据,将mysql增量数据从binlog中获取过来实现数据库的镜像、数据库实时备份、多级索引、业务cache刷新等,具体参考阿里开源项目代码:
canaldbkafka
简介
canaldbkafka是连接canal和kafka的一个中间件。目的是实现数据库某个表格数据变更转变成消息流的形式,以便后续业务消费kafka的消息流。 canal wiki:https://github.com/alibaba/canal/wiki
消息的类型
canal的binlog 会被解析成以下3中类型的消息。其他的类型被过滤掉了。
insert
1 | { |
delete
1 | { |
update
data对象是各字段类型、是否被更新、值。olddata对象是之前的状态。
1 | { |
使用说明
编译安装
1 | mvn compile |
启动说明
已startmy.sh为例
1 | #!/bin/bash |
- testdb 是canal配置的destination
- thetable kafka的具体topic
- 127.0.0.1:2181 是canal配置HA 对应的zookeeper的地址
- 127.0.0.1:9092 是kafka的地址
使用注意事项
- mysql binlog模式设置为row模式
- 为了保证数据库消息的顺序性,将消息存储kafka的时候组件采用了同步的方式
- canal 必须配置zookeeper ha的模式 https://github.com/alibaba/canal/wiki/AdminGuide#ha%E6%A8%A1%E5%BC%8F%E9%85%8D%E7%BD%AE
- 之前使用针对的是数据库中的一个表在canal配置中已经过滤所以消息中没有表名 可以说是个设计的缺陷。
高可用及分布式
监控多个mysql
canal分服务端和客户端,我们需要监控多个mysql时,可以配置多个instance,具体编辑服务端配置文件canal.properties:
1 | ################################################# |
其中dest21和dest14为不同的instance,目录结构如下:
1 | -rwxr-xr-x 1 root root 2882 Aug 27 18:44 canal.properties |
dest14和dest21目录分别为监控不同mysql的配置文件放置位置,具体如下:
1 | ################################################# |
你需要修改的地方:
1 | canal.instance.mysql.slaveId -- 不同的instance分配不同的slaveId,因为canal监控mysql的原理就是伪装成mysql的slave来获取binlog日志的 |
其中监控mysql的哪个库哪个表编写格式如下:
1 | .*\\..* --表示监控mysql所有库所有表 |
阿里巴巴,我们程序员的梦想,开源的canal还是不错的,希望大家借助这篇文章能够熟练掌握canal的简单使用,如果遇到什么问题,欢迎一起讨论,在下方留言或者mail我:chenzuoli@gmail.com
书山有路勤为径,学海无涯苦作舟。
欢迎关注微信公众号:【程序员写书】
喜欢宠物的朋友可以关注:【电巴克宠物Pets】
一起学习,一起进步。
