mac m1 docker本地部署canal监听mysql的binglog日志(虚拟机同理)
根据黑马视频部署
1.docker 部署mysql
1.docker拉取mysql 镜像
因为m1是arm架构.需要多加一条信息
正常拉取
docker pull mysql:tagm1拉取 5.7的版本. tag需要自己指定版本
docker pull --platform linux/x86_64 mysql:tag(5.7)
2.数据挂载宿主机
为什么要挂载到宿主机.
1.容器被删除.那么容器内的数据.就全部被删除了.
2.修改数据. 可以直接在宿主机上直接修改.不需要直接进入到容器内部去修改.
1.先再宿主机上建立需要挂载的路径
配置文件
mkdir /Users/lin/dev/docker/vol/mysqlvol/conf数据
mkdir /Users/lin/dev/docker/vol/mysqlvol/data
2.把修改配置文件放到/Users/lin/dev/docker/vol/mysqlvol/conf
my.cnf
实在不行就自己创建文件.把内容贴进去
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=heima
binlog_format = ROW
编辑配置文件
vi /Users/lin/dev/docker/vol/mysqlvol/conf/my.cnf
新增两条命令
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=heima
配置解读:
log-bin=/var/lib/mysql/mysql-bin
:设置binary log文件的存放地址和文件名,叫做mysql-binbinlog-do-db=heima
:指定对哪个database记录binary log events,这里记录heima这个库(监听heima这个库)
3.启动容器
创建一个docker 网络.
#创建一个叫 heima 的网络
docker network create heima
让你创建的mysql容器 ,加入到这个网络
docker network connect heima mysql
docker run -d --name mysql-1 --network heima -p 3309:3306 \
-v /Users/lin/dev/docker/vol/mysqlvol/conf/my.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /Users/lin/dev/docker/vol/mysqlvol/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root mysql:5.7
解读:
启动用
- docker run -d 后台启动
- –name mysql-1 取名叫mysql-1 (这个根据自己随意启动.不和其他容器同名就好)
- –network heima指定用 heima 这个网络 .可以不加
- -p 3309:3306 端口映射. 宿主机 3309映射到容器内部的3306
- -v /Users/lin/dev/docker/vol/mysqlvol/conf/my.cnf:/etc/mysql/conf.d/hmy.cnf 配置文件映射,宿主机/Users/lin/dev/docker/vol/mysqlvol/conf/my.cnf 映射容器的/etc/mysql/conf.d/hmy.cnf ,宿主机的根据自己具体路径更变.容器路径不变
- -v /Users/lin/dev/docker/vol/mysqlvol/data:/var/lib/mysql 和上面不同. data 是存储数据的
- -e MYSQL_ROOT_PASSWORD=root 账号为root 密码也为root .可以自己设置
- mysql:5.7 mysql的版本
4.配置cannal 账号
设置canna 账号密码,添加一个仅用于数据同步的账户,出于安全考虑,这里仅提供对heima这个库的操作权限。
create user canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' identified by 'canal';
FLUSH PRIVILEGES;
接下来添加一个仅用于数据同步的账户,出于安全考虑,这里仅提供对heima这个库的操作权限。
docker restart mysql
测试设置是否成功:在mysql控制台,或者Navicat中,输入命令:
show master status;
2.安装cannal
可参考官方文档部署
1.docker拉取cannal 镜像
#自动拉取最新的版本
docker pull cannal
2.启动cannal 容器
docker run -p 11111:11111 --name canal \
-e canal.destinations=heima \
-e canal.instance.master.address=mysql-1:3306 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=canal \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false \
-e canal.instance.filter.regex=heima\\..* \
--network heima \
-d canal/canal-server
解读
-e canal.destinations=heima \ 集群名叫heima
-e canal.instance.master.address=mysql-1:3306 \ 因为加入了同一个网桥. 所以ip直接就是加入网桥的容器名.docker network connect heima mysql-1 ->容器的端口3306(不是宿主机的,踩过坑)
-e canal.instance.dbUsername=canal
-e canal.instance.dbPassword=canal \ 之前mysql创建了一个canal的账号密码-e canal.instance.filter.regex=heima\…* \ 监听heima这个库下面的所有表
–network heima \ 用heima 这个网络.之前创建过1.3-d canal/canal-server后台启动canal
mysql 数据解析关注的表,Perl正则表达式.
多个正则之间以逗号(,)分隔,转义符需要双斜杠(\)
常见例子:
- 所有表:.* or .\…
- canal schema下所有表: canal\…*
- canal下的以canal打头的表:canal\.canal.*
- canal schema下的一张表:canal.test1
- 多个规则组合使用然后以逗号隔开:canal\…*,mysql.test1,mysql.test2
3.查看cannal是否正常启动和是否监听mysql正常
1.查看canal是否正常启动
2.查看canal是否正常启动
-
docker exec -it canal bash
-
查看canal服务是否启动
- cat /home/admin/canal-server/logs/canal/canal.log
- cat /home/admin/canal-server/logs/canal/canal.log
3.查看canal是否监听mysql
cat /home/admin/canal-server/logs/heima/heima.log
3.集成到项目中
依赖
<!--集成canal 起步依赖--><dependency><groupId>top.javatool</groupId><artifactId>canal-spring-boot-starter</artifactId><version>1.2.1-RELEASE</version></dependency>
导入对应建表语句
create table tb_item
(id bigint auto_increment comment '商品id'primary key,title varchar(264) not null comment '商品标题',name varchar(128) default '' not null comment '商品名称',price bigint not null comment '价格(分)',image varchar(200) null comment '商品图片',category varchar(200) null comment '类目名称',brand varchar(100) null comment '品牌名称',spec varchar(200) null comment '规格',status int(1) default 1 null comment '商品状态 1-正常,2-下架,3-删除',create_time datetime null comment '创建时间',update_time datetime null comment '更新时间'
)comment '商品表' row_format = COMPACT;create index statuson tb_item (status);create index updatedon tb_item (update_time);INSERT INTO heima.tb_item (id, title, name, price, image, category, brand, spec, status, create_time, update_time) VALUES (10001, 'RIMOWA 21寸托运箱拉杆箱 SALSA AIR系列果绿色 820.70.36.4', 'SALSA AIR', 16900, 'https://m.360buyimg.com/mobilecms/s720x720_jfs/t6934/364/1195375010/84676/e9f2c55f/597ece38N0ddcbc77.jpg!q70.jpg.webp', '拉杆箱', 'RIMOWA', '{"颜色": "红色", "尺码": "26寸"}', 1, '2019-05-01 00:00:00', '2019-05-01 00:00:00');
INSERT INTO heima.tb_item (id, title, name, price, image, category, brand, spec, status, create_time, update_time) VALUES (10002, '安佳脱脂牛奶 新西兰进口轻欣脱脂250ml*24整箱装*2', '脱脂牛奶', 68600, 'https://m.360buyimg.com/mobilecms/s720x720_jfs/t25552/261/1180671662/383855/33da8faa/5b8cf792Neda8550c.jpg!q70.jpg.webp', '牛奶', '安佳', '{"数量": 24}', 1, '2019-05-01 00:00:00', '2019-05-01 00:00:00');
INSERT INTO heima.tb_item (id, title, name, price, image, category, brand, spec, status, create_time, update_time) VALUES (10003, '唐狮新品牛仔裤女学生韩版宽松裤子 A款/中牛仔蓝(无绒款) 26', '韩版牛仔裤', 84600, 'https://m.360buyimg.com/mobilecms/s720x720_jfs/t26989/116/124520860/644643/173643ea/5b860864N6bfd95db.jpg!q70.jpg.webp', '牛仔裤', '唐狮', '{"颜色": "蓝色", "尺码": "26"}', 1, '2019-05-01 00:00:00', '2019-05-01 00:00:00');
INSERT INTO heima.tb_item (id, title, name, price, image, category, brand, spec, status, create_time, update_time) VALUES (10004, '森马(senma)休闲鞋女2019春季新款韩版系带板鞋学生百搭平底女鞋 黄色 36', '休闲板鞋', 10400, 'https://m.360buyimg.com/mobilecms/s720x720_jfs/t1/29976/8/2947/65074/5c22dad6Ef54f0505/0b5fe8c5d9bf6c47.jpg!q70.jpg.webp', '休闲鞋', '森马', '{"颜色": "白色", "尺码": "36"}', 1, '2019-05-01 00:00:00', '2019-05-01 00:00:00');
实体类
package com.lin.user.entry;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Transient;
import java.util.Date;@Data
@TableName("tb_item")
public class Item {@TableId(type = IdType.AUTO)@Idprivate Long id;//商品id@Column(name = "name")private String name;//商品名称private String title;//商品标题private Long price;//价格(分)private String image;//商品图片private String category;//分类名称private String brand;//品牌名称private String spec;//规格private Integer status;//商品状态 1-正常,2-下架private Date createTime;//创建时间private Date updateTime;//更新时间@TableField(exist = false)@Transientprivate Integer stock;@TableField(exist = false)@Transientprivate Integer sold;
}
监听类
package com.lin.user.config;import com.alibaba.fastjson.JSON;
import com.lin.user.entry.Item;
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("tb_item")
@Component
public class ItemHandler implements EntryHandler<Item> {@Overridepublic void insert(Item item) {log.info("检查到数据有插入:{}", JSON.toJSONString(item));}@Overridepublic void update(Item before, Item after) {log.info("检查到数据有修改->前:{}", JSON.toJSONString(before));log.info("检查到数据有修改->后:{}", JSON.toJSONString(after));}@Overridepublic void delete(Item item) {log.info("检查到数据有删除:{}", JSON.toJSONString(item));}
}
验证
在数据库中增删改,控制要可以看到记录.