1.Canal
介绍
Canal
是阿里巴巴的一个开源项目,基于java
实现,整体已经在很多大型的互联网项目生产环境中使用,包括阿里、美团等都有广泛的应用,是一个非常成熟的数据库同步方案,基础的使用只需要进行简单的配置即可。
Canal
是通过模拟成为mysql
的slave
的方式,监听mysql
的binlog
日志来获取数据,binlog
设置为row
模式以后,不仅能获取到执行的每一个增删改的脚本,同时还能获取到修改前和修改后的数据,基于这个特性,Canal
就能高性能的获取到mysql
数据数据的变更。
Canal
的工作原理就是把自己伪装成MySQL slave
,模拟MySQL slave
的交互协议向MySQL Mater
发送 dump
协议,MySQL mater
收到Canal
发送过来的dump
请求,开始推送binary log
给Canal
,然后Canal
解析binary log
,再发送到存储目的地,比如MySQL
,Kafka
,ElasticSearch
等等。
2. 开启MySQL
主从
Canal
是基于MySQL
的主从同步功能,因此必须先开启MySQL
的主从功能才可以。
这里以之前用Docker
运行的mysql
为例:
2.1. 开启binlog
打开mysql
容器挂载的日志文件,目录在/tmp/mysql/conf
:
修改文件:
vi /tmp/mysql/conf/my.cnf
添加内容:
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=dcxuexi
配置解读:
log-bin=/var/lib/mysql/mysql-bin
:设置binary log
文件的存放地址和文件名,叫做mysql-bin
binlog-do-db=dcxuexi
:指定对哪个database
记录binary log events
,这里记录dcxuexi
这个库
最终效果:
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=dcxuexi
2.2. 设置用户权限
接下来添加一个仅用于数据同步的账户,出于安全考虑,这里仅提供对dcxuexi
这个库的操作权限。
create user canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' identified by 'canal';
FLUSH PRIVILEGES;
重启mysql
容器即可
docker restart mysql
测试设置是否成功:在mysql
控制台,或者Navicat
中,输入命令:
show master status;
3. 安装Canal
3.1. 创建网络
我们需要创建一个网络,将MySQL
、Canal
、MQ
放到同一个Docker
网络中:
docker network create dcxuexi
让mysql
加入这个网络:
docker network connect dcxuexi mysql
3.3. 安装Canal
canal
的镜像压缩包:
可以上传到虚拟机,然后通过命令导入:
docker load -i canal.tar
然后运行命令创建Canal
容器:
docker run -p 11111:11111 --name canal \
-e canal.destinations=dcxuexi \
-e canal.instance.master.address=mysql:3306 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=canal \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false \
-e canal.instance.filter.regex=dcxuexi\\..* \
--network dcxuexi \
-d canal/canal-server:v1.1.5
说明:
-p 11111:11111
:这是canal
的默认监听端口-e canal.instance.master.address=mysql:3306
:数据库地址和端口,如果不知道mysql
容器地址,可以通过docker inspect 容器id
来查看-e canal.instance.dbUsername=canal
:数据库用户名-e canal.instance.dbPassword=canal
:数据库密码-e canal.instance.filter.regex=
:要监听的表名称
表名称监听支持的语法:
mysql 数据解析关注的表,Perl正则表达式.
多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
常见例子:
1. 所有表:.* or .*\\..*
2. canal schema下所有表: canal\\..*
3. canal下的以canal打头的表:canal\\.canal.*
4. canal schema下的一张表:canal.test1
5. 多个规则组合使用然后以逗号隔开:canal\\..*,mysql.test1,mysql.test2