黑帽联盟

 找回密码
 会员注册
查看: 357|回复: 0
打印 上一主题 下一主题

[mysql] Canal实现MySql和redis的数据同步

[复制链接]

852

主题

38

听众

3177

积分

白金VIP

Rank: 8Rank: 8

  • TA的每日心情
    开心
    2024-3-7 12:52
  • 签到天数: 1538 天

    [LV.Master]伴坛终老

    一、canal简介
    canal是阿里开源的数据同步工具,基于bin log可以将数据库同步到其他各类数据库中,目标数据库支持mysql,postgresql,oracle,redis,MQ,ES等。

    1、canal工作原理
    工作原理:把自己伪装成Mysql slave,模拟Mysql slave的交互协议,向Mysql master发送请求,master收到canal发送的请求后,开始推送binary log二进制日志给canal,然后canal解析binary log,再发送到存储目的地(Redis、MQ、ES等)。
    21.png

    2、canal作用
    数据库镜像
    数据库实时备份
    索引构建和实施维护
    业务缓存
    贷业务逻辑的增量数据处理

    二、通过canal实现Mysql和Redis数据同步(Linux环境)
    在Centos7完成了Mysql的主从复制,采用中间件 canal 完成 MySQL 向 Redis & ES 同步数据。
    22.png

    1、下载canal1.1.5

    下载地址: https://github.com/alibaba/canal/releases

    23.png


    2、将下载好的canal上传到创建好的canal文件夹中并解压,解压后如下图所示
    24.png

    3、/etc/my.cnf添加如下配置
    server-id=140     # 给mysql服务创建一个唯一id
    log-bin=mysql-bin # 开启 binlog
    binlog-format=ROW # 选择 ROW 模式

    注意:如果Mysql已经主从复制过了,以上配置中的log-bin=master-bin(这个不影响)

    重启mysql服务

    service mysql restart

    4、/soft/canal/conf/example/instance.properties修改配置
    canal.instance.master.address=10.70.20.140:3306        #mysql ip+端口
    canal.instance.dbUsername=root                         #mysql 账号
    canal.instance.dbPassword=123456                       #mysql 密码
    canal.instance.filter.regex=canaldb.canaltable         #需要同步的库、表

    5、bin目录下startup.sh启动canal
    25.png

    # bin目录下启动canal
    startup.sh

    显示如下启动成功!
    26.png

    6、创建Springboot测试数据是否同步6.1、依赖
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <!--Canal->
            <dependency>
                <groupId>top.javatool</groupId>
                <artifactId>canal-spring-boot-starter</artifactId>
                <version>1.2.1-RELEASE</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.50</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!--德鲁伊-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.1.17</version>
            </dependency>
            <!--导入jdbc场景-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            <!--数据库连接-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.29</version>
            </dependency>
        </dependencies>

    6.2、application.yaml
    canal:
      server: 10.70.20.140:11111
      destination: example
    spring:
      redis:
        host: 10.70.20.140
        password: 123456
        port: 6379

      datasource:
        druid:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://10.70.20.140:3306/canaldb
          username: root
          password: fe781212

    6.3、创建表和实体类(注意数据库表和实体类字段一致)
    27.png

    6.4、配置类RedisConfig
    @Configuration
    public class RedisConfig {

        @Resource
        private RedisConnectionFactory factory;


        //使用JSON进行序列化
        @Bean
        public RedisTemplate<Object, Object> redisTemplate() {
            RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

            redisTemplate.setConnectionFactory(factory);
            //JSON格式序列化
            GenericFastJsonRedisSerializer serializer = new GenericFastJsonRedisSerializer();
            //key的序列化
            redisTemplate.setKeySerializer(serializer);
            //value的序列化
            redisTemplate.setValueSerializer(serializer);
            //hash结构key的虚拟化
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            //hash结构value的虚拟化
            redisTemplate.setHashValueSerializer(serializer);
            return redisTemplate;
        }

    }

    6.5、handler
    @CanalTable("canaltable")
    @Component
    @Slf4j
    public class UserHandler implements EntryHandler<User> {
            @Autowired
            private RedisTemplate<Object,Object> redisTemplate;

        @Override
        public void insert(User user) {
            redisTemplate.opsForValue().set("USER:"+user.getId(),user);
        }


        @Override
        public void update(User before, User after) {
            redisTemplate.opsForValue().set("USER:"+before.getId(),after);
        }

        @Override
        public void delete(User user) {
            redisTemplate.delete("USER:"+user.getId());
        }
    }

    7、启动项目测试数据是否同步
    28.png

    8、表新增数据,查看redis数据
    29.png

    30.png

    数据同步成功!



    本文转载自:https://blog.csdn.net/qq_57821542/article/details/129217882


    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部