当前位置: 首页 > news >正文

Canal实现数据同步

1、Canal实现数据同步

canal可以用来监控数据库数据的变化,从而获得新增数据,或者修改的数据。

1.1 Canal工作原理

在这里插入图片描述

原理相对比较简单:

1、canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议。

2、mysql master收到dump请求,开始推送binary log给slave(也就是canal)。

3、canal解析binary log对象(原始为byte流)。

canal需要使用到mysql,我们需要先安装mysql,canal是基于mysql的主从模式实现的,所以必须先开启

binlog。

1.2 安装MySQL

# 搜索MySQL镜像
$ docker search mysql
# 拉取MySQL镜像
$ docker pull mysql:5.5
# 启动MySQL
$ docker run -d -p 3306:3306 -v /home/zhangshixing/linuxmysql/conf:/etc/mysql/conf.d -v /home/zhangshixing/linuxmysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name zsxmysq1 mysql:5.5
$ docker exec -it fc566f7d1857 /bin/bash
$ mysql -h 192.168.94.186 -u root -p

在这里插入图片描述

1.3 开启binlog模式

(1) 、连接到mysql中,并修改 /etc/mysql/my.cnf 需要开启主从模式,开启binlog模式。

执行如下命令,编辑 mysql 配置文件:

$ docker exec -it fc566f7d1857 /bin/bash
# 该目录一定要存在,否则log日志无法写入
$ cd /etc/mysql/
$ vim my.cnf

没有vim,需要安装vim:

$ apt-get update
$ apt-get install vim

修改 my.cnf 配置文件,添加如下配置:

# 开启logbin
log-bin=/var/lib/mysql/mysql-bin
# binlog日志格式
binlog-format=ROW
# mysql主从备份serverId,canal中不能与此相同
server-id=12345

在这里插入图片描述

(2) 、创建账号,用于测试使用,使用root账号创建用户并授予权限

# CREATE USER <用户名> [ IDENTIFIED ] BY [ PASSWORD ] <口令>
# <用户名>格式为 'user_name'@'host_name',这里user_name是用户名,host_name为主机名
# "%" 表示一组主机
create user canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, INSERT, DELETE, UPDATE, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;

(3)、重启mysql容器

$ docker restart fc566f7d1857

(4)、查看配置是否生效

$ docker exec -it fc566f7d1857 /bin/bash
$ mysql -h 192.168.94.186 -u canal -p

在这里插入图片描述

# binlog日志文件
$ show master status;

在这里插入图片描述

# 查看是否配置成功
$ show variables like 'binlog_format';

在这里插入图片描述

查看日志文件:

在这里插入图片描述

使用Navicat新建canal_test 数据库和t_user_1表。

# 查看日志信息
$ mysqlbinlog -vv mysql-bin.000001

在这里插入图片描述

1.4 canal容器安装

下载镜像:

$ docker pull docker.io/canal/canal-server

容器安装:

$ docker run -p 11111:11111 --name canal -d docker.io/canal/canal-server

进入容器,修改核心配置canal.propertiesinstance.propertiescanal.properties 是canal自身的

配置,instance.properties是需要同步数据的数据库连接配置。

执行代码如下:

$ docker exec -it canal /bin/bash
$ cd canal-server/conf/
$ vim canal.properties
$ cd example/
$ vim instance.properties

修改canal.properties的id,不能和mysql的server-id重复,如下图:

在这里插入图片描述

修改instance.properties,配置数据库连接地址:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这里的canal.instance.filter.regex有多种配置,如下:

可以参考地址如下:

https://github.com/alibaba/canal/wiki/AdminGuide

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模式的数据有效(mixed/statement因为不解析sql,所以无法准确提取

tableName进行过滤)。

配置完成后,设置开机启动,并记得重启canal。

$ docker update --restart=always canal
$ docker restart canal

验证配置是否成功:

$ docker exec -it canal /bin/bash
$ cd canal-server/logs/example/
# 查看日志
$ tail -100f example.log  

在这里插入图片描述

1.5 canal服务搭建

当用户执行数据库的操作的时候,binlog 日志会被canal捕获到,并解析出数据。

1.5.1 安装辅助jar包

spring-boot-starter-canal-master中有一个工程starter-canal,它主要提供了SpringBoot环境下

canal的支持,我们需要先安装该工程,在starter-canal目录下执行mvn install,如下图:

在这里插入图片描述

1.5.2 canal服务工程搭建

spring-boot-starter-canal-master中创建一个工程canal-test

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>cana-test</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>cana-test</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version><relativePath/></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>com.xpand</groupId><artifactId>starter-canal</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

application.yml配置

# canal配置
canal.client.instances.example.host=192.168.94.186
canal.client.instances.example.port=11111

监听创建

创建一个CanalDataEventListener类,实现对表增删改操作的监听,代码如下:

package com.example.canatest.config;import com.alibaba.otter.canal.protocol.CanalEntry;
import com.xpand.starter.canal.annotation.*;/*** @author zhangshixing*/
@CanalEventListener
public class MyEventListener {/*** 增加数据监听** @param eventType* @param rowData*/@InsertListenPointpublic void onEvent1(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {System.out.println("InsertListenPoint");rowData.getAfterColumnsList().forEach((c) -> System.out.println("By--Annotation: " + c.getName() + " ::   " + c.getValue()));}/*** 修改数据监听** @param rowData*/@UpdateListenPointpublic void onEvent2(CanalEntry.RowData rowData) {System.out.println("UpdateListenPoint");rowData.getAfterColumnsList().forEach((c) -> System.out.println("By--Annotation: " + c.getName() + " ::   " + c.getValue()));}/*** 刪除数据监听** @param eventType*/@DeleteListenPointpublic void onEvent3(CanalEntry.EventType eventType) {System.out.println("DeleteListenPoint");}/*** 自定义数据修改监听** @param eventType* @param rowData*/@ListenPoint(destination = "example", schema = "canal_test", table = {"t_user_1", "t_user_2"}, eventType = CanalEntry.EventType.INSERT)public void onEvent4(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {System.out.println("CustomListenPoint");rowData.getAfterColumnsList().forEach((c) -> System.out.println("By--Annotation: " + c.getName() + " ::   " + c.getValue()));}
}

启动类创建

创建启动类,代码如下:

package com.example.canatest;import com.xpand.starter.canal.annotation.EnableCanalClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableCanalClient
public class CanaTestApplication {public static void main(String[] args) {SpringApplication.run(CanaTestApplication.class, args);}
}

测试

启动canal微服务,然后修改任意数据库的表数据,canal微服务后台输出信息。

1、插入数据

在这里插入图片描述

在这里插入图片描述

2、修改数据

在这里插入图片描述

在这里插入图片描述

3、删除数据

在这里插入图片描述

在这里插入图片描述

4、自定义插入

在这里插入图片描述

在这里插入图片描述

相关文章:

Canal实现数据同步

1、Canal实现数据同步 canal可以用来监控数据库数据的变化&#xff0c;从而获得新增数据&#xff0c;或者修改的数据。 1.1 Canal工作原理 原理相对比较简单&#xff1a; 1、canal模拟mysql slave的交互协议&#xff0c;伪装自己为mysql slave&#xff0c;向mysql master发送…...

数据库学习笔记——DDL

数据库学习笔记——DDL 建立EMPLOYEE数据库&#xff1a; CREATE TABLE employee(employee_ID int not null,employee_name varchar(20) not null,street varchar(20) not null,city varchar(20) not null,PRIMARY KEY(employee_ID) );CREATE TABLE company(company_name varc…...

MATLAB算法实战应用案例精讲-【人工智能】边缘计算(附python代码实现)

目录 前言 几个高频面试题目 边缘计算和云计算的关系 云计算(cloud computing) 边缘计算...

精彩回顾 | 迪捷软件亮相2023世界智能网联汽车大会

2023年9月24日&#xff0c;2023世界智能网联汽车大会&#xff08;以下简称大会&#xff09;在北京市圆满落幕。迪捷软件北京参展之行圆满收官。 本次大会由工业和信息化部、公安部、交通运输部、中国科学技术协会、北京市人民政府联合主办&#xff0c;是我国首个经国务院批准的…...

【ShaderLab PBR 嗜血边缘角色_美式朋克风格_“Niohoggr“_角色渲染(第一篇)】

嗜血边缘角色Cyberpunk style Unity 渲染 《嗜血边缘》截取其中的片段如下:资源分析其中Guitar贴图4张模型:人物细节图:人物模型 Inspector面板这里做一个区域区分:Body贴图1_BC贴图1_BC属性:Body贴图2_NBody贴图3_CMBody贴图4_SRMBody贴图4_RGBReflection Probe第一版Sha…...

python经典百题之围圈报数

题目:有n个人围成一圈&#xff0c;顺序排号。从第一个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人退出圈子&#xff0c;问最后留下的是原来第几号的那位。 程序分析 思路1&#xff1a;模拟游戏过程 使用一个循环队列模拟游戏过程&#xff0c;每次循…...

Google Earth Engine(GEE)案例——如何去除和过滤Landsat和sentinel等系列影像集合中的空影像(三种方法)

简介 本文的主要解决的问题是如何去除和过滤Landsat和sentinel等系列影像集合中的空影像?这个主要源于一下的问题: “从图像集中删除空图像”是什么意思?您的脚本将图像集合过滤到没有图像的日期,这会产生包含 0 个图像的图像集合:https: https://code.earthengine.goog…...

Leetcode 69.x的平方根

给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&#xff1…...

Node18.x基础使用总结(二)

Node18.x基础使用总结 1、Node.js模块化1.1、模块暴露数据1.2、引入模块 2、包管理工具2.1、npm2.2、npm的安装2.3、npm基本使用2.4、搜索包2.5、下载安装包2.6、生产环境与开发环境2.7、生产依赖与开发依赖2.8、全局安装2.9、修改windows执行策略2.10、安装包依赖2.11、安装指…...

LCD 的RGB接口(SYNC Mode/ SYNC-DE Mode/ DE Mode)

1、 SYNC Mode Timing Diagram 2、 SYNC-DE Mode Timing Diagram 3、 DE Mode Timing Diagram RGB接口&#xff08;SYNC Mode/ SYNC-DE Mode/ DE Mode&#xff09;-CSDN博客...

flink生成水位线记录方式--周期性水位线生成器

背景 在flink基于事件的时间处理中&#xff0c;水位线记录的生成是一个很重要的环节&#xff0c;本文就来记录下几种水位线记录的生成方式的其中一种&#xff1a;周期性水位线生成器 周期性水位线生成器 1.1 BoundedOutOfOrdernessTimeStampExtractor 他会接收一个表示最大延…...

百度资源搜索平台出现:You do not have the proper credential to access this page.怎么办?

Forbidden site not allowed You do not have the proper credential to access this page. If you think this is a server error, please contact the webmaster. 如果你的百度资源平台&#xff0c;点进去出现这个提示&#xff0c;说明您的网站已经被百度清退了。如果你的网站…...

树莓派CM4开启I2C与UART串口登录同时serial0映射到ttyS0 开启多串口

文章目录 前言1. 树莓派开启I2C与UART串口登录2. 开启多串口总结&#xff1a; 前言 最近用CM4的时候使用到了I2C以及多个UART的情况。 同时配置端口映射也存在部分问题。 这里集中记录一下。 1. 树莓派开启I2C与UART串口登录 输入指令sudo raspi-config 跳转到如下界面&#…...

【租车骑绿道】python实现-附ChatGPT解析

1.题目 租车骑绿道 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 部门组织绿道骑行团建活动。租用公共双人自行车骑行,每辆自行车最多坐两人、做大载重M。 给出部门每个人的体重,请问最多需要租用多少双人自行车 输入描述 第一行两个数字m、n,自行车限重m,代表部门总…...

【ONE·Linux || 多线程(一)】

总言 多线程&#xff1a;进程线程基本概念、线程控制、互斥与同步。 文章目录 总言1、基本概念1.1、补充知识1.1.1、堆区细粒度划分1.1.2、虚拟地址到物理空间的转化 1.2、如何理解线程、进程1.2.1、如何理解线程&#xff1f;1.2.2、如何理解进程&#xff1f; 1.3、实践操作1.…...

华为智能企业上网行为管理安全解决方案(1)

华为智能企业上网行为管理安全解决方案&#xff08;1&#xff09; 课程地址方案背景需求分析企业上网行为概述企业上网行为安全风险分析企业上网行为管理需求分析 方案设计组网架构设备选型设备简介行为管理要点分析方案功能概述 课程地址 本方案相关课程资源已在华为O3社区发…...

Acwing 240. 食物链

Acwing 240. 食物链 题目描述思路讲解代码展示 题目描述 思路讲解 代码展示 #include <iostream>using namespace std;const int N 50010;int n, m; int p[N], d[N]; //p[]是并查集的father,d[]是距离int find(int x) {if (p[x] ! x) { //如果说x不是树根的话int t f…...

c++ 容器适配器

Container //创建一个命名空间&#xff0c;避免和库里的冲突 namespace chen {//写一个模版template<class T, class Container deque<T>>//开始写我们的类class stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const …...

正则表达式的应用领域及基本语法解析

目录 一、正则表达式的应用领域 1. 文本搜索和替换 2. 表单验证 3. 数据提取和分析 4. 数据清洗和处理 5. URL路由和路由匹配 二、正则表达式的基本语法 1. 字符匹配 2. 元字符和字符类 3. 量词和边界 4. 分组和捕获 5. 转义字符 三、常见正则表达式示例 1. 邮箱…...

CIP或者EtherNET/IP中的PATH是什么含义?

目录 SegmentPATH举例 最近在学习EtherNET/IP&#xff0c;PATH不太明白&#xff0c;翻了翻规范&#xff0c;在这里记个笔记。下面的叙述可能是中英混合&#xff0c;有一些是规范中的原文我直接搬过来的。我翻译的不准确。 Segment PATH是CIP Segment中的一个分类。要了解PATH…...

使用lombok进行bulider之后调取HashMap的自定义方法进行对象操作报空指针异常(pojo也适用)

概论 这主要的问题就是bulider的特性的问题&#xff0c;就是他只能给你搭建了一个脚手架&#xff0c;里面的东西其实他没动你的&#xff0c;你得自己去给他实体化&#xff0c;如果你使用了类似HashMap等集合的话&#xff0c;你得自己去bulid一个在那个里面作为初始化对象你才可…...

矩阵-day14

...

上古神器:十六位应用程序 Debug 的基本使用

文章目录 参考环境上古神器 DebugBug 与 DebuggingDebugDebug 应用程序淘汰原因使用限制 DOSBox学习 Debug 的必要性DOSBox-X Debug 的基本使用命令 R查看寄存器的状态修改寄存器的内容 命令 D显示内存中的数据指定起始内存空间地址指定内存空间的范围 命令 A使用命令语法错误查…...

[学习笔记]ARXML - Data Format

参考AUTOSAR文档&#xff1a; https://www.autosar.org/fileadmin/standards/R22-11/FO/AUTOSAR_TPS_ARXMLSerializationRules.pdfhttps://www.autosar.org/fileadmin/standards/R22-11/FO/AUTOSAR_TPS_ARXMLSerializationRules.pdf 编码 arxml只允许使用UTF-8编码&#xff…...

Go_原子操作和锁

原子操作和锁 本文先探究并发问题&#xff0c;再探究锁和原子操作解决问题的方式&#xff0c;最后进行对比。 并发问题 首先&#xff0c;我们看一下程序 num该程序表面看上去一步就可以运行完成&#xff0c;但是实际上&#xff0c;在计算机中是分三步运行的&#xff0c;如下…...

初识Java 12-1 流

目录 Java 8对流的支持 流的创建 随机数流 int类型的区间范围 generate() iterate() 流生成器 Arrays 正则表达式 本笔记参考自&#xff1a; 《On Java 中文版》 ||| 流的概念&#xff1a;流是一个与任何特定的存储机制都没有关系的元素序列。 流与对象的成批处理有关…...

【软件工程_UML—StartUML作图工具】startUML怎么画interface接口

StartUML作图工具怎么画interface接口 初试为圆形 &#xff0c;点击该接口在右下角的设置中->Format->Stereotype Display->Label&#xff0c;即可切换到想要的样式 其他方式 在class diagram下&#xff0c;左侧有interface图标&#xff0c;先鼠标左键选择&#xff0…...

单片机之瑞萨RL78定时计数器

单片机之瑞萨RL78定时计数器 使用瑞萨RL78定时计数器的简单例程。这个例程使用定时器0来产生一个以秒为单位的定时器中断&#xff0c;并在中断服务程序中增加一个全局变量以跟踪中断的发生。 首先&#xff0c;我们需要了解RL78的定时器0是一个16位的定时器&#xff0c;它的时钟…...

手机号码格式校验:@Phone(自定义参数校验注解)

需求 新增接口 和 修改接口 中&#xff0c;手机号码的格式校验是普遍需要的。 在每个手机号码字段上添加正则表达式校验注解来实现校验&#xff0c;重复书写&#xff0c;容易出错&#xff1b;在不同的手机号码字段上&#xff0c;可能使用了不同的校验规则&#xff0c;无法有效…...

ORACLE Redo Log Buffer 重做日志缓冲区机制的设计

最近和朋友包括一些国产数据库的研发人员交流&#xff0c;很多程序员认为 Oracle 已经过时&#xff0c;开源数据库或者他们研发的国产数据库才代表数据库发展的未来。甚至在很多交流会议上拿出自家产品的某一个功能点和 Oracle 对比就觉得已经遥遥领先。 实际上数据库系统的发展…...

网站开发主流语言/爱站网关键词挖掘工具站长工具

使用场景&#xff1a;服务器数据不符合测试条件时&#xff0c;我们可以通过在本地创建虚拟数据来打到测试用例所描述的条件。 fiddler使用方法 1、首先在本地创建txt数据&#xff1a;将抓到的response中的json数据拷贝到记事本&#xff0c;我们根据需要进行修改&#xff0c;然后…...

有什么做外贸的好网站/下载百度免费

--动态分区属性&#xff1a;设置true表示开启动态分区功能&#xff08;默认为false&#xff09; hive.exec.dynamic.partition true --动态分区属性&#xff1a;设置为nonstrict表示允许所有分区都是动态的&#xff08;默认为strict&#xff09; --设置为strict&#xff0c…...

临沂做网站选盛誉/网站优化建设

曾经有人说过&#xff0c;世界上有两种编辑器&#xff0c;好用和不好用的&#xff1b;而在好用的编辑器中&#xff0c;又分两种&#xff0c;免费的和死贵死贵的。譬如说 VIM 和 TextMate&#xff0c;就是免费和死贵的典型。很不幸&#xff0c;今天的主角 Sublime Text 2 也是个…...

北京市保障房建设投资中心网站首页/免费的网站域名查询app

转自&#xff1a;http://www.tairan.com/archives/3998 cocos2d-x 中有自己的定时器实现&#xff0c;一般用法是在场景&#xff0c;层等内部实现&#xff0c;定时器的生命周期随着它们的消亡而消亡&#xff0c;就运行周期而言&#xff0c;相对最长的是场景&#xff0c;如果在多…...

阳春市建设局网站/web网页制作成品

Employee 表包含所有员工信息&#xff0c;每个员工有其对应的 Id, salary 和 department Id 。 --------------------------------- | Id | Name | Salary | DepartmentId | --------------------------------- | 1 | Joe | 70000 | 1 | | 2 | Henry | 80000…...

p2p网站建设cms/seo网络推广公司

​ 配置php断点调试 找到php.ini配置文件 文件路径 &#xff1a;E:\wamp64\bin\apache\apache2.4.23\bin 找到xdebuger的配置信息位置。 添加配置信息 添加配置信息后重启服务器。 进入Localhost查看配置信息。 进入phpinfo。 能看到配置信息表示添加成功。 Phpstorm配置 配置调…...