canal是阿里巴巴的开源项目,可以用来监控数据库的变化,从而获取新增数据或者改变数据。阿里巴巴在杭州和美国的双机房部署,存在跨机房同步业务的需求,阿里系公司开始逐步尝试基于数据库的日志解析,获取增量变更进行同步,canal就这样诞生了。canal只支持mysql数据库。
1.canal模拟mysql slave的交互协议,伪装自己是mysql的从属机(mysql slave),向mysql master发送dump协议。
2.mysql master收到dump请求,开始推送binary log给slave(也就是canal)。
3.canal解析binary log对象(原始为byte流)。得到变更数据。
3.1:我们需要mysql开启binlog模式
(1)查看当前mysql是否开启binlog模式。如果log_bin的值为OFF是未开启,为ON是已开启。
SHOW VARIABLES LIKE '%log_bin%'
(2)修改/etc/my.cnf 需要开启binlog模式。 修改完成之后,重启mysqld服务
[mysqld]
log‐bin=mysql‐bin
binlog‐format=ROW
server_id=1
3.2:安装canal服务端
(1)下载canal:https://download.csdn.net/download/weixin_49452054/12656679
(2)下载之后 上传到linux系统中,解压缩到指定的目录/usr/local/canal
修改 exmaple下的实例配置
vi conf/example/instance.properties
(3)指定读取位置:进入mysql中执行下面语句查看binlog所在位置
mysql> show master status;
显示如下:
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐+
| mysql‐bin.000001 | 120 | | | | +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐+
1 row in set (0.00 sec)
如果file中binlog文件不为 mysql-bin.000001 可以重置mysql
mysql> reset master;
4.查看canal配置文件
vim /usr/local/canal/conf/example/meta.dat
找到对应的binlog信息更改一致即可
"journalName":"mysql‐bin.000001","position":120,"
最后 启动canal
[root@localhost canal]# ./bin/startup.sh
4.1:创建canal服务poom文件引入依赖
<dependency>
<groupId>com.alibb</groupId>
<artifactId>starter‐canal</artifactId>
<version>0.0.1‐SNAPSHOT</version
</dependency>
这里需要注意下:因为maven中央仓库没有canal的jar包。我们需要在网上下载canal的jar包。
在本地仓库的com目录下创建alibb(名字随意,groupId和这个目录保持一致就行)。
然后将下载的压缩文件解压到本地仓库刚才创建的目录下。
下载地址:https://download.csdn.net/download/weixin_49452054/12656679
(3)添加配置文件application.properties
canal.client.instances.example.host=192.168.200.128
canal.client.instances.example.port=11111
canal.client.instances.example.batchSize=1000
4.2:创建 canal 启动类并添加@EnableCanalClient
@SpringBootApplication
@EnableCanalClient //canal客户端的注解
public class CanalApplication {
public static void main(String[] args) {
SpringApplication.run(CanalApplication.class, args);
}
}
4.3:创建canal监听类
@CanalEventListener //canal监听注解
public class AdListener {
/**
*@ListenPoint 注解
*schema ="要监听的数据库"
*table = "要监听的表"
*/
@ListenPoint(schema = "db", table = "table")
public void tableUpdate(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
System.err.println("更新之前的数据");
rowData.getBeforeColumnsList().forEach((c) ‐>
System.out.println(c.getName() + " :: " + c.getValue()));
System.err.println("更新之后的数据");
rowData.getAfterColumnsList().forEach((c) ‐>
System.out.println(c.getName() + " :: " + c.getValue()));
}
}
当数据库db中的table表中的数据发生改变就会执行tableUpdate()方法。我们可以在该方法中写业务逻辑,完成相应的业务。