一.版本介绍:
canal.admin 1.1.4
canal.deployer 1.1.4
canal.adapter 1.1.4
二.背景:
最近项目在采用Canal-adapter来实时增量同步多个mysql数据源的数据到指定数据库,本次同步的数据源有17个。最开始是打算部署3个Canal-adapter实例,将17个数据源大致均分到每个实例下同步数据,结果在官网并没有找到相关的多个数据源配置教程,由于项目紧张,所以采用了17个实例来单独抽取每个源的数据。事后,通过看Canal-adapter源码,才了解多数据源多Canal实例如何配置,所以写这边文章记录一下。
三.多源配置:
1.部署Canal
不做详细介绍,可以参考官网部署。地址:https://github.com/alibaba/canal
2.部署Canal-adapter
修改解压后的Canal-adapter的配置文件。该文件在${your_canal-adapter}/conf 下,修改application.yml配置文件:
server:
port: 8081 #canal-adapter启动端口号
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
canalServerHost: 127.0.0.1:11111 #canal地址
batchSize: 500
syncBatchSize: 1000
retries: 0
timeout:
accessKey:
secretKey:
srcDataSources:
source1: ##数据源1
url: jdbc:mysql://192.00.000.000:3306/test?useUnicode=true
username: root
password: password
source2: ##数据源2
url: jdbc:mysql://172.00.000.000:3306/test?useUnicode=true
username: root
password: 123456
canalAdapters:
- instance: example # canal instance实例名称
groups:
- groupId: g1 #组id
outerAdapters:
# - name: logger
- name: rdb
key: mysql1 #mysql id
properties:
jdbc.driverClassName: com.mysql.jdbc.Driver
jdbc.url: jdbc:mysql://172.00.000.00:3306/test_wd?useUnicode=true
jdbc.username: root
jdbc.password: password
- instance: example1 # canal instance实例名称
groups:
- groupId: g2
outerAdapters:
- name: rdb
key: mysql2
properties:
jdbc.driverClassName: com.mysql.jdbc.Driver
jdbc.url: jdbc:mysql://172.00.000.00:3306/test_wd?useUnicode=true
jdbc.username: root
jdbc.password: password
需要注意的是,虽然canalAdapters是一个集合,instance是封装在集合中具体的一个实体对象,一组groupId和key属于一个instance实例,但在不同的canal instance中,groupId和key也必须区分开。
3.配置rdb文件
Canal-adapter是通过热加载rdb目录下的yml配置文件来做到同步数据到指定数据库的,所以这块需要根据前面配置的数据源和canal instance实例来配置yml文件,多源配置具体如下:
test_wd_test_sink.yml
dataSourceKey: source1 #数据源1
dbMapping:
targetTable: test_wd.test_sink #数据下沉指定数据库
database: test #源库
targetPk:
id: id #主键
mapAll: true
table: test_sink #源表
commitBatch: 10 #提交批次大小
groupId: g1 #组id
concurrent: true
destination: example #canal 实例名称
outerAdapterKey: mysql1 # key
test_wd_test_sink_many.yml
dataSourceKey: source2
dbMapping:
targetTable: tmp.test_sink
database: test
targetPk:
id: id
mapAll: true
table: test_sink
commitBatch: 10
groupId: g2
concurrent: true
destination: example1
outerAdapterKey: mysql2
4.启动Canal-adapter实例
启动之后,当日志中出现以下信息,则说明Canal-adapter启动成功了。
2022-03-09 15:10:32.528 [main] INFO c.a.otter.canal.client.adapter.rdb.config.ConfigLoader - ## Rdb mapping config loaded
2022-03-09 15:10:32.577 [Thread-3] INFO c.a.o.canal.adapter.launcher.loader.CanalAdapterWorker - =============> Start to subscribe destination: example <=============
2022-03-09 15:10:32.585 [Thread-3] INFO c.a.o.canal.adapter.launcher.loader.CanalAdapterWorker - =============> Subscribe destination: example succeed <=============
2022-03-09 15:10:32.793 [main] INFO com.alibaba.druid.pool.DruidDataSource - {dataSource-4} inited
2022-03-09 15:10:32.794 [main] INFO c.a.o.canal.adapter.launcher.loader.CanalAdapterLoader - Load canal adapter: rdb succeed
2022-03-09 15:10:32.795 [main] DEBUG o.s.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'syncSwitch'
2022-03-09 15:10:32.795 [main] INFO c.a.o.canal.adapter.launcher.loader.CanalAdapterLoader - Start adapter for canal instance: example1 succeed
2022-03-09 15:10:32.795 [main] INFO c.a.o.canal.adapter.launcher.loader.CanalAdapterService - ## the canal client adapters are running now ......
2022-03-09 15:10:32.795 [Thread-5] INFO c.a.o.canal.adapter.launcher.loader.CanalAdapterWorker - =============> Start to connect destination: example1 <=============
2022-03-09 15:10:32.795 [main] DEBUG o.s.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'scopedTarget.canalAdapterService'