【前后端分离博客】学习笔记05 --- canal

news2024/12/23 22:24:33

一、概述

使用canal + rabbitMQ 实现 MySQL 和 Elasticsearch 的数据同步

图解:

流程如下:

  • 给mysql开启binlog功能

  • mysql完成增、删、改操作都会记录在binlog中

  • canal监听binlog变化并发送消息到MQ,项目接收消息并实时更新elasticsearch中的内容

  

 

二、什么是数据同步

elasticsearch中的数据来自于mysql数据库,因此mysql数据发生改变时,elasticsearch也必须跟着改变,这个就是elasticsearch与mysql之间的数据同步

思路分析:

常见的数据同步方案有三种:

  • 同步调用

  • 异步通知

  • 监听binlog

三、认识Canal

canal-github仓库

Canal介绍:Canal 是用 Java 开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件(数据库同步需要阿里的 Otter 中间件,基于 Canal)。

Canal背景:阿里巴巴 B2B 公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了同步杭州和美国异地机房的需求,从 2010 年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务。

Canal原理:自己伪装成 Slave,假装从 Master 复制数据,实际上就是主从复制的一个流程(通过增量复制来不断的进行订阅消费数据)

主从复制原理

  • Master 主库将改变记录,写到二进制日志(Binary Log)中; 
  • Slave 从库向 MySQL Master 发送 dump 协议,将 Master 主库的 binary log events 拷贝到它的中继日志(relay log); 
  • Slave 从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。

binlog的分类:statement、row、mixed。在canal配合mysql时,mysql需要配置binlog模式为row(推荐)。

  • statement:记录每一次执行写操作的sql语句,但是可能会产生数据不一致,例如sql语句update tt set create_date=now(),其中就有now()函数,若是其他从结点进行同步就会出现问题。
  • row:记录每次操作后每行记录的变化,直接记录的是数据,能够保持数据的一致性,缺点就是比较占空间。
  • mixed:statement 的升级版,默认实质还是statement,对于uuid()、auto_increment会使用row模式处理,还算是比较智能,但是极个别情况还是会造成数据不一致,并且由于默认依旧是statement,实际上就是sql+数据形式。

常用场景

1、异地数据库的同步。

2、更新缓存。(例如以往的对应某些数据库表字段会设置缓存,处理更新数据库时的字段对缓存进行更新,在高并发的情况下会造成数据一致性问题,此时可以使用canal)

3、抓取数据更新,来进行实时数据分析。

 

 

四、安装配置Canal

当前安装的MySQL版本:8.0.33,Canal版本是最新版

Docker的安装可见:Docker --- 简介、安装

 

4.1、准备

对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下

[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复

授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant

CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;

注意:一定要查看bin-log是否已经开启,下面的命令我们可以去进行一个查看当前mysql的信息:

# 查看binlog日志是否开启
show variables like 'log_%';

# 查看主结点当前状态
show master status

 

4.2、Docker快速安装Canal

Canal下载地址

tar压缩包安装:官方文档

Docker安装的官方文档:Canal Docker QuickStart

1、拉取Canal的镜像文件:

docker pull canal/canal-server:latest

2、启动 canal 镜像

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

3、创建映射文件

mkdir /usr/local/canal
cd /usr/local/canal
touch canal.properties instance.properties

4、将容器内的配置文件复制到刚创建好的文件里

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

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

5、关闭容器并移除容器

docker rm -f canal

6、修改外部配置文件 instance.properties

7、修改外部配置文件 canal.properties

找到以下这行将tcp改成rabbitMQ

# tcp, kafka, rocketMQ, rabbitMQ, pulsarMQ
canal.serverMode = rabbitMQ

接着找到以下这几行

##################################################
######### 		    RabbitMQ	     #############
##################################################
rabbitmq.host = 你的ip
rabbitmq.virtual.host = /
rabbitmq.exchange = article.topic # 交换机名称
rabbitmq.username = rabbitmq用户名
rabbitmq.password = rabbitmq密码
rabbitmq.deliveryMode = topic # exchange的模式

笔记:

  • 在 RabbitMQ 中,消息的发送需要指定目标队列或者交换机。如果你只绑定了一个消息队列到交换机上,那么在发送消息时可以不指定队列名称,而是将消息直接发送到该交换机,消息将会被路由到该交换机所绑定的唯一队列中。
  • 因此,发送消息时可以不填写消息队列名称,但需要指定交换机的名称和消息的路由键。如果消息的路由键与交换机所绑定的队列的路由键匹配,那么消息将会被成功路由到该队列中。如果消息的路由键与交换机所绑定的队列的路由键不匹配,那么消息将会被丢弃。
  • 需要注意的是,如果你在发送消息时指定了不存在的交换机名称,或者指定了与交换机类型不匹配的交换机名称,那么消息将会发送失败。

 

8、执行命令启动canal容器

# 启动canal服务
# -i:让容器的标准输入保持打开(特别特别重要,注意不要是-d,一定要加上i)
docker run --name canal \
-p 11111:11111 \
-v /usr/local/canal/instance.properties:/home/admin/canal-server/conf/example/instance.properties \
-v /usr/local/canal/canal.properties:/home/admin/canal-server/conf/canal.properties \
-id canal/canal-server:latest

启动完canal之后,去查看canal实例的日志内容,判断是否已经成功连接到mysql:

# 进入到docker容器
docker exec -it canal /bin/bash

# 打开日志文件
cd canal-server/logs/example/

# 查看日志文件的最后100行内容
tail -100 example.log 

下面是连接成功的情况:

如果出现数据库连接异常

  • 仔细查看用户名、密码是否正确
  • 配置文件中设置的MySQL的IP以及端口号是否正确

 

4.3、测试

配置完成后,进行数据库CRUD操作,查看RabbitMQ中是否有消息发送成功

项目中编写消费者类用于接收处理消息进行ES的增删改

/**
 * 文章消费者
 *
 * @author DarkClouds
 * @date 2023/05/18
 */
@Component
@RequiredArgsConstructor
public class ArticleConsumer {

    private final ElasticsearchService elasticsearchService;

    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue(value = ARTICLE_QUEUE, durable = "true", autoDelete = "false"),
                    exchange = @Exchange(value = ARTICLE_EXCHANGE, type = ExchangeTypes.TOPIC),
                    key = ARTICLE_KEY
            )})
    public void listenSaveArticle(Message message) {
        String data = new String(message.getBody(), StandardCharsets.UTF_8);
        CanalDTO canalDTO = JSONUtil.toBean(JSONUtil.toJsonStr(data), CanalDTO.class);
        if (canalDTO.getIsDdl()) {
            return;
        }
        ArticleSearchVO article = JSONUtil.toBean(JSONUtil.toJsonStr(canalDTO.getData().get(0)), ArticleSearchVO.class);
        switch (canalDTO.getType()) {
            case INSERT:
                elasticsearchService.addArticle(article);
            case UPDATE:
                elasticsearchService.updateArticle(article);
                break;
            case DELETE:
                elasticsearchService.deleteArticle(article.getId());
                break;
            default:
                break;
        }
    }
}

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

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

相关文章

IS215UCVEH2AE speed tronic涡轮控制PCB板

IS215UCVEH2AETPMC815-11IS215UCVEM08B IS215UCVEH2AE是通用电气公司Mark VI Speedtronic控制系统的一个组件。该板的功能相当于VME控制卡。VME卡架是Mark VI的标准架,有13或21槽架可供选择。 IS215UCVEH2AE是一个带有附加前面板的矩形板。面板顶部和底部有一个固…

震惊——某白帽破解zabbix系统,实现命令执行,最终获取shell

如果你坚持了自己的梦想,全世界都会为你让路。 一、漏洞说明 zabbix([zbiks])是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案(百度百科定义)。很多Zabbix的admin口令使用了初始账号&…

【学习日记2023.5.17】之 项目入门介绍_YApi_Swagger

文章目录 1. 项目入门1.1 软件开发整体介绍1.2 项目介绍1.3 开发环境搭建1.3.1 前端环境搭建1.3.2 后端环境搭建1.3.3 登录功能完善1.3.4 前后端分离开发流程 1.4 导入接口文档1.5 Swagger介绍使用方式Swagger常用注解 1.6 注意事项 1. 项目入门 1.1 软件开发整体介绍 软件开发…

PySide6/PyQT多线程之 高效管理多线程:暂停、恢复和停止的最佳实践

前言 关于 PySide6/PyQT 多线程,正确地处理多线程编程并确保线程之间的同步和通信并不容易。 本文以一个示例代码为基础,介绍 PySide6/PyQT多线程的运用,展示如何创建和管理线程,以及如何实现线程之间的同步和通信。 设想这么一个…

IP组播路由协议(组播内部网关协议)

IP组播路由协议:用来建立组播树,是实现组播传输的关键技术。分为源分发树和共享分发树。 PIM:协议无关组播 密集模式: PIM-DM:密集模式PIM DVMRP:距离矢量组播路由协议 MOSPF:组播开放式最短链路优先 稀疏模式 CBT:基于核心的树 PIM-SM:稀疏模式PIM 这…

微星UEFI签名密钥泄露引发“末日”供应链攻击恐慌

对硬件制造商微星Micro-Star International(更广为人知的名称是 MSI)的勒索软件入侵引发了人们对毁灭性供应链攻击的担忧,这些攻击可能会注入恶意更新,这些更新已使用受大量最终用户设备信任的公司签名密钥进行签名。 这有点像世…

chatgpt赋能Python-python3_7怎么更新

Python3.7如何更新? 对于拥有10年Python编程经验的工程师来说,更新Python版本是必不可少的。现在最新版本的Python是3.7,那么这个版本应该如何更新呢? 更新步骤 下载Python3.7安装包 在Python官网上下载即可。如果你使用的是L…

Cube Map 系列之:手把手教你 实现 立方体贴图

什么是Cube Map 在开始立方体贴图之前,我们先简单了解下cube map。 cube map 包含了六个纹理,分别表示了立方体的六个面; 相较二维的纹理使用坐标uv来获取纹理信息,这里我们需要使用三维的方向向量来获取纹理信息(一…

力扣---LeetCode20. 有效的括号(栈)

文章目录 前言🌟一、20. 有效的括号🌟二、链接🌟三、方法:栈实现🌏3.1思路:🌏3.2代码: 🌟四、补充:😽总结 前言 👧个人主页&#xff1…

springboot+java高校教师学术成果管理系统-idea

功能介绍项目介绍Spring框架是Java平台的一个开放源代码的Full-stack(全栈)应用程序框架,和控制翻转容器的实现。Spring框架的一些核心功能理论,可以用于所有Java应用,Spring还为Java EE构建的Web应用提供大量的扩展支持。Spring框架没有实现…

python使用基础 pycharm代码的git同步

我们大家在编写代码的时候经常会遇到各种版本的控制问题。为此版本控制工具是每一个编写代码的同志均需要面临的问题。目前,业内已经有非常成熟的解决方案,比如我们常说的github、gitee等。由于国内网络原因,本文以gitee为例进行使用说明。 1…

基于SpringCloud的分布式网上商城的设计与实现

背景 经过网上调查和搜集数据,我们可以发现商城管理方面的系统并不是相当普及,在分布式架构商城管理方面的可以有许多改进。实际上如今信息化成为一个未来的趋势或者可以说在当前现代化的城市典范中,信息化已经成为主流,开发一个分布式架构网上商城系统一方面的可能会更合乎时…

chatgpt赋能Python-python3_7怎么安装pil

如何在Python3.7中安装PIL? Python3.7是一种流行的编程语言,广泛应用于机器学习、Web开发、数据科学等领域。PIL(Python Imaging Library)是一种Python图像处理库,它提供了丰富的图像处理功能,能够对图像进行缩放、旋转、裁剪等操…

chatgpt赋能Python-python3_8怎么调成黑色背景

如何将Python3.8调整为黑色背景 Python是一种高级编程语言,常用于开发Web应用程序和科学计算。Python3.8是其最新的版本,随着其市场份额的增加,越来越多的程序员对其进行学习和使用。对于那些想要使他们的编程环境更加现代化和个性化的程序员…

060:cesium设置网格Grid材质

第060个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置网格材质,请参考源代码,了解GridMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共93行)相关API参考:专栏目标示例效…

挂机宝搭建教程

nokvm主控面板推荐操作系统版本 Centos7.6.1810 (纯净的操作系统,无其他软件环境) 主控面板硬件要求配置: - 最低要求 推荐配置 内存 2G 2G CPU - - 带宽 不低于2M 2M 磁盘 / 分区不少于100GB 100GB 主控面板安装&#xff1…

关于shrio的动态授权

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、关于表的搭建1.表介绍二、配置shiroFilterFactoryBean 的权限访问三、配置doGetAuthorizationInfo的授权信息前言 其实一开始的写过一次关于shrio的动态授权但是那个是单表实现的不是特别完…

chatgpt赋能Python-python3_9_1怎么安装

Python 3.9.1 安装指南 介绍 Python是一种高级编程语言,具有简洁、易读、易学、可扩展等特点。它是一种面向对象的编程语言,支持多种编程范式,如面向过程编程、函数式编程、面向对象编程等,也支持各种不同的编程领域&#xff0c…

26-jQuery-概述和下载使用

一、什么是 jQuery? jQuery 是一款流行的 JavaScript 框架,被广泛应用于 Web 开发中。它简化了 DOM 操作、事件处理、动画效果等常见任务,提供了丰富的 API 和插件,让开发者能够快速地实现各种功能。jQuery设计的宗旨是"wri…

6G 第六代移动通信和sub6G第五代移动通信的中低频段

“ 6G:第六代移动通信,概念被炒得火热,却一直不冷不热, 受限于功率和传输距离等,很难落地。” “ sub6G:第五代移动通信的中低频段,虽然已部署了很多, 却受限于功耗、成本、杀手级…