mac m1 docker本地部署canal 监听mysql的binglog日志

mac m1 docker本地部署canal监听mysql的binglog日志(虚拟机同理)

根据黑马视频部署

1.docker 部署mysql

1.docker拉取mysql 镜像

因为m1是arm架构.需要多加一条信息

sh 复制代码
正常拉取
docker pull mysql:tag

m1拉取 5.7的版本. tag需要自己指定版本
docker pull --platform linux/x86_64 mysql:tag(5.7)

2.数据挂载宿主机

为什么要挂载到宿主机.

​ 1.容器被删除.那么容器内的数据.就全部被删除了.

​ 2.修改数据. 可以直接在宿主机上直接修改.不需要直接进入到容器内部去修改.

1.先再宿主机上建立需要挂载的路径

sh 复制代码
配置文件
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

实在不行就自己创建文件.把内容贴进去

java 复制代码
[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

编辑配置文件

sh 复制代码
vi /Users/lin/dev/docker/vol/mysqlvol/conf/my.cnf

新增两条命令

sh 复制代码
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=heima

配置解读:

  • log-bin=/var/lib/mysql/mysql-bin:设置binary log文件的存放地址和文件名,叫做mysql-bin
  • binlog-do-db=heima:指定对哪个database记录binary log events,这里记录heima这个库(监听heima这个库)

3.启动容器

创建一个docker 网络.

sh 复制代码
#创建一个叫 heima 的网络
docker network create heima

让你创建的mysql容器 ,加入到这个网络

sh 复制代码
docker network connect heima mysql
sh 复制代码
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这个库的操作权限。

mysql 复制代码
create user canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' identified by 'canal';
FLUSH PRIVILEGES;

接下来添加一个仅用于数据同步的账户,出于安全考虑,这里仅提供对heima这个库的操作权限。

mysql 复制代码
docker restart mysql

测试设置是否成功:在mysql控制台,或者Navicat中,输入命令:

java 复制代码
show master status;

2.安装cannal

可参考官方文档部署

1.docker拉取cannal 镜像

sh 复制代码
#自动拉取最新的版本
docker pull cannal 

2.启动cannal 容器

sh 复制代码
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正则表达式.

多个正则之间以逗号(,)分隔,转义符需要双斜杠(\)

常见例子:

  1. 所有表:.* or .\...
  2. canal schema下所有表: canal\...*
  3. canal下的以canal打头的表:canal\.canal.*
  4. canal schema下的一张表:canal.test1
  5. 多个规则组合使用然后以逗号隔开:canal\...*,mysql.test1,mysql.test2

3.查看cannal是否正常启动和是否监听mysql正常

1.查看canal是否正常启动

2.查看canal是否正常启动

sh 复制代码
docker exec -it canal bash
  1. 查看canal服务是否启动

    1. cat /home/admin/canal-server/logs/canal/canal.log

3.查看canal是否监听mysql

cat /home/admin/canal-server/logs/heima/heima.log

3.集成到项目中

依赖

java 复制代码
        <!--集成canal 起步依赖-->
        <dependency>
            <groupId>top.javatool</groupId>
            <artifactId>canal-spring-boot-starter</artifactId>
            <version>1.2.1-RELEASE</version>
        </dependency>

导入对应建表语句

mysql 复制代码
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 status
    on tb_item (status);

create index updated
    on 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');

实体类

java 复制代码
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)
    @Id
    private 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)
    @Transient
    private Integer stock;
    @TableField(exist = false)
    @Transient
    private Integer sold;
}

监听类

java 复制代码
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> {


    @Override
    public void insert(Item item) {
        log.info("检查到数据有插入:{}", JSON.toJSONString(item));

    }

    @Override
    public void update(Item before, Item after) {
        log.info("检查到数据有修改->前:{}", JSON.toJSONString(before));
        log.info("检查到数据有修改->后:{}", JSON.toJSONString(after));

    }

    @Override
    public void delete(Item item) {

        log.info("检查到数据有删除:{}", JSON.toJSONString(item));


    }
}

验证

在数据库中增删改,控制要可以看到记录.

相关推荐
不爱学习的YY酱29 分钟前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统
一名路过的小码农35 分钟前
ceph 18.2.4二次开发,docker镜像制作
ceph·docker·容器
丁总学Java35 分钟前
Maven项目打包,com.sun.tools.javac.processing
java·maven
kikyo哎哟喂1 小时前
Java 代理模式详解
java·开发语言·代理模式
duration~1 小时前
SpringAOP模拟实现
java·开发语言
小码ssim1 小时前
IDEA使用tips(LTS✍)
java·ide·intellij-idea
潜洋1 小时前
Spring Boot教程之五:在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序
java·spring boot·后端
暮志未晚Webgl2 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
小叶lr2 小时前
idea 配置 leetcode插件 代码模版
java·leetcode·intellij-idea
qq_429856572 小时前
idea启动服务报错Application run failed
java·ide·intellij-idea