• 基于Canal实现MySQL 8.0 数据库数据同步


    基于Canal实现MySQL 8.0 数据库数据同步

    0、前置信息

    0.1、服务器信息

    主机名
    操作系统
    说明
    192.168.91.131
    CentOS 7
    主库所在服务器
    192.168.91.135
    CentOS 7
    canal数据同步所在服务器

    0.2、版本说明

    MySQL版本:MySQL_8.0.23
    Canal版本:Canal_1.1.5

    0.3、安装 MySQL8.0 数据库

    关于MySQL8.0数据库的安装,可参考之前的博文:https://www.cnblogs.com/cndarren/p/16161256.html

    0.4、配置MySQL8.0数据库

    修改mysql配置文件

    vi /etc/my.cnf

    添加如下配置,开启MySQL binlog功能

    # 服务编号, 与其它节点不冲突即可
    server_id=1
    log_bin=binlog
    binlog_format=ROW

    0.5、Canal简介

    关于canal简介,这里就不再阐述,具体可以参看官方文档介绍,地址如下:

    https://github.com/alibaba/canal/wiki/%E7%AE%80%E4%BB%8B

    1、主库服务器操作

    1.1、连接主库所在服务器

    # 连接主库所在服务器,即:192.168.91.131, 切换 root 账号
    su root

    1.2、启动MySQL8.0数据库

    systemctl start mysqld.service

    1.3、创建复制账号和密码

    连接主库所在服务器,即:192.168.91.131,运行MySQL 8.0数据库,创建复制账号和密码,命令如下:

    mysql> CREATE USER canal IDENTIFIED BY 'canal';  
    mysql> GRANT SELECT, SHOW VIEW, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
    mysql> FLUSH PRIVILEGES;

    2、canal数据同步服务器操作

    2.1、创建canal文件夹

    cd /usr/local
    mkdir canal
    cd canal
    mkdir canal-package canal-adapter canal-deployer

    2.2、安装canal deployer和canal adapter

    cd canal-package
    wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
    wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.adapter-1.1.5.tar.gz
    ls
    tar -zxvf canal.adapter-1.1.5.tar.gz -C /usr/local/canal/canal-adapter
    tar -zxvf canal.deployer-1.1.5.tar.gz -C /usr/local/canal/canal-deployer

    2.3、配置和启动canal-deployer

    2.3.1、配置canal-deployer

    由于此次同步为MySQL数据库间的数据同步,所以此处不需要修改 canal.properties 配置文件,只需修改 instance.properties 即可

    cd /usr/local/canal/canal-deployer/conf/example
    vi instance.properties

    修改内容如下图所示:

     

    说明:instance.properties中同步数据表默认为同步数据库下所有的表信息,具体配置如下:

     

    若需要同步某几张表,可以参考如下配置:

    # 同步某数据库test1下的user表,test2数据库下的所有表,所有库下所有表数据
    canal.instance.filter.regex=test1.user,test2\\..*,.*\\..*

    2.3.2、启动canal-deployer

    cd /usr/local/canal/canal-deployer/bin
    ./startup.sh

    查看日志确定是否启动成功

    cd /usr/local/canal/canal-deployer/logs/example
    cat example.log

    可能遇到的问题:

    canal-deployer启动之后,如果在 logs 文件夹下没有 example 文件,参考如下情况说明:

    1、查看 /usr/local/canal/canal-deployer/bin 文件夹下,是否存在以hs_err_pid开头的文件。

    # 出现hs_err_pid开头的文件,主要原因有两个:
    1> 服务器内存不足,导致服务启动失败,出现OOM问题,这时需要增加服务器内存
    2> 服务器打开的线程数达到上限,这时需要修改线程上限,操作如下:
    vi /etc/security/limits.conf
    
    修改内容可参考下面配置:
    *          soft    nproc          102400
    *          hard    nofile         102400
    # 上述配置参数说明:
    第一列:linux系统用户名,*代表所有用户
    第二列:软连接/硬连接
    第三列:类型,nproc 进程的数量/nofile 文件打开数/core-core 文件大小
    第四列:数量

    2、bin文件夹下不存在以hs_err_pid开头的文件,查看logs文件夹下的canal文件夹下的canal_stdout.log文件,命令如下:

    cat /usr/local/canal/canal-deployer/logs/canal/canal_stdout.log

    若出现如下报错信息:

    OpenJDK 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0
    OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
    OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
    Unrecognized VM option 'UseCMSCompactAtFullCollection'
    Error: Could not create the Java Virtual Machine.
    Error: A fatal exception has occurred. Program will exit.

    解决方案:

    出现此报错的原因是由于当前服务器安装的jdk版本高于jdk8,此时需要修改 startup.sh 的启动参数,操作如下:

    cd /usr/local/canal/canal-deployer/bin
    ./stop.sh
    vi startup.sh
    # 找到下图所展示位置,删除 -XX:+UseCMSCompactAtFullCollection -XX:+UseFastAccessorMethods 参数
    ./startup.sh

    2.4、配置和启动canal-adapter

    2.4.1、配置canal-adapter

    1> 修改application.yml文件

    cd /usr/local/canal/canal-adapter/conf
    vi 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
      flatMessage: true
      zookeeperHosts:
      syncBatchSize: 1000
      retries: 0
      timeout:
      accessKey:
      secretKey:
      consumerProperties:
        # canal tcp consumer
        # 修改位置:Canal客户端所在主机IP
        canal.tcp.server.host: 192.168.91.135:11111
        canal.tcp.zookeeper.hosts:
        canal.tcp.batch.size: 500
        canal.tcp.username:
        canal.tcp.password:
        # kafka consumer
        kafka.bootstrap.servers: 127.0.0.1:9092
        kafka.enable.auto.commit: false
        kafka.auto.commit.interval.ms: 1000
        kafka.auto.offset.reset: latest
        kafka.request.timeout.ms: 40000
        kafka.session.timeout.ms: 30000
        kafka.isolation.level: read_committed
        kafka.max.poll.records: 1000
        # rocketMQ consumer
        rocketmq.namespace:
        rocketmq.namesrv.addr: 127.0.0.1:9876
        rocketmq.batch.size: 1000
        rocketmq.enable.message.trace: false
        rocketmq.customized.trace.topic:
        rocketmq.access.channel:
        rocketmq.subscribe.filter:
        # rabbitMQ consumer
        rabbitmq.host:
        rabbitmq.virtual.host:
        rabbitmq.username:
        rabbitmq.password:
        rabbitmq.resource.ownerId:
      # 修改位置:添加源库配置信息,此处为同步同库下所有表信息
      srcDataSources:
        defaultDS:
          url: jdbc:mysql://192.168.91.131:3306/test?useUnicode=true
          username: root
          password: 123456
        amsDS:
          url: jdbc:mysql://192.168.91.131:3306/nxgp_ams?useUnicode=true
          username: root
          password: 123456
      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://192.168.91.135:3306/test?useUnicode=true
              jdbc.username: root
              jdbc.password: 123456
          - name: rdb
            key: mysql2
            properties:
              jdbc.driverClassName: com.mysql.jdbc.Driver
              jdbc.url: jdbc:mysql://192.168.91.135:3306/nxgp_ams?useUnicode=true
              jdbc.username: root
              jdbc.password: 123456
    #      - name: rdb
    #        key: oracle1
    #        properties:
    #          jdbc.driverClassName: oracle.jdbc.OracleDriver
    #          jdbc.url: jdbc:oracle:thin:@localhost:49161:XE
    #          jdbc.username: mytest
    #          jdbc.password: m121212
    #      - name: rdb
    #        key: postgres1
    #        properties:
    #          jdbc.driverClassName: org.postgresql.Driver
    #          jdbc.url: jdbc:postgresql://localhost:5432/postgres
    #          jdbc.username: postgres
    #          jdbc.password: 121212
    #          threads: 1
    #          commitSize: 3000
    #      - name: hbase
    #        properties:
    #          hbase.zookeeper.quorum: 127.0.0.1
    #          hbase.zookeeper.property.clientPort: 2181
    #          zookeeper.znode.parent: /hbase
    #      - name: es
    #        hosts: 127.0.0.1:9300 # 127.0.0.1:9200 for rest mode
    #        properties:
    #          mode: transport # or rest
    #          # security.auth: test:123456 #  only used for rest mode
    #          cluster.name: elasticsearch
    #        - name: kudu
    #          key: kudu
    #          properties:
    #            kudu.master.address: 127.0.0.1 # ',' split multi address

    说明: 

    i、其中 outAdapter 的配置: name统一为rdb, key为对应的数据源的唯一标识需和下面的表映射文件中的outerAdapterKey对应, properties为目标库jdbc的相关参数

    ii、adapter将会自动加载 conf/rdb 下的所有.yml结尾的表映射配置文件

    2> 修改canal-adapter/conf/rdb文件夹下的yml文件

    说明:canal-adapter/conf/rdb文件夹下的yml文件可以同步数据库下的一张表,也可以同步数据库下的所有表(此处的前提是:同步数据的数据库与主库的schema一致)

    (1)同步数据库下的某张表,例如同步test数据库下的user表,操作如下:

    cd /usr/local/canal/canal-adapter/conf/rdb
    cp mytest_user.yml test_user.yml
    rm -rf mytest_user.yml
    vi test_user.yml

    配置信息如下:

    dataSourceKey: defaultDS        # 源数据源的key, 对应上面配置的srcDataSources中的值
    destination: example            # cannal的instance或者MQ的topic
    groupId:                        # 对应MQ模式下的groupId, 只会同步对应groupId的数据
    outerAdapterKey: mysql1         # adapter key, 对应上面配置outAdapters中的key
    concurrent: true                # 是否按主键hash并行同步, 并行同步的表必须保证主键不会更改及主键不能为其他同步表的外键!
    dbMapping:
      database: test                # 源数据源的database/schema
      table: user                   # 源数据源表名
      targetTable: test.user        # 目标数据源的库名.表名
      targetPk:                     # 主键映射
        id: id                      # 如果是复合主键可以换行映射多个
      mapAll: true                  # 是否整表映射, 要求源表和目标表字段名一模一样 (如果targetColumns也配置了映射, 则以targetColumns配置为准)
      #targetColumns:               # 字段映射, 格式: 目标表字段: 源表字段, 如果字段名一样源表字段名可不填
      #  id:
      #  name:
      #  role_id:
      #  c_time:
      #  test1: 

    (2)同步数据库下所有表数据,例如:同步test数据库下所有表数据,操作如下:

    cd /usr/local/canal/canal-adapter/conf/rdb
    cp mytest_user.yml test_user.yml
    rm -rf mytest_user.yml
    vi test_user.yml

    配置如下:

    ## Mirror schema synchronize config
    dataSourceKey: defaultDS
    destination: example
    groupId: g1
    outerAdapterKey: mysql1
    concurrent: true
    dbMapping:
      mirrorDb: true
      database: test

    2.4.2、启动canal-adapter

    cd /usr/local/canal/canal-adapter/bin
    ./startup.sh

    查看日志信息,确保正常启动。

    cd /usr/local/canal/canal-adapter/logs/adapter
    cat adapter.log

    3、连接数据库管理工具测试

    在主库(192.168.91.131)test数据库下的user表中插入数据,查看canal所在数据库test下的user表中是否同步。

  • 相关阅读:
    android指纹
    2020-10-25:go中channel的close流程是什么?
    2020-10-24:go中channel的recv流程是什么?
    2020-10-23:go中channel的创建流程是什么?
    2020-10-22:谈谈java中的LongAdder和LongAccumulator的相同点和不同点。
    2020-10-21:go中channel的send流程是什么?
    2020-10-20:线程池如何保证核心线程不被销毁?
    2020-10-19:golang里defer为什么要逆序执行?顺序执行不是更符合人的习惯吗?
    2020-10-18:java中LongAdder和AtomicLong有什么区别?
    2020-10-17:谈一谈DDD面向领域编程。
  • 原文地址:https://www.cnblogs.com/cndarren/p/16318728.html
Copyright © 2020-2023  润新知