今天我们来聊聊如何用 Spring Boot 整合 Canal 和 RabbitMQ 来监听 MySQL 的 binlog 数据变更。
这种架构其实在很多大数据系统或者微服务架构中都被广泛应用,尤其是在需要实时同步数据库变更的场景中,能大大提升数据一致性和系统性能。
一、架构设计概述
在这个场景中,Canal 作为 MySQL binlog 的监听者,能够捕获数据库表的所有变化(比如插入、更新、删除)。这些变化会通过 RabbitMQ 发送到消息队列中,其他服务可以异步消费这些数据并进行处理,比如更新缓存、触发后续业务逻辑等。这个架构有很多好处,尤其是在解耦和异步处理上,系统的稳定性和扩展性都能得到有效提升。
二、环境搭建
首先,想要让这个架构运作起来,我们需要在本地搭建一些基本环境:MySQL、RabbitMQ 和 Canal。
1. MySQL 配置
MySQL 要开启 binlog,且建议采用 ROW
格式,这样才能捕获表中每一行数据的变动,而不是简单的语句变动。可以通过以下命令来检查 MySQL 是否已经启用了 binlog:
SHOW VARIABLES LIKE 'log_bin'; -- 确保返回的值是 ON
SHOW VARIABLES LIKE 'binlog_format'; -- 确保是 ROW 格式
2. RabbitMQ 配置
RabbitMQ 是我们的消息队列,用于传输数据变更记录。在 Docker 中启动 RabbitMQ 非常简单,下面是一个 docker-compose.yml
示例:
version: '3.1'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "3306:3306"
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"
canal:
image: canal/canal-server
ports:
- "11111:11111"
environment:
- CANAL_ADAPTERS=canal-adapter-rabbitmq
3. Canal 配置
Canal 监听 MySQL 的 binlog 并将变化发送到 RabbitMQ。首先,我们需要配置 Cana