美文网首页
ClickHouse Kafka引擎表新增字段的思考

ClickHouse Kafka引擎表新增字段的思考

作者: 淡淡的小番茄 | 来源:发表于2021-11-29 18:28 被阅读0次

背景

业务在变化,也在发展。项目上难免会遇到新增字段的场景。对于MySQL、Oracle这些关系型数据库来说,是相当简单的,支持也是比较完善的。新增字段,然后添加索引即可。曾几何时,我也有过给oracle的一张业务表添加过字段,然后把数据库搞挂了的经历。咨询过很多DBA,很多资深的架构师,都说这是常规操作,不会有任何的问题。谁晓得,我加的时候,正好赶上了磁盘的一个坏道,就是那么巧,你能到哪里说理去?

数据库操作需要慎重,不是吗?

Kafka引擎表增加字段

ClickHouse侧重于OLAP场景的,是不支持事物概念的。对于数据的更新也支持有限。在ClickHouse中更新的操作被称之为mutation(突变)。言归正传,我们来看具体的业务场景:

非常典型ETL过程,新建kafka引擎表,然后通过物化视图将数据抽取到ODS事实表中。业务上的需求如下:ods事实表中,需要新增字段edge_id,这个ID业务上使用比较频繁,需要新建索引。因为需要兼容之前旧消息的格式,我们的处理方法是:

Kafka引擎表字段为可空,ODS事实表字段非空(因为要加到order by上)。通过ETL物化视图进行相应的转换,形如:

...

SELECT

    ...

    ifNull(edge_id,0) edge_id

FROM sync_kafka_api_log;

本来是打算在kafka引擎表上,或者在事实表上增加默认值配置的。但是ODS事实表中,此字段在order by上,不支持设置默认值。在kafka上引擎表上加又不太符合业务逻辑,因为所有的业务逻辑或者转换都是在ETL物化视图上做的,也应该在ETL上做。所以最终比较好的方式还是需要在物化视图上进行修改。由于我们一个业务topic就对应一条流程:kafka引擎表、etl物化视图,后续很有必要进行合并进行统一管理,否则修改的成本很大。

遇到的问题

ClickHouse对于主键相关的字段,不支持修改操作,包括:字段类型修改、字段删除等等。比如我新增字段

ALTER TABLE ods_api_log ADD COLUMN IF NOT EXISTS edge_id Int32,

MODIFY

ORDER BY (

     ...,

    edge_id);

我想把edge_id字段类型由int32修改为int64,执行如下语句:

ALTER TABLE ods_api_log modify COLUMN edge_id Int64;

将会有如下异常提示:

ClickHouse exception, code: 524, host: 172.30.xx.xx, port: 8123; Code: 524, e.displayText() = DB::Exception: ALTER of key column edge_id from type Int32 to type Int64 must be metadata-only (version 20.8.6.6 (official build))

官方上有详细的说明,建议新建一张表,然后手动将数据抽取到新表中,然后删除旧表,并将新表名称修改为旧表名称。

https://github.com/ClickHouse/ClickHouse/issues/5604

相关文章

网友评论

      本文标题:ClickHouse Kafka引擎表新增字段的思考

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