如何实现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 协议》,转载必须注明作者和本文链接
实时同步,可以用canal来监听mysql,再写逻辑同步到ck,不过日志增量特别大的时候,mysql insert也很费劲吧,更别说update,瓶颈还是在mysql,所以还是把日志数据迁移到ck,业务直接操作ck更好
mongodb不考虑吗?
新增和更新全部改成新增到 clickhouse, clickhouse 引擎选择 ReplacingMegeTree, 查数据的时候加 final 关键字
不可以历史数据插入clickhouse 实时可能会变更的数据还是存mysql吗
之前写过一个go项目将mysql同步到clickhouse,存量用golang操作mysqldump然后解析数据,增量监听mysql-binlog 数量量数十几亿的样子、去重用leveldb 跑起来很快
Clickhouse 不适合做数据更新,千万级别的数据更新一条记录可能就得几十秒甚至更多,订单这种频繁的状态更新的数据会直接压垮 Clickhouse
ClickHouse 主要面向的是海量数据的批量写入和查询场景,不适合单条数据频繁操作,主要原因如下:
最终表现在实际体验上就是,频繁的行操作,会导致 Clickhouse 占用资源非常高(甚至是服务不可用),总之如果数据不是像日志、指标类的
不可变
数据,最好不要用 Clickhouse,虽然也有一些方案可以避免更新操作,但是依然无法避免单条数据的插入和删除操作,例如:使用 ReplacingMergeTree 引擎的,然后通过附加版本字段,来过滤掉相同 ID 的历史版本数据行(这也就是 CloudCanal 为什么为产生 _version 字段的原因,这是行业的最佳实践)。日志类的 可以考虑 parquet 格式, 有个flow-php 的库 ,据说压缩140倍 查询几百毫秒 可以一个目录下多个文件的查询,open-observe 背后就是这个日志文件来寸log的。
ClickHouse 压根不适合你的场景
clickhouse有mysql引擎,直接在clickhouse里面查询mysql数据。如果频繁删除和更新的数据,不要用clickhouse,不适合它。数据同步的话,用canal自己开发一个多对多的同步工具吧
Apache Doris + Apache Seatunnel, Seatunnel 使用Mysql-CDC source connector。
订单表能不能冷热数据分开,才千万,我们之前2亿的表,照样很快,定时把不需要的数据备份,这样的话你们的业务表能够大概率能够保持动态增长。
自建考虑postgres、StarRocks等,云产品考虑hologres 通过flink-cdc实时同步mysql的binlog
ClickHouse 的引擎不适合你现在的这个场景,可以考虑一下用字节的ByteHouse。 至于如何同步数据的话,考虑一下监听mysql的biglog方案?