• canal实现mysql数据同步


    前言

    canal是实现mysql数据备份,异地灾备,异地数据同步等重要的中间件,在实际的业务场景中有着广泛的使用,本文基于小编所在项目中一个异地数据同步的场景为例,通过案例演示下利用canal实现mysql数据同步的过程

    在这里插入图片描述

    同步原理

    在这里插入图片描述

    如上图所示,为canal同步mysql数据的原理的简单示意图,归纳如下:

    1. canal 模拟mysql slave 的交互协议,伪装自己为mysql slave,向mysql master 发送dump 协议。
    2. mysql master 收到dump请求,开始推送binary log给canal (slave)
    3. canal解析binary log对象(原始为byte流)

    如果亲手配置过mysql读写分离架构的同学,对canal做数据复制的原理很好理解了,简单来说,就是伪装成master的从节点,监听并解析binlog日志的元数据到目标数据库的数据表

    环境准备

    • 一个开启了binlog日志的mysql服务,IP地址为: IP1
    • 另一个安装并启动了mysql服务器的机器,IP地址为 : IP2
    • canal安装包,包括:canal.adapter-1.1.4.tar.gz , canal.deployer-1.1.4.tar.gz

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

    在这里插入图片描述

    实现步骤

    实现本文需求的话,主要是基于下载的两个安装包的配置,其实对canal有所了解的同学对其实现原理并不陌生,就是两个springboot的服务,对于开发者来说,只需要按照官方wiki提供的同步实现,做各种配置即可

    在上一篇springboot整合canal一篇中,我们初步演示了canal的server端配置过程,即 deployer 的配置,本篇,需要对 deployer 和 adapter同时做配置

    deployer 配置

    1、解压canal.deployer-1.1.4.tar.gz 到指定目录

    tar -zxvf canal.deployer-1.1.4.tar.gz -C 目标文件目录
    
    • 1

    在这里插入图片描述

    2、进入conf目录,修改canal.properties

    在这里插入图片描述
    如果是msyql同步到mysql,该配置文件无需做修改,保持默认即可,需要注意的地方如下:

    在这里插入图片描述

    3、进入example目录,修改instance.properties

    在这里插入图片描述

    主要需要修改的地方如下:

    canal.instance.master.address=IP:3306    #mysql源地址
    
    • 1

    在这里插入图片描述
    mysql源地址授权canal获取数据的账户名和密码

    canal.instance.dbUsername=root
    canal.instance.dbPassword=123456
    
    • 1
    • 2

    在这里插入图片描述

    4、启动deployer服务

    进入到bin目录,直接使用下面的脚本启动,启动后检查下进程
    在这里插入图片描述
    在这里插入图片描述

    adapter 配置

    1、解压 canal.adapter-1.1.4.tar.gz 到指定目录

    tar -zxvf canal.adapter-1.1.4.tar.gz 指定目录
    
    • 1

    在这里插入图片描述
    在这里插入图片描述

    2、进入conf 目录,首先修改application.yml 文件

    主要需要修改的地方如下,

    server:
      port: 8081
    spring:
      jackson:
        date-format: yyyy-MM-dd HH:mm:ss
        time-zone: GMT+8
        default-property-inclusion: non_null
    
    canal.conf:
      mode: tcp # kafka rocketMQ
      canalServerHost: Canal的deployer服务所在IP地址:11111
    #  zookeeperHosts: slave1:2181
    #  mqServers: 127.0.0.1:9092 #or rocketmq
    #  flatMessage: true
      batchSize: 500
      syncBatchSize: 1000
      retries: 0
      timeout:
      accessKey:
      secretKey:
       srcDataSources:
         defaultDS:
           url: jdbc:mysql://mysql源数据库IP:3306/shop001?useUnicode=true
           username: root
           password: root
      canalAdapters:
      - instance: example # canal instance Name or mq topic name
        groups:
        - groupId: g1
          outerAdapters:
          - name: logger
          - name: rdb
            key: mysql1
            properties:
              jdbc.driverClassName: com.mysql.jdbc.Driver
              jdbc.url: jdbc:mysql://目标同步IP:3306/shop001?useUnicode=true
              jdbc.username: root
              jdbc.password: root
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    3、进入rdb 目录,首先修改mytest_user.yml 文件

    在这里插入图片描述

    下面贴出核心修改的文件内容,需要注意的地方包括:

    1. groupId: g1 ,这个和上面第二步中的该配置保持一致

    2. outerAdapterKey: mysql1 ,这个和第二步中的该配置保持一致

    3. mapAll: true,如果源表和目标表的字段结构等完全一致,直接开启此配置即可,下面的targetColumns可以注释掉

      dataSourceKey: defaultDS
      destination: example
      groupId: g1
      outerAdapterKey: mysql1
      concurrent: true
      dbMapping:
      database: shop001 #mysql源数据库名称
      table: user_info #mysql源数据库下的表名称
      targetTable: shop001.tar_user #同步到目标数据库-数据表名称
      targetPk:
      id: id
      mapAll: true #如果源表和目标表的字段结构等完全一致,直接开启此配置即可,下面的targetColumns可以注释掉
      #targetColumns:

      id:

      name:

      role_id:

      c_time:

      test1:

      #etlCondition: “where c_time>={}”
      #commitBatch: 3000 # 批量提交的大小

    4、启动 adapter 服务

    进入bin目录下,使用下面的启动脚本进行启动,然后检查服务进程
    在这里插入图片描述

    在这里插入图片描述

    在测试之前,我们分别在IP1和IP2上面安装的mysql数据库下创建了 user_info 表和 tar_user表,现在的需求是,数据要从 IP1:user_info => IP2: tar_user 表同步,

    在这里插入图片描述

    当前的状态为,两个库下的两个表均为空,执行下面的数据插入 sql ,给 user_info表插入一条数据

    INSERT INTO `shop001`.`user_info` (`id`, `name`, `sex`) VALUES ('1', 'xiaoma', 'male');
    
    • 1

    在这里插入图片描述

    可以看到,数据几乎是准实时的插入到tar_user表中,当然,当你执行删除、修改等操作时候,同样会同步过去

    基于上面的操作,我们完成了一个使用canal实现mysql数据同步的过程,官方提供了诸多的同步方案,比如可以将数据从mysql同步到mysql,es,redis等等,有兴趣的同学可以继续深入研究!

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    高并发场景下更新数据库报错,记录一次 MySQL 死锁问题的解决
    每日一题|2022-10-28|907. 子数组的最小值之和|今天不想学,后面补上
    Docker镜像的制作(容器转镜像和DockerFile)
    python 进程、线程、协程
    C++官网 Information History of C++
    RustDay06------Exercise[91-100]
    深入了解PHP中的经典一句话木马和变量传递漏洞
    git常用命令
    安卓讲课笔记5.6 列表视图
    【Linux】:Centos7安装Kafka
  • 原文地址:https://blog.csdn.net/m0_67391401/article/details/126082226