canal实现同步MySQL的数据到从库


1.技术方案概览

开启MySQL的binlog日志记录
修改MySQL的binlog模式为ROW
canal-server充当MySQL集群的一个slave,获取master的binlog信息
canal-server将拿到的binlog信息推送给canal-adapter
canal-adapter将数据同步到MySQL从库

2.设置MySQL

首先我们要开启MySQL的binlog记录功能,选择模式为ROW
修改my.cnf:vi /etc/my.cnf
添加以下三行内容,如果原来存在,则不需要添加,只需对当前配置项进行修改即可

log-bin=mysql-bin #添加这一行就ok 
binlog-format=ROW #选择row模式 
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复

配置文件修改成功后重启MySQL

3.配置canal用户

canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限.

CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;

4.启动canal-service

下载地址:https://github.com/alibaba/canal/releases
下载canal-server,我这边下载的版本是canal.deployer-1.1.3.tar.gz
canal-server充当MySQL集群的一个slave,获取master的binlog信息

修改canal配置文件instance.properties

canal.instance.gtidon=false
# position info 修改主库地址
canal.instance.master.address=192.168.1.152:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=
# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=
# table meta tsdb info
canal.instance.tsdb.enable=true
# username/password 修改账号密码 数据库
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
canal.instance.defaultDatabaseName =infosys_test
# enable druid Decrypt database password
canal.instance.enableDruid=false

修改canal.properties


canal.id = 10000
canal.ip =
canal.port = 11111
canal.metrics.pull.port = 11112
# 配置zk服务
canal.zkServers = 192.168.1.200:2181
# flush data to zk
canal.zookeeper.flush.period = 1000
canal.withoutNetty = false

修改完成之后启动canal 服务

5.启动adaper

下载地址:https://github.com/alibaba/canal/releases
下载canal-server,我这边下载的版本是canal.adapter-1.1.3.tar.gz

修改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
  # 配置 zk 地址
  zookeeperHosts: 192.168.1.200:2181
  batchSize: 500
  syncBatchSize: 1000
  retries: 0
  timeout:
  accessKey:
  secretKey:
  srcDataSources:
    defaultDS:
    # 配置 主库地址
      url: jdbc:mysql://192.168.1.152:3306/infosys_test?useUnicode=true
      username: canal
      password: canal
  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.1.200:3306/infosys_test?useUnicode=true
          jdbc.username: root
          jdbc.password: root

注意:这边从库一定要记得给授权,否则连不上,就不能将数据写入了

修改rdb/mytest_user.yml

dataSourceKey: defaultDS
destination: example
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
   #配置数据库
   database: infosys_test
   #配置表
   table: admin_user
   targetTable: infosys_test.admin_user
   targetPk:
     id: id
   mapAll: true

进入bin目录启动服务即可;

6.测试

在152数据库中插入一条数据库,检查是否在200中同步,同步成功即配置成功;

7.关于批量同步

目前来说是不支持批量同步的,要实现批量同步的话需要application.yml配置多个name: rdb;
rdb文件夹下要为每个表配置dataSourceKey、destination、outerAdapterKey、dbMapping等对应参数,
这样就可以实现批量同步了;
但是个人感觉这个方案更适用于单个表更新之后同步缓存或索引,例如用户信息更新之后,更新Redis缓存

你可能感兴趣的:(canal实现同步MySQL的数据到从库)