【IT老齐014】阿里Canal实现MySQL异构数据同步
场景
商户在后台系统添加数据,消费者需要在前台获取数据。这时候需要将后台的数据同步到es中。mysql的数据跟es存储的数据不一样,称为异构数据。
原始做法:团队A在java代码中新增mysql数据时,调用团队B的接口新增es商品数据。
缺点:
- 协作中两个团队存在代码强耦合。
- 扩展困难,第三方同步数据需要再次修改代码。
目标实现:数据能做到实时同步,团队间解耦,团队A不用多次调用接口。
数据监听
回顾mysql数据库的主从同步的功能。
用户新增、删除数据,主库执行完相应sql语句后,会将sql记录到binlog中。主库将binlog传给从库,从库接收到binlog的sql,将其写入relaylog(重放日志)中。从库执行relaylog的sql语句,就此实现同步。最后从库还会将执行relaylog的sql语句写入从库的binlog中。
Canal:阿里巴巴中间件,基于db增量日志解析,提供增量数据订阅和消费
引入Canal,相当于从库被Canal代替(假的mysql从库,主要监听主库的binlog,relaylog的sql语句)
通过Canal的配置文件,当获取新的数据时,自动触发指定的java代码完成同步工作。
应用解耦
引入MQ,解决解耦问题。
团队A新增删除数据,将消息发到MQ,其他团队从MQ订阅消息。
常见问题
- 团队c来了之后只能从订阅MQ开始获取新数据,团队B之前已经获取的那些数据团队c怎么得到?
- 历史离线同步
- 主从同步失败的概率怎么判断,canal的可靠性能达到什么程度?
- 按binlog偏移量重新同步
- 如果源端表做了水平拆分和垂直拆分,canal能实现对这种表的合并处理吗?
- 可以,原则上只要能挂Slave的,Canal都可以搞定
- canal到kafka的消息是有序的,但假如kafka到消费端的消息由于网络原因从AB变成BA的话,该怎么办呢?
- kafka,本身是支持有序的,但是有序的代价就是牺牲性能