Skip to content

部署canal.adapter(rdb)

He Wang edited this page Dec 16, 2021 · 5 revisions

参考 https://github.com/alibaba/canal/wiki/Sync-RDB

简介

Canal Adapter提供了对多种目标容器的支持,对于OceanBase社区版来说,主要应用其rdb模块,目的端容器为MySQL或社区版OceanBase。

由于社区版OceanBase完全兼容MySQL协议,因此在使用时,将其视为MySQL配置即可。

部署

conf/application.yml

launcher本身的spring服务配置

# spring服务相关配置
server:
  port: 8081
spring:
  jackson:
    date-format: 'yyyy-MM-dd HH:mm:ss'
    time-zone: GMT+8
    default-property-inclusion: non_null

adapter instance相关的配置

canalAdapters:
    - instance: example   # canal instance名
      groups:
        - groupId: g1     # 适配器分组id
          outerAdapters:  # 分组内适配器列表
            - name: rdb   # 指定适配器为rdb类型
              key: mysql1 # 适配器标识key,与表映射配置中outerAdapterKey对应
              properties:
                jdbc.driverClassName: com.mysql.jdbc.Driver
                jdbc.url: jdbc:mysql://127.0.0.1:3306/mytest2?useUnicode=true
                jdbc.username: root
                jdbc.password: 121212

之后是connecter相关配置,与Canal Server的canal.serverMode对应

使用tcp connector

canal.conf:
  # 指定为tcp模式
  mode: tcp
  # 连接canal server的配置
  consumerProperties:
    canal.tcp.server.host: 127.0.0.1:11111
    canal.tcp.zookeeper.hosts:
    canal.tcp.batch.size: 500
    canal.tcp.username:
    canal.tcp.password:

使用mq connector,以kafka为例

canal.conf:
  # 指定从kafka消费CanalEntry
  mode: kafka
  flatMessage: true
  consumerProperties:
    # 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

若要进行集群部署,则需要加入zookeeper

  zookeeperHosts:127.0.0.1:2181

conf/rdb

adapter服务在启动时,会加载对应类型adapter配置目录(此处即conf/rdb/)下的所有配置文件。

表映射有两种配置形式:按表映射同步和整库同步。

按表映射同步

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

注意:targetTable 官方仓库文档中描述的格式为“库名.表名”,实际测试中发现,程序会将数据库连接串中的库名作为实际使用的库名,因此若连接串中包含库名,此处需要只填表名。

按整库镜像同步

dataSourceKey: defaultDS
destination: example
outerAdapterKey: mysql1
concurrent: true
dbMapping:
  mirrorDb: true
  database: test

其中dbMapping.database的值代表源库和目标库的schema名称,即两库的schema要一模一样。

注意

当使用OceanBase作为数据源时,LogMessage中的原始schema字段是包含租户名前缀的,而SQL语句中是不包含租户名的。由于Canal对DDL的同步实质上是直接同步SQL语句,Canal Server默认会在将日志转为CanalEntry时,去掉schema中的租户前缀,以保持DDL和DML中的schema一致。

canal.instance.oceanbase.tenant=sys
canal.instance.parser.excludeTenantInDbName=true

该操作是可选的,当Canal Server关闭该改写逻辑时,上表中的database值也应当包含租户名,且这种情况下DDL可能会执行失败,需要特别留意。