数据同步,还看Canal

news2024/11/26 19:46:06

一个系统最重要的是数据,有时对于一个业务场景,不单单是把数据保存在数据库中,还需要同步保存在ES,Redis等等中。这时阿里开源组件Canal由此而生,它可以同步数据库中的增量数据保存到其它存储应用中。

一、介绍

 canal的工作原理就是把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Mater发送 dump协议,MySQL mater收到canal发送过来的dump请求,开始推送binary log给canal,然后canal解析binary log,再发送到存储目的地,比如MySQL,Kafka,Elastic Search等等。


通过上面官网的描述可知,Canal的数据同步不是全量的,而是增量的。是基于binary log增量订阅和消费,因此,Canal可做:(参考:官网)

  • 数据库镜像
  • 数据库实时备份
  • 索引构建和实施维护
  • 业务cache(缓存)刷新
  • 增量数据处理

二、搭建Canal

 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x

2.1设置MySQL服务器

-- 使用命令登录:mysql -u root -p
-- 创建用户 用户名:canal 密码:Canal@123456
create user 'canal'@'%' identified by 'Canal@123456';
-- 授权 库名.*
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON template.* TO 'canal'@'%';

报错:

 解决方法

因为replication slave 的级别是global,所以不能只作用于某一数据库,而是全局。所以还是要通过 *.* 执行,并在/etc/my.cnf中添加binlog-do-db=template来限制主从复制的数据库为template

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;

对已有账户进行查询:

show grants for 'canal'

 2.2修改/etc/my.cnf文件

# 配置MySQL replaction需要定义,不要和canal的slaveId重复
server_id= 1
# 开启MySQL的binlog
log-bin=mysql-bin
# 选择ROW(行)模式
binlog_format=row
#监控的数据库  不写则开启全部数据库的监听
binlog-do-db=gmallXXXXX

2.2.1MySQL的binlog介绍

MySQL的二进制日志记录了所有的DDL和DML( 除了数据查询语句 )语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。

一般来说开启二进制日志大概会有1%的性能损耗。二进制有两个最重要的使用场景:

  • MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。
  • 通过使用mysqlbinlog工具来使恢复数据。

二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。

binlog日志的前缀是mysql-bin ,以后生成的日志文件就是 mysql-bin.123456 的文件后面的数字按顺序生成。 每次mysql重启或者到达单个文件大小的阈值时,新生一个文件,按顺序编号。

2.2.2binlog的分类设置

  • statement 【语句集】

binlog会记录每次一执行写操作的语句。 相对row模式节省空间,但是可能产生不一致性,例如:update table_name set create_date=now();如果用binlog日志进行恢复,由于执行时间不同可能产生的数据就不同 ( master落库数据时create_date为2021-08-08 11:10:30 ,但binlog从库落库执行语句时create_date的时间可能就变为2021-08-08 11:11:23 ,主要是语句执行时间为异步)

优点: 节省空间

缺点: 有可能造成数据不一致

  • row 【行级】

binlog会记录每次操作后每行记录的变化。

优点:保持数据的绝对一致性。因为不管sql是什么,引用了什么函数,他只记录执行后的效果。

缺点:占用较大空间。

  • mixed 【综合语句集和行级】

 statement的升级版,一定程度上解决了因一些情况而造成的statement模式不一致问题,在某些情况下譬如:

  1. 当函数中包含 UUID() 时;
  2. 包含 AUTO_INCREMENT 字段的表被更新时;
  3. 执行 INSERT DELAYED 语句时;
  4. 用 UDF 时;

会按照 ROW的方式进行处理

优点:节省空间,同时兼顾了一定的一致性。

缺点:还有些极个别情况依旧会造成不一致,另外statement和mixed对于需要对binlog的监控的情况都不方便。

2.3重启MySQL

service mysqld restart

使用命令查看是否打开binlog模式:show variables like 'log_bin';

查看binlog日志文件列表:show binary logs;

 查看当前正在写入的binlog文件:show master status;

三、安装Canal

下载地址:Release v1.1.6 · alibaba/canal · GitHub

 3.1版本区别

3.1.1canal-deploy(canal-server)

可以直接监听MySQL的binlog,把自己伪装成MySQL的从库,只负责接收数据,并不做处理。接收到MySQL的binlog数据后可以通过配置canal.serverMode:tcp, kafka, rocketMQ, rabbitMQ连接方式发送到对应的下游。其中tcp方式可以自定义canal客户端进行接受数据,较为灵活。

3.1.2canal-adapter(官网提供的canal-client)

相当于canal的客户端,会从canal-server中获取数据(需要配置为tcp方式),然后对数据进行同步,可以同步到MySQL、Elasticsearch和HBase等存储中去。

相较于canal-server自带的canal.serverMode,canal-adapter提供的下游数据接受更为广泛。

3.1.3canal-admin

为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作。

3.2安装

wget  https://github.com/alibaba/canal/releases/download/canal-1.1.6/canal.deployer-1.1.6.tar.gz

git太慢了,也可以使用docker

docker pull canal/canal-server

docker run --name canal -d canal/canal-server

#配置文件

docker cp canal:/home/admin/canal-server/conf/canal.properties /usr/tchuhu/canal/conf

docker cp canal:/home/admin/canal-server/conf/example/instance.properties /usr/tchuhu/canal/conf

3.3修改配置文件

#########################canal.properties###########################
# 默认端口 11111
# 默认输出model为tcp, 这里根据使用的mq类型进行修改
# tcp, kafka, RocketMQ
canal.serverMode = tcp

#################################################
######### destinations ############# 
#################################################
# canal可以有多个instance,每个实例有独立的配置文件,默认只 有一个example实例。
# 如果需要处理多个mysql数据的话,可以复制出多个example,对其重新命名,
# 命令和配置文件中指定的名称一致。然后修改canal.properties 中的 canal.destinations
# canal.destinations=实例 1,实例 2,实例 3
canal.destinations = example
########instance.properties###############
# 不能和mysql重复
canal.instance.mysql.slaveId=2
# 使用mysql的虚拟ip(这里因为创建用户时写的%,所以不要写127.0.0.1)和端口
canal.instance.master.address=IP:3306
# 使用已创建的canal用户
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
# canal.instance.defaultDatabaseName =test

# 问题:(原本这样的,值同步test库,此处没能解决,单据指定数据库同步配置)
# canal.instance.filter.regex=.*\\..*
# canal.instance.defaultDatabaseName =test

# 注掉上面,然后添加,同步所有的库。
# .\*\\\\..\*:  表示匹配所有的库所有的表
canal.instance.filter.regex =.\*\\\\..\*

# 目的地,可以认识一个消息队列,不需要更改。
canal.mq.topic=example

# 如果是

docker run --name canal -p 11111:11111 -v /usr/tchuhu/canal/conf/instance.properties:/home/admin/canal-server/conf/example/instance.properties -v /usr/tchuhu/canal/conf/canal.properties:/home/admin/canal-server/conf/canal.properties

-v /usr/tchuhu/canal/logs:/home/admin/canal-server/logs

-d canal/canal-server

注:内存不足时canal会自动退出

查看内存:free -m

释放内存:sync; echo 3 > /proc/sys/vm/drop_caches

如果还不行的话,增加虚拟内存:

关闭原本的swap:sudo swapoff -a  【此时swap已经变成0】

设置新的swap大小:

dd if=/dev/zero of=/swapfile bs=1M count=31906
  • of是指 在指定的路径创建swapfile文件
  • bs指的是Block Size,就是每一块的大小。这里的例子是1M,意思就是count的数字,是以1M为单位的。
  • count是告诉程序,新的swapfile要多少个block。这里是31906,就是说,新的swap文件是31906M大小,也就是将近32G。
  • 注意:可能需要点时间完成此步,耐心等待完成。
  • 注意:swap大小原则,设置为物理内存的1-2倍大小。因为最开始分析就是物理内存或swap内存不足导致,因此这里讲swap内存设置为物理内存的2倍大小。

完成:

把新增加的swapfile文件设置为swap文件 :sudo mkswap /swapfile

修改/etc/fstab文件,让swap在启动时自动生效:vi /etc/fstab

在文件最后一行添加  

/swapfile swap  swap  defaults  0   0

重启服务器:reboot

挂载swapfile文件:swapon /swapfile

查看结果:

 启动成功:

taif -f example.log

 四、springboot集成

4.1引入依赖

        <dependency>
            <groupId>top.javatool</groupId>
            <artifactId>canal-spring-boot-starter</artifactId>
            <version>1.2.1-RELEASE</version>
        </dependency>
canal.server=IP:11111
canal.destination=example

启动后,控制台一直打印:

 添加配置:

logging.level.top.javatool.canal.client=warn 

#禁止AbstractCanalClient 打印常規日志 获取消息 {}

4.2写代码

@Component
@Slf4j
@CanalTable("metabolome")
public class MetHandler implements EntryHandler<Metabolome> {
    @Override
    public void insert(Metabolome metabolome) {
        //新增
        System.out.println("新增:"+metabolome.toString());
    }

    @Override
    public void update(Metabolome before, Metabolome after) {
        //修改
        System.out.println("修改前:"+before.toString());
        System.out.println("修改后:"+after.toString());
    }

    @Override
    public void delete(Metabolome metabolome) {
        System.out.println("删除:"+metabolome);
    }
}

修改一条记录,运行结果:

 canal消息格式:

Entry  
    Header  
        logfileName [binlog文件名]  
        logfileOffset [binlog position]  
        executeTime [binlog里记录变更发生的时间戳,精确到秒]  
        schemaName   
        tableName  
        eventType [insert/update/delete类型]  
    entryType   [事务头BEGIN/事务尾END/数据ROWDATA]  
    storeValue  [byte数据,可展开,对应的类型为RowChange]  
RowChange
    isDdl       [是否是ddl变更操作,比如create table/drop table]
    sql         [具体的ddl sql]
rowDatas    [具体insert/update/delete的变更数据,可为多条,1个binlog event事件可对应多条变更,比如批处理]
    beforeColumns [Column类型的数组,变更前的数据字段]
    afterColumns [Column类型的数组,变更后的数据字段]
    Column
    index
    sqlType     [jdbc type]
    name        [column name]
    isKey       [是否为主键]
    updated     [是否发生过变更]
    isNull      [值是否为null]
    value       [具体的内容,注意为string文本]

五、总结

canal的tcp模式,需要自己解析数据,一条插入语句同时插入多条记录,会产生多条消息。而kafka模式,同时插入多条记录会只会产生一条消息(通过json数组的方式)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/50147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

航空专场 | 无人机设计仿真流程讲解与案例实操

一、CFD在无人机上的应用 1、静、动气动系数计算以上介绍的无人机的流动状态一般为中低雷诺数&#xff0c;不可压缩流动。这些计算一般用S-A模型或者KW-SST模型进行计算&#xff0c;能够获得不错的工程精度。静、动气动力系数主要用于无人机操纵性和稳定性的分析&#xff0c;评…

串口 COM口,并口 LPT口,RS232、RS485、CAN

RS232 和 RS485 的区别 工作模式&#xff1a;RS232 为全双工&#xff0c;RS485 为半双工。 传输方式&#xff1a;RS485和RS232只是物理协议的通信&#xff08;即接口标准&#xff09;&#xff0c;RS485是差分传输方式&#xff0c;RS232是单端传输方式&#xff0c;但通信程序没有…

RabbitMQ_五种模式

1.Simple("Hello World") 构成&#xff1a;生产者、消费者、消息队列 配置类 构造函数参数&#xff1a;name durable exclusive autoDelete 仅创建队列&#xff0c;不创建交换机&#xff0c;也不进行队列和交换机的绑定 注&#xff1a;配置类置于生产者端或消费者…

如何处理 Angular 单页面应用里的 a 标签,避免点击后重新加载整个应用

问题描述 客户已经实现了一些“free html”组件&#xff0c;它是 HTML 的标题和包装器&#xff0c;与 OCC 响应一起作为内容。 <div [innerHTML]"data?.content | safeHtml"></div>这个 HTML 里包含了 anchor element&#xff1a; <div class&quo…

Linux源码——目录作用

Linux Linux是啥&#xff0c;不用多说&#xff0c;其源码结构也非常清晰。有以下理解&#xff1a; arch 每个系列的CPU都有一个对应的文件夹&#xff0c;里面包含每种CPU具体的操作&#xff0c;单独具体粗来每种CPU独有的管理或者操作。其他的文件夹都是通用的操作。 arch (…

孤核函数-isolation kernel

1.孤立核 一看到核函数&#xff0c;我们第一时间想到的就是核函数通过升维或者降维的方式来计算数据之间的相似度。他在SVM和聚类算法中应用广泛。 我们就直入主题来看一下孤核函数的数学推导。 在d维的空间分布着n个点。数学表达式为. 如图&#xff1a;一共20个点分布在2维空间…

浅析linux内核网络协议栈--linux bridge

1 . 前言 本文是参考附录上的资料整理而成&#xff0c;以帮助读者更好的理解kernel中brdige 模块代码。 2. 网桥的原理 2.1 桥接的概念 简单来说&#xff0c;桥接就是把一台机器上的若干个网络接口“连接”起来。其结果是&#xff0c;其中一个网口收到的报文会被复制给其他…

深入了解BLE(Bluetooth 5.3)持续更新...

目录 1 BLE的优点和局限性 1.1 BLE与经典蓝牙的区别 1.2 局限性 1.2.1 数据吞吐量 1.2.2 范围 1.3 BLE优势及应用 1.4 BLE的角色 1.5 BLE的层次结构 1.5.1 物理层&#xff08;PHY&#xff09; 1.5.2 链路层 1.5.2.1 数据包格式 1.5.2.2 状态机 1.5.2.3 设备地址 …

PTA_1164 Good in C_模拟

PTA_1164 Good in C_模拟 1164 Good in C 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 When your interviewer asks you to write "Hello World" using C, can you do as the following figure shows? Input Specification: Each input file conta…

STM32实战总结:HAL之FSMC控制TFT-LCD

什么是FSMC&#xff1f; FSMC(Flexible Static Memory Controller&#xff0c;可变静态存储控制器)是STM32系列采用的一种新型的存储器扩展技术。在外部存储器扩展方面具有独特的优势&#xff0c;可根据系统的应用需要&#xff0c;方便地进行不同类型大容量静态存储器的扩展。 …

计算机网络 HTTP

概念 Web 基础 HTTP &#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;。WWW &#xff08;World Wide Web&#xff09;的三种技术&#xff1a;HTML、HTTP、URL。RFC&#xff08;Request for Comments&#xff0c;征求意见书&#xff09;&#…

HTTP DDOS攻击有什么类型和特点?

一、攻击类型 1、 HTTP floods 该攻击类型分为HTTP GET request floods和HTTP POST request floods两种形式&#xff0c;第一种攻击者通过构造HTTP GET请求报文&#xff0c;向目标服务器发送针对特定资源的大量请求&#xff1b;一条HTTP请求的成本很低&#xff0c;但是目标服…

力扣(LeetCode)124. 二叉树中的最大路径和(C++)

深度优先遍历 自底向上的递归。 对于二叉树&#xff0c;我们令每个结点作为 LCALCALCA (最近公共祖先)&#xff0c; 结点 uuu 作为 LCALCALCA &#xff0c; 经过它的最大路径 往左子树的最大路径 往右子树的最大路径 它自己的路径 。 有 ansmax(ans,vulrans max(ans,v_ul…

MobPush 厂商通道SDK集成指南

开发工具&#xff1a;Android Studio 集成方式&#xff1a;Gradle在线集成 安卓版本支持&#xff1a;minSdkVersion 19 集成准备 MobPush快速集成 在使用厂商通道之前&#xff0c;请确保您已申请MobTech开发者账号并已按照MobPush快速集成文档进行集成&#xff0c;本篇文档将…

POI实现Excel导入和导出(源码测试)

因为实际开发中很多需求都需要实现Excel批量导入和导出&#xff0c;所以今天就来写一个后端demo实现Excel的导入和导出。 需求&#xff1a; Excel的导入 1对文件路径为D:\Users\Mixi\IdeaProjects\javapoi-anli\product-test.xlsx 的Excel文件导入到数据库&#xff1b; Excel的…

SAP 采购订单免费标识自动勾选的判断依据

SAP采购订单的免费标识没有专门的字段存储,是根据发票收据和项目类别计算出来的 写程序的时候折磨判断呢? 1.EKPO-REPOS <> ‘X’ AND EKPO-PSTYP <> ‘2’ AND EKPO-PSTYP <> ‘7’ &#xff0c;则系统会自动勾选上这个免费项目 2.如果要求不是很精密&…

机器学习之MATLAB代码--LSTM-SVRNN(五)

机器学习之MATLAB代码--LSTM-SVRNN&#xff08;五&#xff09;代码数据结果代码 1、cdmnn.m文件 %% 组合模型 %% %% 数据导入 clc;clear;warning off; data xlsread(nndata.xlsx, sheet1, A2:G350); load LSTMoutput load SVMoutput %% nwholelength(data); %计算数据长度…

Vue笔记_transition组件(过渡样式)

目录transition组件作用过渡时机语法1语法2使用-animation侦动画使用-过渡动画总结transition组件 作用 transition组件的作用是 给 单个 元素/组件 添加过渡效果&#xff1b; transition-group组件的作用是给 多个 元素/组件 添加过渡效果&#xff1b; 过渡时机 vue只有在…

【pen200-lab】10.11.1.13

pen200-lab 学习笔记 【pen200-lab】10.11.1.13 &#x1f525;系列专栏&#xff1a;pen200-lab &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月30日&#x1f334; &#x1f36d;作…

turtlebot2利用turtlebot_exploration_3d进行自主建图

安装octomap_ros和rviz插件 sudo apt-get install ros-indigo-octomap*源码安装&#xff1a;turtlebot_exploration_3d(本机为Ubuntu16对应的ros版本为kinetic&#xff0c;但是无对应的版本&#xff0c;用的是ubuntu14的indigo&#xff0c;版本向前兼容&#xff0c;故可以运行&…