1.canal介绍
Canal 是阿里开源的一个项目,官方主页:https://github.com/alibaba/canal。
它通过模拟 MySOL 主从复制的交互协议,把自己伪装成一个 MySOL 的从节
点,向 MySOL 主节点发送 dump 请求。MySOL 收到请求后,就会向 Canal 开始
推送 Binlog,Canal 解析 Binlog 字节流之后,将其转换为便于读取的结构化数据,
供下游程序订阅使用
项目中使用canal一般希望借助canal实现mysql数据库的同步(比如将mysql中的数据更新redis保证缓存和数据库数据的一致性)
安装环境:操作系统 Windows10,MySQL 8.0.19,canal1.1.6.
因为canal是模拟mysql的从节点工作,所以先安装mysql,并且让mysql按照主从节点的主节点配置就可以。
1.配置mysql
1.1 先开启binlog写入功能
show variables like "%log_bin%"
show variables like "%binlog_format%";
show variables like "%server_id%";
如果本机的 MySQL 的配置与上述不符合,可以修改 MySQL 的配置文件并重
启 MySQL,一般来说是 my.ini,如果自己不清楚放在哪里可以直接在电脑上搜索一下。
2.配置canal同步账号密码
2.1既然是将 Canal 模拟 MySQL 从节点,自然还要给 Canal 设置一个用来复制数
据的 MySQL 账号,我们这里设定这个用户名为 canal,密码 canal
-- 创建用户
CREATE USER canal IDENTIFIED BY 'canal';
-- 给用户设置权限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
此时mysql库的user表中就有了canal用户,且拥有查询和复制的权限。
select * from mysql.`user`;
show master status;
3.canal服务端
3.1canal服务点直接可以从canal官网下载压缩包,解压压缩包如下
3.2配置
进入 conf 目录,修改 canal.properties 文件,比较关键的是 canal.destinations
这个canal.destinations 配置指向具体需要加载配置所在的文件夹。我这里新建test为例(实际项目中新建一个文件夹即可)。
3.3 具体目录下的配置
从example目录下拷贝一个instance.properties文件,修改其中内容
3.3.1修改其中的连接信息,和binlog名称以及同步位置
3.3.2修改连接的用户名、密码
3.3.3指定需要监视的表名称
配置完成后,进入 bin 目录,执行 startup.bat 即可。
1.cannal连接mysql报错
1.1报错信息
canal caching_sha2_password Auth failed
1.2原因
mysql版本8.0创建用户时默认的密码加密方式为caching_sha2_password,而cannal连接mysql默认用的密码加密方式是mysql_native_password
1.3解决方案
修改mysql的cannal用户密码方式为mysql_native_password ,操作步骤如下
连接mysql查看用户的密码使用的什么加密方式
select host, user, authentication_string, plugin from mysql.user;
果然canal用户的加密方式使用的是caching_sha2_password,直接修改canal用户密码加密方式
-- 更新一下用户密码
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal';
-- 刷新权限
FLUSH PRIVILEGES;
刷新之后再次查看,发现canal用户加密方式已经修改过来了。
2 cannal同步报错,找不到位置信息
2.1.报错信息如下
ERROR c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - dump address 172.16.0.20:3306 has an error, retrying. caused by
com.alibaba.otter.canal.parse.exception.PositionNotFoundException: can’t find start position for example
2.2.原因
meta.dat 中保存的位点信息和数据库的位点信息不一致;导致canal抓取不到数据库的动作;
2.3.解决方案
单机
删除meta.dat文件,重启canal,问题解决;
(redis启动报错是本地很久没有启动之后,这次启动时报了错,顺便解决)
3.Redis 启动报错
3.1报错信息:
QForkMasterInit: system error caught. error code=0x000005af, message=VirtualAllocEx failed.: unknow
3.2原因
redis没有指定启动内存
3.3解决方案
Redis 的 conf 文件设置参数 maxheap 和 maxmemory
maxmemory 120MB
maxheap 180MB
启动是命令如下:
redis-server.exe redis.windows.conf