canal 是阿里巴巴 MySQL 数据库 Binlog 的增量订阅 & 消费组件。基于数据库增量日志解析,提供增量数据订阅 & 消费。
在docker环境中
1.执行 docker search canal 获取到需要下载的canal镜像
2.执行docker pull 选择下载的canal镜像
3.执行run
docker run \ --name canal \ -p 11111:11111 \ -d canal/canal-server:latest4.获取配置文件到宿主机
进入canal docker exec -it canal /bin/bash //查看对应的conf文件在那个目录 复制配置文件到宿主机指定目录 docker cp /home/admin/canal-server/conf /docker/canal/config3.在自己的liunx系统创建需要挂载的文件夹 我这边创建了config和logs文件
docker run \ --name canal \ -p 11111:11111 \ -v /docker/canal/config:/home/admin/canal-server/conf \ -v /docker/canal/logs:/home/admin/canal-server/logs \ -d canal/canal-server:latest4.修改canal.properties配置
重要配置:
# canal端口 canal.port = 11111# 可以支持tcp, kafka, rocketMQ, rabbitMQ, pulsarMQ canal.serverMode = tcp#实例名称,可以配置多个,配置多个会生产多个文件夹 canal.destinations = example5.修改对应实力instance.properties配置
重要配置:
# 配置你连接的数据库地址 canal.instance.master.address=127.0.0.1:3306# 配置数据库的username/password canal.instance.dbUsername=root canal.instance.dbPassword=123456# table regex 监听的数据库规则 #.your_database 表示你要同步的数据库名,\\.表示匹配一个点号(.)的转义字符,.在正则表达式中表示匹配任意字符,因此需要转义表示匹配点号。.*表示匹配所有以 your_database.开头的字符串。 canal.instance.filter.regex=your_database\\..*
1.使用canal需要mysql开启binlog日志
- [mysqld]
- #设置服务器id(确保唯一)
- server-id=666
- #设置日志个数默认ROW 根据需求选择
- binlog_format=ROW
- #开启binlog日志(mysql-bin 日志名称)
- log-bin=mysql-bin
- #设置需要复制的数据库,默认复制全部
- #binlog-do-db=mydb
2.重启mysql服务
systemctl restart mysqld
3.查看状态(如果不为空则配置成功)
SHOW MASTER STATUS;
1.引入jar
- <!-- canal 同步双写-->
- <dependency>
- <groupId>top.javatool</groupId>
- <artifactId>canal-spring-boot-starter</artifactId>
- <version>1.2.1-RELEASE</version>
- </dependency>
2.yml配置
- canal:
- server: 192.168.1.1:11111
- destination: example
3.代码
- import lombok.Data;
-
- import javax.persistence.Column;
- import javax.persistence.Id;
-
-
- @Data
- public class UserBean {
-
- @Id
- public Integer id;
- @Column(name = "name")
- public String name;
- @Column(name = "age")
- public Integer age;
-
- @Override
- public String toString() {
- return "UserBean{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}';
- }
- }
- import com.pw.canal.bean.UserBean;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.stereotype.Component;
- import top.javatool.canal.client.annotation.CanalTable;
- import top.javatool.canal.client.handler.EntryHandler;
- @Slf4j
- @CanalTable("sc_user")
- @Component
- public class UserBeanHandler implements EntryHandler<UserBean> {
-
- @Override
- public void insert(UserBean userBean ) {
- log.info("对象{}",userBean );
- //添加本地缓存
- //添加redis缓存
- }
-
- @Override
- public void update(UserBean before, UserBean after) {
- log.info("对象{}",before);
- log.info("对象{}",after);
- //添加本地缓存
- //添加redis缓存
- }
-
- @Override
- public void delete(UserBean userBean ) {
- log.info("对象{}",userBean );
- //添加本地缓存
- //添加redis缓存
- }
- }
1.如果控制台又打印日志,但是没有进入hardler,注意对象的转换字段类型是否匹配.
2.mysql配置文件中,是否设置了 binlog_format=ROW