美文网首页
ClickHouse的更新

ClickHouse的更新

作者: 淡淡的小番茄 | 来源:发表于2021-09-25 10:36 被阅读0次

背景

ClickHouse定位做OLAP分析,不太擅长更新操作。本身也不支持标准的更新语句。但是在使用过程中,比如:维度同步的时候,难免会有更新操作,那么我们如何处理呢?可以使用CDC的方式来实时同步关系型数据的维表信息,比如:设备信息、产品信息等。一般来说我们会基于:实时增量、定期全量的方式来进行维表数据的同步。其实思路是很清晰的,就是将更新操作变更为新增操作,利用ReplacingMergeTree或者CollapsingMergeTree进行合并。

增量同步

基于binlog实时同步mysql里面的数据,即使对于删除操作binlog中也是有完整的行记录信息的,所有不会有多大的困难,直接进行数据补齐即可。可以使用Debezium框架。

全量同步

对于全量同步的场景,本身全量同步就是对增量同步的一种补充,这块是需要考虑之前历史数据的清理问题的。方式有两种,一种是采取与增量方式一样的方式,对于历史数据进行进行进行处理,将标识设置为删除。第二种方式,直接使用update delete语句删除历史数据,由于这部分数据比较少,而且只是涉及一个分区,基本是没多大问题的。

实现

增量同步建议采用Debezium框架,我们目前采用的canal,问题比较多,且不支持PG。全量同步直接使用的crontab来定时调用clickhouse-client来执行同步SQL。shell脚本样例如下:

通过在shell脚本中定义版本信息,来标识本次的全量同步,以便于历史数据的清理:

ver0=$(date --date='10 second ago' +%s%3N)

清理的脚本:

ALTER Table yourtable DELETE WHERE version != #ver0 AND version != #ver1;

同步的脚本:

INSERT INTO yourtable SELECT * FROM yourtable_from;

全量同步的周期不益设置过长,最后别忘记了手动触发合并。

OPTIMIZE TABLE yourtable FINAL;

相关文章

网友评论

      本文标题:ClickHouse的更新

      本文链接:https://www.haomeiwen.com/subject/yzfxnltx.html