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

目录

前言

一、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的配置与使用。对你有帮助的话,还是请一键三连哦!

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Canal是一个开源的数据库增量订阅&消费组件,可以实现MySQLRedis同步。它可以通过解析MySQL的binlog日志,将数据变更事件转换成Java对象,然后通过消息队列的方式异步地传递给消费端,消费端可以根据自己的需求进行处理,比如将数据同步Redis中。Canal支持多种消息队列,包括Kafka、RocketMQ、RabbitMQ等,也可以自定义消息处理器。 ### 回答2: Canal是阿里巴巴开源的一个基于数据库增量日志解析的数据同步工具,通过解析MySQL的binlog日志实现MySQLRedis数据同步Canal的工作原理如下: 首先,Canal会建立一个轻量级的MySQL实例来监听MySQL的binlog日志,然后解析这些日志文件生成一个逻辑日志,将这些逻辑日志发送给指定的消费端,例如Redis等。 其次,Canal将这些日志文件解析成数据格式,然后将这些格式化的数据推送到指定的消费端。在Redis端,我们可以通过Canal提供的接口来订阅这些数据并将其存储到Redis中。 最后,Canal还支持针对不同表的数据同步,可以通过配置不同的过滤规则来实现不同表的数据同步Canal的优点在于: 1. 数据同步实时性高:由于Canal是基于数据增量日志解析的,所以同步数据的实时性非常高,可以达到毫秒级别的数据同步。 2. 可扩展性强:Canal支持横向扩展和纵向扩展,可以随时根据系统负载情况进行扩展。 3. 可配置性强:Canal支持灵活的配置规则,可以根据不同的业务需求进行配置,满足不同的数据同步需求。 总体来说,Canal是一个非常实用的数据同步工具,可以帮助我们解决MySQLRedis之间的数据同步问题,同时还支持多种数据源的同步,具有很高的可扩展性和可配置性,是一个非常好用的开源工具。 ### 回答3: Canal是阿里巴巴中间件团队开发的一款基于数据库增量日志解析同步工具,支持MySQL、Oracle、SqlServer等多种关系型数据库。Canal通过订阅MySQL的binlog实现对MySQL数据的实时同步,同时配合redis实现数据的高速缓存,提高数据访问速度和可靠性。 首先,在Canal的配置文件中,需要设置对MySQL binlog的订阅,包括MySQL的地址、用户名、密码和需要订阅的数据库和表。Canal会根据这些订阅信息,实时监听MySQL数据库的变化,并将变化的数据转化为JSON格式的数据。 其次,配置Canalredis的连接信息,包括redis的地址和端口号等信息。Canal通过redis的发布和订阅机制,将解析出的JSON格式的数据发布到redis缓存中。 最后,应用程序可根据自己的需求从redis缓存中获取数据,从而实现MySQLredis同步。相比于直接访问MySQL数据库,Canalredis的方式可以大大提高数据的访问速度和可靠性,尤其是对于一些关键业务数据的访问,更加有利于保障数据的安全性和完整性。 总之,Canalredis的组合非常适合需要实时同步MySQL数据并提高访问速度和可靠性的应用场景,具有很好的性能和稳定性,并且易于配置和集成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有头发的Java程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值