云时代,MySQL到ClickHouse数据同步产品对比推荐

Posted NineData

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云时代,MySQL到ClickHouse数据同步产品对比推荐相关的知识,希望对你有一定的参考价值。

ClickHouse 在执行分析查询时的速度优势很好的弥补了MySQL的不足,但是对于很多开发者和DBA来说,如何将MySQL稳定、高效、简单的同步到 ClickHouse 却很困难。本文对比了 NineData、MaterializeMySQL(ClickHouse自带)、Bifrost 三款产品,看看他们在同步时的差异。

ClickHouse 在执行分析查询时的速度优势很好的弥补了 MySQL 的不足,但是对于很多开发者和DBA来说,如何将MySQL稳定、高效、简单的同步到 ClickHouse 却很困难。本文对比了 NineData、MaterializeMySQL(ClickHouse自带)、Bifrost 三款产品,看看他们在同步时的差异。

对比结果概述

整体上,NineData(官网:https://www.ninedata.cloud/ )的数据复制功能在功能、性能表现最突出。其次是Bifrost和ClickHouse自带的MaterializeMySQL。NineData在增量DDL的处理、字段映射的准确性、无主键表、以及功能丰富度上最强(数据校验、过滤、限流等),详细的对比如下图:

MySQL到ClickHouse数据同步产品对比结果概述

结构映射对比

在做了详细对比之后,对于基础类型,只有NineData考虑的更加完整,例如MySQL的datetime需要映射到ClickHouse的DateTime64,否则则可能出现数据丢失。如果使用Biforst或MaterializeMySQL等其他产品均映射到datetime可能会造成一定程度的数据精度丢失。

此外,在对比了MySQL全部数据类型之后,发现NineData支持更完整,例如对JSON类型、几何数据、地理信息仅NineData支持。此外,对于基础类型,也只有NineData考虑更加细致,使用Biforst或MaterializeMySQL等其他产品则可能导致精度丢失,从而造成数据丢失。

详细的对比如下图:

无主键表支持

NineData对记录做了特殊的标记处理,所以很好的支持了无主键表的数据同步。而MaterializeMySQL、Biforst均不支持。

详细的对比如下图:

无主键表支持情况

增量DDL

对于数据增量同步,支持好各种类型的DDL是保障同步链路持续稳定的关键,NineData在无主键表DDL支持、字段删除、字段名修改等特殊操作均做了适配处理,可以很好的保障复制链路的问题。同时,NineData还提供了可视化的错误修复和跳过功能,可以最大限度的保障链路持续稳定。

详细的对比如下图:

增量DDL对比结果

限流、对比、过滤等

除了前面介绍的一般功能之外,为了提升数据质量、保障稳定,NineData还支持了包括数据对比、运行中的限流、数据过滤等功能。具体的说明如下:

增量DDL 限流、对比、过滤等对比结果

同步性能对比

这里使用 sysbench工具生成了5000万行记录进行全量性能对比,再生成约1800万次DML(约5GB Binlog)进行增量性能对比。

对比中,全量同步 NineData 性能为36.2W RPS(每秒同步记录数)为最高;增量同步则是 ClickHouse 自带的同步工具 MaterializeMySQL 最高,需要注意,MaterializeMySQL 在错误处理上比较简单,如果报错则需要全部重新同步。

详细的对比如下:

  • 全量同步

通过sysbench生成10张表,每张表500W记录(5000W行),数据文件大小约为12G:

同步性能对比

  • 增量同步

通过sysbench生成5G大小的BinLog日志(约1800W次DML),再进行增量同步:

增量同步

总结

NineDatahttps://www.ninedata.cloud/)在功能上领先其他同步工具,特别是字段类型的全面适配和增量复制期间DDL的支持度,并且在动态限流、数据对比、监控等能力上也支持的最完善。

所以,如果想把MySQL的数据实时同步到ClickHouse,推荐使用NineData,不仅使用简单(SaaS),并在满足功能和性能的前提下,实现了字段类型的无损转换和数据的实时复制,很好的解决MySQL 同步数据到ClickHouse的问题。

补充说明

当前各个云厂商虽然都提供ClickHouse托管服务,但是另一方面云厂商又都在发展自己的数仓产品,在同步功能支持上通常仅对自家的数仓产品支持比较好,而对ClickHouse同步支持都很薄弱。此外,开源工具Canal也因为不能很好的支持结构同步,使用和维护起来并不方便。

DataX 同步mysql到clickhouse

上一篇文章介绍了如何编译DataX,这一篇介绍如何通过DataX同步数据。以 mysql 和 clickhouse 为例

DataX 可以用来做全量的数据迁移;如果要用 DataX 做增量同步,则需要额外带一个时间戳字段

进入可执行目录

首先进入到 target/datax/datax/bin 目录下,可以看到3个python文件

  • datax.py
  • dxprof.py
  • perftrace.py

在这里插入图片描述

制作job配置文件

DataX完成单个数据同步的作业,我们称之为Job,DataX接受到一个Job之后,将启动一个进程来完成整个作业同步过程。DataX Job模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、TaskGroup管理等功能。

生成模板

执行 python datax.py -r {YOUR_READER} -w {YOUR_WRITER},然后将控制台生成的模板,保存到 datax的job目录下,存为一个json文件。也可以执行 python datax.py -r {YOUR_READER} -w {YOUR_WRITER} > ../job/test.json 直接将输出重定至到文件中
在这里插入图片描述模板如下

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader", 
                    "parameter": {
                        "column": [], 
                        "connection": [
                            {
                                "jdbcUrl": [], 
                                "table": []
                            }
                        ], 
                        "password": "", 
                        "username": "", 
                        "where": ""
                    }
                }, 
                "writer": {
                    "name": "clickhousewriter", 
                    "parameter": {
                        "batchByteSize": 134217728, 
                        "batchSize": 65536, 
                        "column": [
                            "col1", 
                            "col2", 
                            "col3"
                        ], 
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:clickhouse://<host>:<port>[/<database>]", 
                                "table": [
                                    "table1", 
                                    "table2"
                                ]
                            }
                        ], 
                        "dryRun": false, 
                        "password": "password", 
                        "postSql": [], 
                        "preSql": [], 
                        "username": "username", 
                        "writeMode": "insert"
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": ""
            }
        }
    }
}

根据实际数据库修改模板

修改好的模板如下(使用 cat ../job/mysql2clickhouse.json | xsel -i -b 可以将文件的内容复制到剪贴板)

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader", 
                    "parameter": {
                        "column": [
				"id",
				"testTime",
				"dbtype",
				"tbname",
				"nrows",
				"ncols",
				"abbr",
				"cmd",
				"cost",
				"memG"
			], 
                        "connection": [
                            {
                                "jdbcUrl": ["jdbc:mysql://***.***.***.***:13306/dbtest?useUnicode=true&characterEncoding=utf-8&useSSL=false"], 
                                "table": [
					"exec"
				]
                            }
                        ], 
                        "password": "******", 
                        "username": "root", 
                        "where": ""
                    }
                }, 
                "writer": {
                    "name": "clickhousewriter", 
                    "parameter": {
                        "batchByteSize": 134217728, 
                        "batchSize": 65536, 
                        "column": [
                            "id",
                            "testTime",
                            "dbtype",
                            "tbname",
                            "nrows",
                            "ncols",
                            "abbr",
                            "cmd",
                            "cost",
                            "memG"
                        ], 
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:clickhouse://***.***.***.***:8123/test2", 
                                "table": [
                                    "exec"
                                ]
                            }
                        ], 
                        "dryRun": false, 
                        "password": "******", 
                        "postSql": [], 
                        "preSql": [], 
                        "username": "root", 
                        "writeMode": "insert"
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": "5"
            }
        }
    }
}

运行job

运行 job 的命令如下(二选一)

  • python datax.py ../job/mysql2clickhouse.json
  • python datax.py --jvm="-Xms3G -Xmx3G" ../job/test.json

用户名和密码都是必填项

由于目标数据库可以使用默认用户名密码登录,因此配置文件中username和password就直接留空了。结果报了如下错误,说明DataX一定要你填个用户名密码,不然无法正常执行。
在这里插入图片描述

JDBC的额外配置参数

不建议在没有服务器身份验证的情况下建立SSL连接。根据MySQL 5.5.45+、5.6.26+和5.7.6+的要求,如果不设置显式选项,则必须建立默认的SSL连接。您需要通过设置useSSL=false显式地禁用SSL,或者设置useSSL=true并为服务器证书验证提供信任存储

jdbc:mysql://127.0.0.1:3306/databaseName?useUnicode=true&characterEncoding=utf-8&useSSL=false
在这里插入图片描述

必须预先建表

直接执行job后,报如下错误。提示是因为目标数据库中没有这个表。因此在使用DataX进行数据同步时,必须在目标数据库预先建立对应的表结构。
在这里插入图片描述

column个数必须相同

配置的时候把源表的column全列出来了,由于仅需要抽取部分字段,因此目标column只配了部分。执行job,报如下错误。

说明 —— 在json配置文件中,源column的个数,必须与目标column的个数相同。
在这里插入图片描述

同步成功

在这里插入图片描述

以上是关于云时代,MySQL到ClickHouse数据同步产品对比推荐的主要内容,如果未能解决你的问题,请参考以下文章

如何将clickhouse的数据同步到mysql?

MySQL 到 ClickHouse 实时数据同步实操分享

MySQL 到 ClickHouse 实时数据同步实操分享

DataX 同步mysql到clickhouse

沃趣科技初探MySQL迁移到ClickHouse

沃趣科技初探MySQL迁移到ClickHouse