一、前言
二、Canal原理
我们知道MySQL主从复制是Mster将数据变更写入BinLog,然后Slave将Master的BinLog拷贝到它的中继日志,最后重放中继日志完成将数据同步到Slave。
Canal其实它就是参考主从复制原理,将自己伪装成Slave,接收Master推送的二进制日志。
Cannel包括两部分
-
服务端:将自己伪装成Slave并从Master获取Binlog以供消费端使用。
-
客户端:订阅服务端数据变更事件,处理后存储到对应的数据仓库中(RDB、HBase、ES)。
Canal的应用:可以用于做数据同步(在线库同步到离线库)、增量数据同步ES等。
三、Canal服务端安装配置
下载解压
Canal同步账号创建及授权
配置文件 conf/example/instance.properties
因为我Linux服务器上安装的是JDK17.用startup.sh启动报了一堆错,只需要将JAVA_OPTS中报错的配置删除即可,另外我机器内存只有1G,需要调整一下堆内存的最大值和初始值。
/bin/startup.sh 启动后可以查看到日志输出,日志没有报错就启动成功了。
四、canal客户端
依赖
消费端代码:类似于MQ的消息接收端
执行UPDATFE语句
接收端收到消息(变更前该记录所有字段值,变更后该记录所有字段值)
mysqlbinlog直接解析,canal要求mysqlBinlog配置为row
注:这里是仅单机环境,我们的场景单机也就可以了,如果要保证可靠性使用多个接收端,需要引入zk来保证同一时间只有一个消费端工作,因为canal通过ack保证必须按顺序消费,以免数据无序造成数据错乱。