【IT老齐014】阿里Canal实现MySQL异构数据同步

发布时间 2023-04-25 19:39:53作者: Faetbwac

【IT老齐014】阿里Canal实现MySQL异构数据同步

场景

1682412429245

商户在后台系统添加数据,消费者需要在前台获取数据。这时候需要将后台的数据同步到es中。mysql的数据跟es存储的数据不一样,称为异构数据。

原始做法:团队A在java代码中新增mysql数据时,调用团队B的接口新增es商品数据。

缺点:

  • 协作中两个团队存在代码强耦合。
  • 扩展困难,第三方同步数据需要再次修改代码。

目标实现:数据能做到实时同步,团队间解耦,团队A不用多次调用接口。

数据监听

1682421097531

回顾mysql数据库的主从同步的功能。

用户新增、删除数据,主库执行完相应sql语句后,会将sql记录到binlog中。主库将binlog传给从库,从库接收到binlog的sql,将其写入relaylog(重放日志)中。从库执行relaylog的sql语句,就此实现同步。最后从库还会将执行relaylog的sql语句写入从库的binlog中。

1682422190711

Canal:阿里巴巴中间件,基于db增量日志解析,提供增量数据订阅和消费

引入Canal,相当于从库被Canal代替(假的mysql从库,主要监听主库的binlog,relaylog的sql语句)

通过Canal的配置文件,当获取新的数据时,自动触发指定的java代码完成同步工作。

应用解耦

1682421339382

引入MQ,解决解耦问题。
团队A新增删除数据,将消息发到MQ,其他团队从MQ订阅消息。

常见问题

  • 团队c来了之后只能从订阅MQ开始获取新数据,团队B之前已经获取的那些数据团队c怎么得到?
    • 历史离线同步
  • 主从同步失败的概率怎么判断,canal的可靠性能达到什么程度?
    • 按binlog偏移量重新同步
  • 如果源端表做了水平拆分和垂直拆分,canal能实现对这种表的合并处理吗?
    • 可以,原则上只要能挂Slave的,Canal都可以搞定
  • canal到kafka的消息是有序的,但假如kafka到消费端的消息由于网络原因从AB变成BA的话,该怎么办呢?
    • kafka,本身是支持有序的,但是有序的代价就是牺牲性能