MySQL是世界上最流行的开源数据库,也是OLTP界的顶流,但是对于OLAP分析型业务场景的能力太弱。ClickHouse是最近几年数仓OLAP分析查询领域的黑马,当红炸子鸡,有意思的是天然兼容MySQL语法。所以很多用户喜欢OLTP放MySQL,OLAP放ClickHouse,中间加一层数据同步,称之为HTAP黄金搭档。
我司的DBmotion是在线数据迁移SaaS服务,也可以docker run一键式本地化运行。对于MySQL迁移同步到ClickHouse,提供了结构迁移/全量初始化/增量同步/数据校验功能支持,并且为实时数据同步提供了精准一致性查询视图。里面一些功能点的设计,可以分享给大家,供参考。
▌全量初始化性能
ClickHouse全量初始化,往往是最耗时的,一般迁移工具都会采用多线程并发模式去拉取源端数据,然后并发load到目标端,多线程可以是行级并发或表级并发,DBmotion是采用的行级并发,因为如果有一些超大表,表级并发会受限于这些大表,我们处理的流程大致如下:

dbmotion核心模块会设定迁移任务的工作线程数,表数据切片行数split-rows,fetch批次大小等配置 每张表,根据总行数,split-rows估算出切片数量,根据PK/唯一键或时间/数据字段,计算每个分片的where边界,最终会获得一张切片list 将切片均匀分发给多线程去消费,每个线程负责这个切片的数据拉取和数据装载,直到所有切片都完成


binlog解析的所有数据,无论是u/d/i,都拼凑成insert语句,新增版本和event类型两个隐含字段,所有的DML都是以插入方式到达CK,适当的积累下批量,性能指标会很不错 同一行数据,会因为更新删除而产生多行数据,ReplacingMergeTree的分区合并会自动滤重,保留最新版本的数据,而这个版本号是我们按照事务操作的顺序投放进来的,合乎逻辑 D类型的数据,DBmotion会有后台任务异步批量处理 如果要使用partition分区,需要注意一点,ReplacingMergeTree只能保证一个分区内的合并去重,多分区需要保证分区维度和主键维度的一致性,否则最终结果会是重复的

echo "1\t2023-4-21\n2\t2024-12-04\n3\t2025-9-07"| \clickhouse-local -S "id Int64,thetime String" -N "cktable" \-q "CREATE TABLE cklocal (id Int64,thetime Date) ENGINE = MergeTree() \PARTITION BY toYYYYMM(thetime) ORDER BY id;\INSERT INTO TABLE cklocal SELECT id,thetime FROM cktable;" --path mydir
# ls -l mydirtotal 0drwxr-xr-x. 4 root root 34 Apr 20 14:52 datadrwxr-xr-x. 4 root root 150 Apr 20 14:52 metadatadrwxr-xr-x. 3 root root 17 Apr 20 14:52 storedrwxr-xr-x. 2 root root 6 Apr 20 14:52 user_defined
文章转载自云原生数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




