目前绝大多数项目还是采用 mysql 作为数据存储,对于用户访问量较高的网站来说,mysql 读写性能有限,我们通常会把 mysql 中的数据实时同步到 Redis、mongodb、elastic search 等中间件中,应对高并发访问场景,减轻 mysql 压力,防止数据库宕机。在项目开发中,为了不会原有代码进行侵入,采用 canal 中间件实现 mysql 向其它库的实时同步,是一种很不错的方案。
canal 译意为水道/管道/沟渠,主要用途是基于 mysql 数据库增量日志解析,提供增量数据订阅和消费,其工作原理是:模拟 mysql slave 的交互协议,伪装自己为 mysql slave ,向 mysql master 发送 dump 协议,mysql master 收到 dump 请求,开始推送 binary log 给 canal,canal 解析 binary log 提供出对具体表数据的增删改操作内容。
本篇博客将采用 docker-compose 搭建 mysql 和 canal,并采用代码方式演示如果使用 canal 从mysql 中同步数据,监听对数据表的增删改操作。在本篇博客的最后会提供源代码下载。
Canal 的 gitHub 地址为:GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件
一、部署 mysql 和 canal
本篇博客使用虚拟机进行部署,我的虚拟机操作系统是 CentOS7(ip 地址是 192.168.136.128),已经安装好了 docker 和 docker-compose ,首先我们先创建好相关的目录,我创建的主目录是 /app/canal,具体结构如下:
在 /app/canal 创建一个 mysql 目录,在 mysql 下创建一个 data 目录,并创建了 mysql 的配置文件 my.cnf
首先列出 mysql 的配置文件 my.cnf 的内容,主要配置是开启 binlog 日志:
[mysqld] |
|
# 开启 binlog |
|
log-bin=mysql-bin |
|
# canal 需要使用 ROW 模式 |
|
binlog-format=ROW |
|
# 如果你只想同步部分数据库的话,可以进行如下配置 |
|
# 如果同步多个数据库的话,可以配置多行。 |
|
# 如果不配置的话,默认是 mysql 所有库都进行同步 |
|
# binlog-do-db=canaldb |
|
# binlog-do-db=mytestdb |
|
# 不要和 canal 的 slaveId 重复,mysql 默认是 1 |
|
server-id=1 |
|
# 数据目录 |
|
datadir=/var/lib/mysql |
|
symbolic-links=0 |
|
socket=/var/lib/mysql/mysql.sock |
|
log-error=/var/log/mysqld.log |
|
pid-file=/var/run/mysqld/mysqld.pid |
然后在 /app/canal 下创建 docker-compose.yml 文件,内容如下:
version: "3.5" |
|
services: |
|
mysql-server: |
|
image: mysql:5.7.42 |
|
container_name: mysql-server |
|
restart: always |
|
ports: |
|
- 3306:3306 |