跳至主要內容

用 Canal 实现异构数据库同步

Hirsuntech大约 9 分钟

用 Canal 实现异构数据库同步

什么是异构数据

1734957498605.png
1734957498605.png
  • 定义:异构数据指的是结构不同的数据。
  • 例子:在实际工作中,数据主要存储在 MySQL 中,但 MySQL 在进行全文检索时性能不佳,这时通常会使用 Elasticsearch 或 Solr 这样的全文检索引擎。

异构数据的实际应用场景 -> 电商平台

  • 商户通过后台系统添加商品到 MySQL 数据库。
  • 为了让消费者能够查询到商品,需要将数据同步到 Elasticsearch 中。
  • MySQL 和 Elasticsearch 的数据存储结构不同,因此称为异构数据。

异构数据带来的组织结构问题

团队分工:

  • 商品管理由团队 A 负责,数据查询由团队 B 负责。
  • 团队 B 负责 Elasticsearch 的数据维护和管理。

传统的同步方式及其问题: 在 Java 代码中进行修改,在新增 MySQL 数据时,同时调用团队 B 提供的接口进行 Elasticsearch 数据同步。

问题:

  • 强耦合:团队 A 需要了解团队 B 的接口参数、传输规则和响应,增加了团队 A 的工作量。
  • 扩展困难:如果新增团队 C 负责 MongoDB 的数据维护,团队 A 需要额外对接团队 C 的接口,增加了工作复杂度和协调难度。

解决方案目标

  • 数据准实时同步:在几百毫秒或几秒钟内完成数据同步。
  • 组织结构解耦:减少团队 A 调用其他团队接口的工作量。

解决方案工具:Canal

Canal 简介

  • 由阿里巴巴开源,用于监听数据库增量日志并进行数据订阅消费。
  • 支持 MySQL 和 MariaDB。

Canal 的工作原理

1734957920776.png
1734957920776.png
  • MySQL 主从同步通过 binlog(Binary Log)实现。
  • binlog 记录 SQL 语句,MySQL 从库通过 relay log 重放这些 SQL 语句实现数据同步。
  • Canal 作为一个“假”从库,监听主库的 binlog,并触发指定的 Java 代码进行数据同步。

局限性与进一步解决方案:消息队列(MQ)

Canal 的局限性:仅解决数据监听问题,未解决团队之间的解耦问题。

引入消息队列(MQ)

  • MQ 的作用:消息的订阅和发布。
  • 架构图
    • 团队 A 负责将数据变化转换为消息并发送到 MQ。
    • 团队 B 和其他团队订阅 MQ 消息队列,根据消息类型和内容进行相应的数据处理。
1734966151612.png
1734966151612.png

完整的异构数据迁移过程

  1. 数据变化监听:团队 A 在 MySQL 上配置 Canal 监听商品库的数据变化。
  2. 消息生成与发送:数据变化时,Canal 生成相应的消息(新增、修改、删除)并发送到 MQ。
  3. 消息订阅与处理
    • 团队 B 订阅 MQ 消息队列,接收消息后进行 Elasticsearch 数据同步。
    • 新增团队(如团队 C)只需订阅相同的消息队列,无需与团队 A 直接对接。

通过 MQ 实现团队间解耦

  • 团队 A 只需将数据变化放入 MQ,不再关心其他团队的 API 接口。
  • 新增团队只需订阅消息队列,独立处理数据同步逻辑。
  • 实现了真正的解耦,提高了开发效率和系统扩展性。

结论

异构数据迁移

  • 通过 Canal 和 MQ 的结合,实现了异构数据的准实时同步和团队间的解耦。
  • 这种架构设计解决了传统方式中的强耦合和扩展困难问题,提高了系统的灵活性和可维护性。