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这篇。

参考文档

clickhouse修改用户密码

RDB适配器


Canal实现Mysql至ClickHouse实时同步
https://blog.yjll.blog/post/abdd8675.html
作者
简斋
发布于
2021年6月29日
许可协议