Canal解决Mysql和Redis数据同步问题

2023-11-06

目录

前言

一、Mysql主从工作原理

主从复制步骤:

二、使用方法

1.软件下载

软件需求(所有安装包,我的资源都有)

2.修改配置

1:数据库配置修改

2:canal配置修改

3:RocketMQ配置

4:RocketMQ可视化工具配置

3:测试数据

1:启动canal 与 RocketMQ 和 RocketMQ可视化工具

4:Java控制Redis和数据同步

1:准备SpringBoot项目

2:配置文件

总结


前言

今天带给大家的是阿里的一个工具Canal的使用方法,也是市面上解决数据同步相对成熟的方法。

一、Mysql主从工作原理

Mysql主从,根据2/8原则,80%的性能问题都在读上面,当我们数据库的读并发较大的时候,我们可以使用Mysql主从来分担读的压力。它的原理是所有的写操作在主库上,读操作在从库上,当然主库也可以承担读请求,而从库的数据则通过主库复制而来

主从复制步骤:

将Master的binary-log日志文件打开,mysql会把所有的DDL,DML,TCL写入BinaryLog日志文件中
Master会生成一个 log dump 线程,用来给从库的 i/o线程传binlog
从库的i/o线程去请求主库的binlog,并将得到的binlog日志写到中继日志(relaylog)中
从库的sql线程,会读取relaylog文件中的日志,并解析成具体操作,通过主从的操作一致,而达到最终数据一致

而Canal的工作原理就是伪装成mysql的从库去获取Binlog中SQL语句再更新到Redis。

二、使用方法

1.软件下载

软件需求(所有安装包,我的资源都有)

1:Mysql mysql 5.5以上 (有需要的伙伴可以去我资源里自取)

2:Canal组件:官网下载 Canal : https://github.com/alibaba/canal/releases(有需要的资源自取)

3:RocketMQ :官网下载:http://rocketmq.apache.org/release_notes/release-notes-4.2.0/

4:RocketMQ可视化工具 :下载地址:https://github.com/apache/rocketmq-externals/releases

2.修改配置

1:数据库配置修改

找到MYSQL的my.ini文件

 找到[mysqlid]开启Mysql bin-log日志 :首先你的数据库里必须有metaclassroom-system(可以自定义,建库建表就不描述了)修改好之后,重启Mysql服务。{搜索服务:找到mysql服务重启即可}

#开启bInlog
log-bin=mysql-bin
#给mysql服务指定一个唯一的ID
server-id=1
#以数据的方式写binlog日志 :statement 是记录SQL,row是记录数据
binlog-format=ROW
#同步的数据库名
binlog-do-db=metaclassroom-system
#忽略的表
binlog-ignore-db=mysql
# 启动mysql时不启动grant-tables授权表
skip-grant-tables

分配为canal分配角色权限canal文件配合文件可见(conf/example/instance.properties),SQL脚本,在相应库中执行即可。(数据库配置完成)

flush privileges;
#创建用户cannal
CREATE USER canal IDENTIFIED BY 'canal';
#把所有权限赋予canal,密码也是canal
GRANT ALL PRIVILEGES ON canaldb.user TO 'canal'@'%' identified by "canal";
//GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%' identified by "canal";
#刷新权限
flush privileges;

2:canal配置修改

资源下载后解压

 进入conf/example/instance.properties,修改配置

master.address :Mysql的地址,默认是3306
dbUsername :上面开通的Mysql用户
dbPassword : 密码
canal.mq.topic=example : 数据同步到MQ中的topic名字

进入conf/canal.properties,修改为RocketMQ方式,配置好之后,找到 canal 安装目录下 bin目录下的 startup.bat 双击启动

# 这里使用RocketMQ
canal.serverMode = rocketMQ
........
# RocketMQ的地址
rocketmq.namesrv.addr = 127.0.0.1:9876

3:RocketMQ配置

RocketMQ解压好了之后需要,配置RocketMQ的环境配置RocketMQ_HOME(修改runbroker.cmd)的内存大小,默认也可。提供启动脚本 {创建txt文件,写入之后修改后缀为bat即可双击运行}

start mqnamesrv.cmd

start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true

4:RocketMQ可视化工具配置

解压后,修改配置:src/main/resource/application.properties ,配置端口号,以及Name Server 的地址

server.contextPath=
server.port=8080
#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr  NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
rocketmq.config.namesrvAddr=127.0.0.1:9876
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true

3:测试数据

1:启动canal 与 RocketMQ 和 RocketMQ可视化工具

为我们同步的数据库添加数据。

 浏览器输入你配置的可视化工具的地址{进入Message,搜索配置的Topic}

例如:http://127.0.0.1:8080/

 表示配置成功!

4:Java控制Redis和数据同步

1:准备SpringBoot项目

导入如下依赖:

<!--整合Redis , 底层可以用jedis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- redis客户端 jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
         <!-- rocketmq -->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.0.4</version>
        </dependency>
      <!-- SpringBoot-web包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

2:配置文件

server:
  port: 11008
spring:
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password: 123456
    jedis:
      pool:
        max-wait: 2000ms
        min-idle: 2
        max-idle: 8
  application:
    name: service-system #服务名
rocketmq:
  name-server: 127.0.0.1:9876
  # 是否开启自动配置
  producer:
    enable-msg-trace: true
    group: "service-producer"
    # 消息最大长度 默认 1024 * 4 (4M)
    max-message-size: 4096
    # 发送消息超时时间,默认 3000
    send-message-timeout: 3000
    # 发送消息失败重试次数,默认2
    retry-times-when-send-failed: 2
    retry-times-when-send-async-failed: 2

3:创建新项目启动加载热点数据

@Component
@Slf4j
public class StartConfig implements ApplicationRunner {

    @Autowired
    private StartProperties startProperties;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.info("开始加载redis,字典数字据");
        // 执行你的方法
        startProperties.initialization();
        log.info("加载结束!");
    }
}

4:创建MQ消费者,消费消息

@Slf4j
@Component
@RocketMQMessageListener(topic = "example",
        selectorExpression="*" 
        ,consumerGroup = "canal-syn-consumer"
        ,messageModel = MessageModel.CLUSTERING
)
public class CanalSynListenner implements RocketMQListener<MessageExt> {

    //注入Redis
    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;

    @Override
    public void onMessage(MessageExt messageExt) {
        try {
            String json = new String(messageExt.getBody(), "utf-8");
            CanalSynBlack canalSynDto = JSON.parseObject(json, CanalSynBlack.class);
            log.info("canal同步 {}", canalSynDto);
            if(canalSynDto.getType().equals("INSERT") || canalSynDto.getType().equals("UPDATE")){
                canalSynDto.getData().forEach(blacklist -> {
                    redisTemplate.opsForValue().set("ID:"+blacklist.getId(),blacklist);
                });
            }else if (canalSynDto.getType().equals("DELETE")){
                canalSynDto.getData().forEach(blacklist -> {
                    redisTemplate.delete("ID:"+blacklist.getId());
                });
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

总结

以上就是今天全部内容,本文介绍了Canal的配置与使用。对你有帮助的话,还是请一键三连哦!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Canal解决Mysql和Redis数据同步问题 的相关文章

  • 在Java中将*s打印为三角形?

    我在 Java 课程中的作业是制作 3 个三角形 一份左对齐 一份右对齐 一份居中 我必须为什么类型的三角形制作一个菜单 然后输入需要多少行 三角形必须看起来像这样 到目前为止 我能够完成左对齐的三角形 但我似乎无法获得其他两个 我尝试用谷
  • 如何从 Play WSClient 的字符串创建 WSResponse 对象

    文档 https www playframework com documentation 2 4 x JavaTestingWebServiceClients Mock the web service建议使用模拟Web服务测试基于WSCli
  • android.view.InflateException:二进制 XML 文件行 #11:膨胀类 ImageView 时出错

    我只是尝试制作一个小的 android java xml 应用程序来计算游戏的分数 它给了我这个错误 Error inflateing class ImageView 有人知道解决方案吗 我实际上搜索了 ppl 说添加这个 android
  • 单元测试组合服务方法

    我正在为一个类编写 junit 单元测试 该类使用以下方法实现公开的接口 public Set
  • 如何配置 Spring-WS 以使用 JAXB Marshaller?

    感谢您到目前为止对此的帮助 我正在更新问题 因为我没有显示我需要的所有内容 并显示了建议的更改 肥皂输出仍然不是我想要的 servlet xml
  • Android WebView文件上传

    我正在开发一个 Android 应用程序 基本上它是一个WebView和一个进度条 Facebook 的移动网站 m facebook com 已加载到WebView 当我单击 选择文件 按钮上传图像时 没有任何反应 我已经尝试了所有的解决
  • Kafka Java Consumer 已关闭

    我刚刚开始使用卡夫卡 我面临着消费者的一个小问题 我用Java写了一个消费者 我收到此异常 IllegalStateException 此消费者已关闭 我在以下行中遇到异常 ConsumerRecords
  • java.lang.Object的hashCode具体使用的算法是什么

    中使用的算法是什么JVM实施java lang Object的隐含的hashCode 方法 OpenJDK or Oracle JDK答案中首选 它依赖于实现 并且在很大程度上 该算法是entirely取决于实施 只要它是一致的 但是 根据
  • Java 中的 ExecuteUpdate sql 语句不起作用

    我正在学习如何将 SQL 与 Java 结合使用 我已成功安装 JDBC 驱动程序 并且能够从数据库读取记录并将其打印在屏幕上 我的问题发生在尝试执行更新或插入语句时 没有任何反应 这是我的代码 问题所在的方法 public static
  • 将现有 eclipse 项目导出到 war 文件时出现“模块名称无效”

    我正在尝试将现有 Eclipse 项目导出到 war 文件 但无论我在 WAR Export 对话框页面中输入什么 系统总是返回 模块名称无效 我不知道如何解决这个问题 谢谢您的帮助 我有同样的问题 我修复了它 请按照以下步骤操作 您可以创
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 更改 JComboBox 中滚动条的大小

    有谁知道如何手动更改 jComboBox 中的滚动条大小 我已经尝试了一大堆东西 但没有任何效果 好吧 我明白了 您可以实现 PopUpMenuListener 并使用它 public void popupMenuWillBecomeVis
  • 如何在 Bean Validation 1.0 中构造 ConstraintViolationException?

    我对 javax validation API 感到困惑 我正在编写一个简单的测试来理解它 Sample sample new Sample Set
  • 多线程——更快的方法?

    我有一堂有吸气剂的课程getInt 和一个二传手setInt 在某个领域 比如说领域 Integer Int 一个类的一个对象 比如说SomeClass The setInt 这里是同步的 getInt isn t 我正在更新的值Int来自
  • MongoDB java 驱动程序 3.0 在身份验证时无法捕获异常

    我超级卡住o 0 在尝试通过 Java 驱动程序进行身份验证时 存在捕获异常的问题 正如你可能会看到的Throwable类不工作 private MongoClient mongoClient private MongoDatabase m
  • Java8:流映射同一流中的两个属性

    我有课Model带有以下签名 class Model private String stringA private String stringB public Model String stringA String stringB this
  • Java:一个函数有多种返回类型...可以使用泛型吗?

    为了简单起见 我有一些程序 如下所示 public String fetchValueAsString String key public DateTime fetchValueAsDateTime String key 我想要类似的东西
  • android 中的 java.net.URL ..新手问题

    我是java新手 正在尝试android开发 以下代码生成 malformedURLException 有人可以帮助我识别异常吗 任何提示都会非常有帮助 package com example helloandroid import and
  • CXF:通过 SOAP 发送对象时如何排除某些属性?

    我使用 Apache CXF 2 4 2 当我将数据库中的某个对象返回给用户时 我想排除一些属性 例如密码 我怎样才能做到这一点无需创建临时的班级 有这方面的注释吗 根据 tomasz nurkiewicz 评论我应该使用 XmlTrans
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c

随机推荐

  • asp.net实现验证码程序

    1 可以实现验证码的自动更新 2 验证码html代码 li class mjiao2 span 验 证 码 span li
  • 出现Uncaught ReferenceError: $ is not defined错误

    今天在写ajax请求的时候 出现了Uncaught ReferenceError is not defined报错 未定义是为什么呢 后来才知道 原因一 你未引用jquery库jquery min js文件 或者说路径错误 原因二 忽略了H
  • 脚本语言与编译语言的区别

    文章目录 一 语法差异 二 执行方式差异 三 应用领域差异 四 总结 一 语法差异 脚本语言 脚本语言通常使用解释器逐行执行 不需要事先编译 它的语法相对简单 易于学习和使用 常见的脚本语言有Python JavaScript和Ruby等
  • 机器学习笔记(4)— 多特征变量

    1 多特征变量 本文主要介绍多特征变量的梯度下降法和特征缩放内容 2 多特征 多变量 多特征变量的目标函数为 假设x0 1 则目标函数为 把特征量x看作是一个向量 把特征量的参数也看做一个向量 所以目标函数可以表示为 多特征量的目标函数 又
  • linux 下 npm安装依赖报:stack Error: `gyp` failed with exit code: 1

    解决办法 切换到当前项目下即可 gt rm rf node gyp gt npm install g node gyp gt rm rf 项目 node modules 再次 npm install即可
  • Matlab学习入门篇(五)—— 数据可视化

    文章目录 一 离散数据图 1 1散点图 1 2 条形图 二 线图 2 1 二维线图 2 2 三维参数化曲线绘图函数 三 曲面 体积和多边形 数据可视化是指运用 计算机图形学和 图像处理技术 将数据转化为图形或图像并在屏幕上显示出来 以进行交
  • 合成数据加速高质量数据供给,AIGC的救星来了!

    毫无疑问 人工智能发展离不开海量数据 但真实世界的数据是有限的 且数据获取 数据标注等面临诸多难题 数据成为AI行业的 掣肘 如何打破 半个月来 数据要素频繁获得政策部门发声 中国证监会科技监管局局长姚前日前发文建议重点发展基于AIGC技术
  • MYSQL常见的4种数据类型

    转自 微点阅读 https www weidianyuedu com 一 数据类型是什么 数据类型是指列 存储过程参数 表达式和局部变量的数据特征 它决定了数据的存储格式 代表了不同的信息类型 有一些数据是要存储为数字的 数字当中有些是要存
  • Rust- 迭代器

    In Rust an iterator is a pattern that allows you to perform some task on a sequence of items in turn An iterator is resp
  • springBoot整合kafka配置

    pom xml
  • Java中定义常量(Constant) 的几种方法

    Method One interface ConstantInterface String SUNDAY SUNDAY String MONDAY MONDAY String TUESDAY TUESDAY String WEDNESDAY
  • python 之 使用 for-in 循环遍历范围,元组,列表,字典

    语法格式 for 变量 in 范围 元素 集合等 for循环语法结构列如序列或迭代器作为其参数每次迭代其中一个元素 与while循环一样 支持break continue else语句 一般情况下 循环次数未知采用while循环 循环次数已
  • 硬件安全技术——芯片安全设计技术2

    硬件安全技术 芯片安全设计技术2 芯片安全设计技术2 一 常见的公钥密码算法 1 公钥密码概述 2 RSA密码算法 3 RSA算法描述 4 ECC椭圆曲线算法 二 常见的使用场景 1 非对称算法应用 2 常见应用1 网络认证 3 常见应用2
  • 关于oracle和mysql等服务不能开机自启的解决方法

    oracle服务设置自启动 开始菜单点重启服务是可以正常启动的 但点关机后再通过开关机键启动windows 服务无法正常启动 尝试了更改注册表 查看系统日志 修复ntdll dll文件 更换dll文件修改权限 重装系统等方式后 都无法解决
  • 【C语言初阶】 数组

    博客主页 小王又困了 系列专栏 C语言 人之为学 不日近则日退 感谢大家点赞 收藏 评论 目录 一 认识数组 二 一维数组的创建和初始化 1 数组的创建 2 数组的初始化 字符的初始化 3 数组的引用 4 数组在内存的存储 三 二维数组的创
  • 【Qt】QModbusDevice类

    1 概述 QModbusDevice类是Modbus类 QModbusServer和 QModbusClient的基类 Header include qmake QT serialbus Since Qt 5 8 Inherits QObj
  • 献给童鞋们python教程:Collections模块的Counter容器类使用

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 文章目录 1 collections模块 2 Counter类 2 1 创建 2 2 计数值的访问与缺失的键 2 3 计数器的更新 update和subtract 2 4
  • 爬取植物数据库:使用 Python 获取植物信息

    在这篇博客中 我们将学习如何使用 Python 编写一个网络爬虫 从植物数据库网站中获取植物信息 我们将使用 requests BeautifulSoup 和 pandas 库来实现这个功能 文章将包括以下内容 目录 1 爬虫的基本概念 2
  • elasticsearch基本查询(此处为2.x版本)

    public class JavaESQuery private TransportClient client Before public void testBefore Settings settings Settings setting
  • Canal解决Mysql和Redis数据同步问题

    目录 前言 一 Mysql主从工作原理 主从复制步骤 二 使用方法 1 软件下载 软件需求 所有安装包 我的资源都有 2 修改配置 1 数据库配置修改 2 canal配置修改 3 RocketMQ配置 4 RocketMQ可视化工具配置 3