前言:本文章将采用docker方式安装canal
canal主要用途是基于 MySQL 数据库增量日志解析,并能提供增量数据订阅和消费。
- github地址:https://github.com/alibaba/canal
- 版本下载地址:https://github.com/alibaba/canal/releases
- 文档地址:https://github.com/alibaba/canal/wiki/Docker-QuickStart
Canal应用场景
1.电商场景下商品、用户实时更新同步到至Elasticsearch、solr等搜索引擎;
2.价格、库存发生变更实时同步到redis;
3.数据库异地备份、数据同步;
4.代替使用轮询数据库方式来监控数据库变更,有效改善轮询耗费数据库资源。
一、安装mysql1、在/tmp目录下创建mysql数据卷挂载目录
注:创建数据卷是为了方便修改mysql的配置
1.1、创建配置文件挂载目录:[root@k8s-master1 /]# mkdir -p /tmp/mysql/conf1.2、创建配置文件并添加如下内容
[root@k8s-master1 /]# vim /tmp/mysql/conf/hmy.cnf
[mysqld] skip-name-resolve character_set_server=utf8 datadir=/var/lib/mysql # 开启 binlog,方便后续对接canal log-bin=/var/lib/mysql/mysql-bin # 选择 ROW 模式,方便后续对接canal binlog-format=ROW # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复 server-id=10001.3、创建mysql数据卷挂载目录
[root@k8s-master1 /]# mkdir -p /tmp/mysql/data2、docker安装mysql
[root@k8s-master1 /]# docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /tmp/mysql/data:/var/lib/mysql -d mysql:5.7.253、创建数据库用户并授权
授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限,在数据库连接工具里面,执行下面的语句即可:
create user canal@'%' IDENTIFIED by 'canal'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;4、查看bin-log是否已开启
二、安装canal1、拉取镜像
[root@k8s-master1 /]# docker pull canal/canal-server:v1.1.12、安装canal-server容器
[root@k8s-master1 /]# docker run -p 11111:11111 --name canal -d canal/canal-server:v1.1.1
注意:若canal服务启动后自动停止,则需注意虚拟机内存,将暂时不用的服务关掉,再重启canal即可!
3、修改canal-server配置1、进入canal容器内部,修改/home/admin/canal-server/conf/canal.properties,将它的id属性修改成和mysql数据库中server-id不同的值。
注意:容器默认进入/home/admin目录下!!
注意:容器默认进入/home/admin目录下!!
注意:容器默认进入/home/admin目录下!!
[root@k8s-master1 /]# docker exec -it canal bash [root@43d1c9546cf0 admin]# ls app.sh bin canal-server health.sh [root@43d1c9546cf0 admin]# cd canal-server/ [root@43d1c9546cf0 canal-server]# ls bin conf lib logs [root@43d1c9546cf0 canal-server]# cd conf/ [root@43d1c9546cf0 conf]# ls canal.properties example logback.xml metrics mq.yml spring [root@43d1c9546cf0 conf]# vi canal.properties
2、修改/home/admin/canal-server/conf/example/instance.properties,配置要监听的数据库服务地址和监听数据变化的数据库以及表,修改如下:
[root@43d1c9546cf0 admin]# cd /home/admin/canal-server/conf/example [root@43d1c9546cf0 example]# ls h2.mv.db instance.properties [root@43d1c9546cf0 example]# vi instance.properties
其中,属性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 (逗号分隔) 注意:此过滤条件只针对row模式的数据有效(ps. mixed/statement因为不解析sql,所以无法准确提取tableName进行过滤)
3、退出容器并重启容器
[root@k8s-master1 /]# docker restart canal
三、springboot整合canal,实现增量数据同步
参考地址:https://github.com/NormanGyllenhaal/canal-client
1、pom文件
miaosha-service com.miaosha 0.0.1-SNAPSHOT 4.0.0 miaosha-canal top.javatool canal-spring-boot-autoconfigure 1.2.1-RELEASE org.springframework.boot spring-boot-maven-plugin com.miaosha.CanalApplication ZIP repackage
2、yaml文件
server:
port: 8088
#Canal配置
canal:
server: canal-server:11111
destination: example
#日志
logging:
level:
root: error
3、创建SkuHandler并实现EntryHandler接口。
@Component //监控数据表 @CanalTable(value = "tb_sku") public class SkuHandler implements EntryHandler{ @Override public void insert(Sku sku) { //添加业务操作 } @Override public void update(Sku before, Sku after) { //修改业务操作 } @Override public void delete(Sku sku) { //删除业务操作 } }
自此,完成!!!



