-
Notifications
You must be signed in to change notification settings - Fork 8
部署canal.adapter(rdb)
参考 https://github.com/alibaba/canal/wiki/Sync-RDB
Canal Adapter提供了对多种目标容器的支持,对于OceanBase社区版来说,主要应用其rdb模块,目的端容器为MySQL或社区版OceanBase。
由于社区版OceanBase完全兼容MySQL协议,因此在使用时,将其视为MySQL配置即可。
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对应
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
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可能会执行失败,需要特别留意。