linux环境canal实现mysql两库的数据同步(二)canal-adapter的部署与启动

1,428 阅读5分钟

canal-deployer部署导航

linux环境canal实现mysql两库的数据同步(一)canal-deployer的部署与启动

canal-admin部署导航

linux环境canal实现mysql两库的数据同步(三)canal-admin的部署与启动

1 canal-adapter介绍

书接上回,我们来部署客户端工具canal-adapter。canal-adapter是canal官方的客户端工具,这里摘一段官网介绍。

基本说明

canal 1.1.1版本之后, 增加客户端数据落地的适配及启动功能, 目前支持功能:

  • 客户端启动器
  • 同步管理REST接口
  • 日志适配器, 作为DEMO
  • 关系型数据库的数据同步(表对表同步), ETL功能
  • HBase的数据同步(表对表同步), ETL功能
  • (后续支持) ElasticSearch多表数据同步,ETL功能

环境版本

  • 操作系统:无要求
  • java版本: jdk1.8 以上
  • canal 版本: 请下载最新的安装包,本文以当前v1.1.1 的canal.deployer-1.1.1.tar.gz为例
  • MySQL版本 :5.7.18
  • HBase版本: Apache HBase 1.1.2, 若和服务端版本不一致可自行替换客户端HBase依赖

2 下载与解压

其下载地址如下: github.com/alibaba/can…

上传至服务器并解压

/usr/local/sdyy/pm/canal-adapte/canal.adapter-1.1.6.tar.gz

tar zxvf canal.adapter-1.1.6.tar.gz

二.1解压完成后.png

3 总配置文件 application.yml

修改如下配置文件 /usr/local/sdyy/pm/canal-adapte/conf/application.yml

server:
  port: 8012
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: non_null

canal.conf:
  mode: tcp #tcp kafka rocketMQ rabbitMQ
  flatMessage: true
  zookeeperHosts:
  syncBatchSize: 1000
  retries: -1
  timeout:
  accessKey:
  secretKey:
  consumerProperties:
    # 对应单机模式下的# canal-deployer的ip:port
    canal.tcp.server.host: XXX.XXX.XXX.XXX:11111
    # 对应集群模式下的zk地址, 如果配置了canalServerHost, 则以canalServerHost为准
    canal.tcp.zookeeper.hosts:
    canal.tcp.batch.size: 500
    canal.tcp.username:
    canal.tcp.password:
  # 配置源数据库
  srcDataSources:
    # 自定义数据源名称
    defaultDS:
      url: jdbc:mysql://XXX.XXX.XXX.XX:3306/pm_dev2.0?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
      username: root
      password: 123456
      
  
  # 适配器列表
  canalAdapters:
  # canal 实例名或者 MQ topic 名
  - instance: example
    # 分组列表
    groups:
    # 分组id, 如果是MQ模式将用到该值
    - groupId: g1
      # 分组内适配器列表
      outerAdapters:
      # 日志打印适配器
      - name: logger
      # mysql同步数据库适配器
      # 指定为rdb类型同步
      - name: rdb
        # 指定adapter的唯一key, 与表映射配置中outerAdapterKey对应
        key: mysql1
        properties:
          # jdbc驱动名, 部分jdbc的jar包需要自行放致lib目录下
          jdbc.driverClassName: com.mysql.jdbc.Driver
          # jdbc url用户名密码等配置
          jdbc.url: jdbc:mysql://XXX.XXX.XXX.XXX:3307/pm_validation?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          jdbc.username: root
          jdbc.password: 123456
          # druid连接池相关配置
          druid.stat.enable: false
          druid.stat.slowSqlMillis: 1000

这里需要确认连接数据库所需要的jar包lib目录下有没有。

笔者版本下lib目录下只有mysql-connector-java-5.1.48.jar

所以笔者将mysql-connector-java-8.0.23.jar放到了lib下。

image.png

4 表映射配置文件 xxxx.yml

表映射文件在conf/rdb目录下,对笔者来说绝对路径为

/usr/local/sdyy/pm/canal-adapte/conf/rdb/xxxx.yml

adapter将会自动加载 conf/rdb 下的所有.yml结尾的表映射配置文件。 所以我们需要把原来的mytest_user.yml文件删掉,然后替换为我们对应的yml文件。

需要同步几个表就放几个yml文件,文件名称随意,只要后缀为.yml即可。推荐使用表名作为文件名。

image.png

这里放笔者需要的表其中一个配置文件。

# 源数据源的key, 对应上面配置的srcDataSources中的值
dataSourceKey: defaultDS
# cannal的instance或者MQ的topic
destination: example
# 对应MQ模式下的groupId, 只会同步对应groupId的数据
groupId: g1
# adapter key, 对应上面配置outAdapters中的key
outerAdapterKey: mysql1
# 是否按主键hash并行同步, 并行同步的表必须保证主键不会更改及主键不能为其他同步表的外键!!
concurrent: true
dbMapping:
  database: pm_dev2.0
  table: pm_project_info
  # 注意!!!!!!!!!!!!!!!!!!!!!!!!
  # 这里官网给的说明是放目标数据源的库名.表名,但实际操作下来发现同步数据的时候报错
  # 只放表名同步就正常了
  targetTable: pm_project_info
  targetPk:
    id: id
  mapAll: true
  # 批量提交的大小
  commitBatch: 3000 

这里贴一段官网对配置文件的说明。

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

5 使用Mysql配置canal-adapter(可选)

本步骤主要是为了将总配置文件application.yml和表映射配置文件xxxx.yml通过数据库进行配置。使用的数据库为图形管理界面canal-admin所在的数据库,但是,canal-admin并不能通过图形化界面管理adapter的配置文件。只能通过数据库直接操作表。如果您不需要从mysql的配置直接使用配置文件,可以将bootstrap.yml内容注释掉,然后跳过这一步。

如果您未部署canal-admin,需要先下载数据库sql脚本,建立数据库然后执行脚本。 下载地址如下: github.com/alibaba/can…

注意:脚本里存在建库语句,如果您已经建好了数据库,请把脚本前三行删掉再执行!

image.png

  1. 在表canal_config中插入记录,其中:
  • id为2。
  • 设置字段name值为application.yml
  • content值为application.yml文件中的内容(直接拷贝粘贴)
  • content_md5值为内容md5标识(暂时没啥用,可以随便写一个)
  • 默认3秒刷新一次

image.png

  1. 在表canal_adapter_config中插入记录,其中:
  • 设置字段category为了adapter数据源类型,如es7、rdb、hbase等,对应conf下的目录
  • 设置name为adapter文件名,如pm_requirement_info.yml(必须.yml结尾),对应conf/{db type}下的目录。
  • content内容为adapter数据源配置文件里的内容,pm_requirement_info.yml的内容

image.png

修改/usr/local/sdyy/pm/canal-adapte/conf/bootstrap.yml如下:

canal:
  manager:
    jdbc:
      url: jdbc:mysql://XXX.XXX.XXX.XXX:3307/pm_canal_manager?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
      username: root
      password: 123456

删除掉原来 conf/application.yml 和 conf/rdb/下所有文件。

6 启动

cd /usr/local/sdyy/pm/canal-adapte
bin/startup.sh

二.3启动适配器.png

7 查看日志

tail -500 logs/adapter/adapter.log

二.查看日志.png

插入几条记录,发现同步成功,再次查看日志。

同步成功.png

其实至此,数据同步已经完成。