安装和配置Canal

下面我们就开启mysql的主从同步机制,让Canal来模拟salve

1.开启MySQL主从

Canal是基于MySQL的主从同步功能,因此必须先开启MySQL的主从功能才可以。

这里以之前用Docker运行的mysql为例:

1.1.开启binlog

打开mysql容器挂载的日志文件,我的在/tmp/mysql/conf目录:

安装Canal - 图1

修改文件:

  1. vi /tmp/mysql/conf/my.cnf

添加内容:

  1. log-bin=/var/lib/mysql/mysql-bin
  2. binlog-do-db=heima

配置解读:

  • log-bin=/var/lib/mysql/mysql-bin:设置binary log文件的存放地址和文件名,叫做mysql-bin
  • binlog-do-db=heima:指定对哪个database记录binary log events,这里记录heima这个库

最终效果:

  1. [mysqld]
  2. skip-name-resolve
  3. character_set_server=utf8
  4. datadir=/var/lib/mysql
  5. server-id=1000
  6. log-bin=/var/lib/mysql/mysql-bin
  7. binlog-do-db=heima

1.2.设置用户权限

接下来添加一个仅用于数据同步的账户,出于安全考虑,这里仅提供对heima这个库的操作权限。

  1. create user canal@'%' IDENTIFIED by 'canal';
  2. GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' identified by 'canal';
  3. FLUSH PRIVILEGES;

重启mysql容器即可

  1. docker restart mysql

测试设置是否成功:在mysql控制台,或者Navicat中,输入命令:

  1. show master status;

安装Canal - 图2

2.安装Canal

2.1.创建网络

我们需要创建一个网络,将MySQL、Canal、MQ放到同一个Docker网络中:

  1. docker network create heima

让mysql加入这个网络:

  1. docker network connect heima mysql

2.3.安装Canal

课前资料中提供了canal的镜像压缩包:

安装Canal - 图3

大家可以上传到虚拟机,然后通过命令导入:

  1. docker load -i canal.tar

然后运行命令创建Canal容器:

  1. docker run -p 11111:11111 --name canal \
  2. -e canal.destinations=heima \
  3. -e canal.instance.master.address=mysql:3306 \
  4. -e canal.instance.dbUsername=canal \
  5. -e canal.instance.dbPassword=canal \
  6. -e canal.instance.connectionCharset=UTF-8 \
  7. -e canal.instance.tsdb.enable=true \
  8. -e canal.instance.gtidon=false \
  9. -e canal.instance.filter.regex=heima\\..* \
  10. --network heima \
  11. -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=:要监听的表名称

表名称监听支持的语法:

  1. mysql 数据解析关注的表,Perl正则表达式.
  2. 多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
  3. 常见例子:
  4. 1. 所有表:.* or .*\\..*
  5. 2. canal schema下所有表: canal\\..*
  6. 3. canal下的以canal打头的表:canal\\.canal.*
  7. 4. canal schema下的一张表:canal.test1
  8. 5. 多个规则组合使用然后以逗号隔开:canal\\..*,mysql.test1,mysql.test2