docker安装部署Canal-监听mysql

发布于:2024-09-18 ⋅ 阅读:(4) ⋅ 点赞:(0)

安装和配置Canal

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

1.开启MySQL主从

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

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

1.1.开启binlog

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

在这里插入图片描述

修改文件:

vi /tmp/mysql/conf/my.cnf

添加内容:

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

配置解读:

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

最终效果:

[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=heima

1.2.设置用户权限

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

CREATE USER canal@'%' IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;

运行完之后,我们可以查看用户,是不是真的添加进去了
在这里插入图片描述
或者使用指令查看用户

SELECT HOST,USER,PLUGIN FROM mysql.user ;

在这里插入图片描述

重启mysql容器即可

docker restart mysql

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

show master status;

在这里插入图片描述

2.安装Canal

2.1.创建网络

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

docker network create heima

让mysql加入这个网络:

docker network connect heima mysql

2.3.安装Canal

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

在这里插入图片描述

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

docker load -i canal.tar

或者可以使用docker在线拉取:

docker pull canal/canal-server:v1.1.5

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

docker run -p 11111:11111 --name canal \
-e canal.destinations=heima \
-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=heima\\..* \
--network heima \
-d canal/canal-server:v1.1.5

说明:

  • -p 11111:11111:这是canal的默认监听端口
  • -e canal.destinations=heima : 集群,canal也可以搭建集群
  • -e canal.instance.master.address=mysql:3306:数据库地址和端口,如果不知道mysql容器地址,可以通过docker inspect 容器id来查看,注意端口,默认3306,我以为我的docker容器把端口改成3307了,这里要修改,但测试后发现,你改的是对外映射的端口,现在mysql和canal都在heima这个网络内,内部就是找的3306端口,所以不用做修改。
  • -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 

canal启动之后,我们可以查看

docker logs -f canal

确定容器启动成功了
在这里插入图片描述
那如何确定canal和mysql连上了呢?
我们先进入canal容器

docker exec -it canal bash

然后查看canal运行日志

tail -f canal-server/logs/canal/canal.log

在这里插入图片描述
可以看出运行正常
还可以查看另一个运行日志:

tail -f canal-server/logs/heima/heima.log

在这里插入图片描述
这就是正常连接了

遇到的问题

如果在这个地方遇到报错
在这里插入图片描述

java.io.IOException: caching_sha2_password Auth failed
        at com.alibaba.otter.canal.parse.driver.mysql.MysqlConnector.negotiate(MysqlConnector.java:260) ~[canal.parse.driver-1.1.5.jar:na]
        at com.alibaba.otter.canal.parse.driver.mysql.MysqlConnector.connect(MysqlConnector.java:82) ~[canal.parse.driver-1.1.5.jar:na]
        ... 4 common frames omitted
2021-11-20 16:43:40.852 [destination = example , address = /127.0.0.1:3306 , EventParser] ERROR com.alibaba.otter.canal.common.alarm.LogAlarmHandler - destination:example[com.alibaba.otter.canal.parse.exception.CanalParseException: java.io.IOException: connect /127.0.0.1:3306 failure

原因:
自MySQL 8.0.3开始,身份验证插件默认使用caching_sha2_password
也就是密码的验证方式变化了,我们前面创建的用户使用的密码验证方式不行。
恰好笔者这里就是使用了8.0.24的mysql,刚好遇到了这个问题,就在这里解决一下。
解决方案:
修改canal用户对应的身份验证插件为mysql_native_password

select host,user,plugin from mysql.user ;
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

在sqlyog中执行就行了,把其中的password 改成自己的密码哦,我们这里设置的密码是canal,所以我就要写canal。


网站公告

今日签到

点亮在社区的每一天
去签到