如何实现mysql实时同步到clickhouse

场景:最近项目项目中的个别表比如日志、订单等相关的表数据越来越大,几乎上千万了,以后可能还会越来越大。很多业务场景已经慢慢支撑不住了,估计以后mysql连接工具打开这个表都会卡,更别说搞一些订单统计报表等等

想法:以前见过别人用clickhouse查询很快很快,原理好像是把mysql同步到clickhouse,然后查clickhouse

方案:想着如何mysql插入,然后同步到clickhouse,针对一些大表把model连接改成clickhouse。但是卡在实时同步到clickhouse这一步了,本地搭建了一个CloudCanal,试了一下好像只insert,不update和delete
比如我mysql更新ID为3的数据,clickhouse这边就会有2条ID为3的数据,一条是原数据,一条更新过的数据。而且这个CloudCanal同步表的时候会额外生成2个字段,一个是_sign,一个_version。

问题求助:如何让mysql实时同步到clickhouse,不是增量同步,是实时同步,并且不生成额外字段。不管是工具,还是啥,大家给我一个方案。我不擅长python或者go等语言,尽可能的有那种现成的工具最好

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 26

实时同步,可以用canal来监听mysql,再写逻辑同步到ck,不过日志增量特别大的时候,mysql insert也很费劲吧,更别说update,瓶颈还是在mysql,所以还是把日志数据迁移到ck,业务直接操作ck更好

1年前 评论
Image 若只如初见 (楼主) 1年前
Image _yxun_ 1年前
Image 若只如初见 (楼主) 1年前
jiangjun
  1. ck不适合做业务,同步日志是可以的,日志不会有update 和 delete,日志同步ck可以用kafka,数据推到kafka,ck有自带功能,从kafka写到自己的表里
  2. 订单表上千万,按理不应该啊,如果真的这样,可以分表分库,按时间切分纵向切分,按业务横向切分。
1年前 评论
Image 若只如初见 (楼主) 1年前

mongodb不考虑吗?

1年前 评论
Image 若只如初见 (楼主) 1年前

新增和更新全部改成新增到 clickhouse, clickhouse 引擎选择 ReplacingMegeTree, 查数据的时候加 final 关键字

1年前 评论
Image 若只如初见 (楼主) 1年前
Image MR_NOBODY (作者) 1年前
Image MR_NOBODY (作者) 1年前

不可以历史数据插入clickhouse 实时可能会变更的数据还是存mysql吗

1年前 评论

之前写过一个go项目将mysql同步到clickhouse,存量用golang操作mysqldump然后解析数据,增量监听mysql-binlog 数量量数十几亿的样子、去重用leveldb 跑起来很快

1年前 评论
Image 若只如初见 (楼主) 1年前
Image buxiu (作者) 1年前
leo

Clickhouse 不适合做数据更新,千万级别的数据更新一条记录可能就得几十秒甚至更多,订单这种频繁的状态更新的数据会直接压垮 Clickhouse

1年前 评论
Image 若只如初见 (楼主) 1年前

ClickHouse 主要面向的是海量数据的批量写入和查询场景,不适合单条数据频繁操作,主要原因如下:

  1. 列式存储架构的更新操作需要定位并更改每一列中的数据,成本较高;
  2. 列式存储的批量压缩和分区存储机制使得单行更新或删除数据需要重新组织、合并底层数据文件,这会导致性能瓶颈;
  3. ClickHouse 最常用的存储引擎是 MergeTree,它采用分区和排序键的方式存储数据。虽然 ClickHouse 支持 ALTER DELETE 和 ALTER UPDATE 操作,但这些操作实际上并不是即时生效的。它们会标记要删除或更新的数据行,并在后续的后台合并(merge)任务中将其实际处理;

最终表现在实际体验上就是,频繁的行操作,会导致 Clickhouse 占用资源非常高(甚至是服务不可用),总之如果数据不是像日志、指标类的不可变数据,最好不要用 Clickhouse,虽然也有一些方案可以避免更新操作,但是依然无法避免单条数据的插入和删除操作,例如:使用 ReplacingMergeTree 引擎的,然后通过附加版本字段,来过滤掉相同 ID 的历史版本数据行(这也就是 CloudCanal 为什么为产生 _version 字段的原因,这是行业的最佳实践)。

1年前 评论
yangweijie

日志类的 可以考虑 parquet 格式, 有个flow-php 的库 ,据说压缩140倍 查询几百毫秒 可以一个目录下多个文件的查询,open-observe 背后就是这个日志文件来寸log的。

1年前 评论

ClickHouse 压根不适合你的场景

1年前 评论

clickhouse有mysql引擎,直接在clickhouse里面查询mysql数据。如果频繁删除和更新的数据,不要用clickhouse,不适合它。数据同步的话,用canal自己开发一个多对多的同步工具吧

1年前 评论

Apache Doris + Apache Seatunnel, Seatunnel 使用Mysql-CDC source connector。

1年前 评论

订单表能不能冷热数据分开,才千万,我们之前2亿的表,照样很快,定时把不需要的数据备份,这样的话你们的业务表能够大概率能够保持动态增长。

1年前 评论

自建考虑postgres、StarRocks等,云产品考虑hologres 通过flink-cdc实时同步mysql的binlog

1年前 评论

ClickHouse 的引擎不适合你现在的这个场景,可以考虑一下用字节的ByteHouse。 至于如何同步数据的话,考虑一下监听mysql的biglog方案?

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!