Canal实现Mysql至ClickHouse实时同步
前面两篇文章(Canal推送Mysql增量数据至RabbitMQ Canal实现Mysql至Elasticsearch实时同步)介绍了如何搭建Canal并且使用Canal将Mysql的解析后的数据投放到MQ中,和从MQ中同步数据到Elasticsearch中,这篇文章主要介绍如何同步数据到关系型数据库中。
ClickHouse
Canal提供了对关系型数据库的支持,虽然ClickHouse不是关系型数据库,但是可以兼容部分SQL语句(select,insert等),我很可以对增量数据进行同步。由于提供的包内不包含ClickHouse的JDBC驱动,我们去下载必要的jar包(lz4-1.3.0.jar
,clickhouse-jdbc-0.2.4.jar
,httpclient-4.3.3.jar
,httpcore-4.4.13.jar
)并放入canal/adapter/lib
内。
配置
我将数据分别同步到Mysql和ClickHouse中,防止相互干扰我这里使用了两个队列,两个instance分别从不同的队列中消费消息。
编辑 adapter/conf/application.yml
canalAdapters:
- instance: canal.mysql # canal instance Name or mq topic name
groups:
- groupId: g1
outerAdapters:
- name: rdb
key: mysql1
properties:
jdbc.driverClassName: com.mysql.jdbc.Driver
jdbc.url: jdbc:mysql://localhost:3306/test?useUnicode=true&serverTimezone=Asia/Shanghai
jdbc.username: root
jdbc.password: root
- instance: canal.clickhouse # canal instance Name or mq topic name
groups:
- groupId: g1
outerAdapters:
#- name: logger
- name: rdb
key: clickhouse
properties:
jdbc.driverClassName: ru.yandex.clickhouse.ClickHouseDriver
jdbc.url: jdbc:clickhouse://127.0.0.1:8123/pro
jdbc.username:
jdbc.password:
编辑MySQL的配置文件 adapter/conf/rdb/scan_log.yml
dataSourceKey: defaultDS
destination: canal.mysql
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
database: pro
table: scan_log
targetTable: scan_log
targetPk:
id: id
mapAll: true
编辑ClickHouse的配置文件 adapter/conf/rdb/ch_scan_log.yml
dataSourceKey: defaultDS
destination: canal.clickhouse
groupId: g1
outerAdapterKey: clickhouse
concurrent: true
dbMapping:
database: pro
table: scan_log
targetTable: scan_log
targetPk:
id: id
mapAll: true
同步报错
datax Unknown system variable 'tx_read_only'
The connection property 'zeroDateTimeBehavior' acceptable values are: 'CONVERT_TO_NULL', 'EXCEPTION' or 'ROUND'. The value 'convertToNull' is not acceptable.
由于我使用的是Mysql8,需要更新mysql驱动8.0.13
以上版本。
下载mysql-connector-java-8.0.22.jar放入lib中即可
还有同步clickhouse时,update和delete语句会报错,因为clickhouse的语法并不是完全兼容关系型数据库,我这里只对增量表进行了同步。
全量同步
Mysql通过REST接口的方式导入全量数据
curl http://127.0.0.1:8081/etl/rdb/mysql1/scan_log.yml
由于语法兼容性问题ClickHouse不能使用这种方式,同步全量数据我使用的是DataX,细节方面可以参考DataX同步全量Mqsql数据到Elasticsearch这篇。