基于canal实现的数据报送系统
场景
最近做的一个项目要求像三方平台实时报送数据,因为以后对接的三方平台可能会很多,所以想在对原系统的业务没有侵入的情况下完成数据的推送
当时第一想法再写一个数据传输系统连接业务数据库通过定时的方式不断抓取新数据,但是这样的问题是数据不具备实时性,并且增加了业务数据库的压力
又不想在原数据库上直接操作,那只有依赖于mysql主从复制的机制,对比了一些现有的开源项目,最后还是选择了阿里的 canal
MySQL主备复制原理
- MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
- MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
- MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
canal 工作原理
- canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
- MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
canal 解析 binary log 对象(原始为 byte 流)*
整体的架构图
-
mysql 就是业务数据库 也是数据源
-
canal 用于实时同步数据
-
mq 用来保证即使下游处理失败数据也不丢失,而且可以控制多表的插入顺序( 因为当数据跨多张表时需要保证数据的完整性,下文中的事件发布时基于单表的(insert 、 update)产生的,可以使用延时队列保证数据的问整形 )
-
通讯平台负责数据传输
核心功能大概下面这几个
监听队列信息 -> sql生成-> 数据持久化 -> 事件发布 -> 具体的观察者处理数据->日志记录->数据传输->日志记录
现存的问题:
mysql 的主从复制是基于行的导致数据库字段改动时需要两个数据库同时更改