
随着大数据数仓技术的发展,业务或商业决策对快速、准确数据支持的依赖日益加深,对数据仓库的数据实时更新技术提出了更高要求。当前,社区版 ClickHouse 不支持唯一索引,通常使用 ReplacingMergeTree 或者 CollapsingMergeTree 等表引擎进行数据的去重和更新操作,针对新写入数据通过后台异步任务合并 Part 或者查询时实时合并 Part 来实现精确去重。但是,这种数据聚合方式的实时性和查询性能不佳,难以满足业务场景。
若使用 ALTER UPDATE/DELETE 等实时更新删除语句,则需要重写存量 Part 数据,造成计算资源的大量消耗和耗时增长,无法保证数据更新删除的实时性。
腾讯云数据仓库 TCHouse-C 是腾讯云提供的全托管 ClickHouse 服务。针对这一问题,腾讯云数据仓库 TCHouse-C 全新推出了一种高性能实时数据更新方案,旨在满足高频数据实时去重及轻量级部分列更新场景的需求。
#1
主要挑战
高性能
大规模数据
副本一致性
高可用性
#2
业界现有技术方案
Copy-On-Write 策略

Merge-On-Read 策略
Delta Store 策略

Delete + Insert 策略


#3
数据实时更新核心技术
社区版 ClickHouse 采用 Merge-On-Read 策略,会导致读取性能变差,难以支持实时删除和实时更新。腾讯云TCHouse-C 自研的实时数据更新采用 Delete-And-Insert 策略,系统为具备 Upsert 功能的表引擎提供唯一索引(Unique Index)支持。数据更新时,根据定义的 Unique Key 和唯一索引确定更新数据所在行,并将该行标记为删除后重新写入新的行。查询时,如果某行标记为删除,则查询引擎会自动过滤掉这些行。
腾讯云 TCHouse-C 提出的方案能够支持高频数据实时更新,补充了社区方案所不具备的轻量级部分列更新能力,其主要功能点及实现如下:
索引和标记删除
在实时更新的场景中,表级索引类似于TP数据库中的 Unique Index。用于在写入或更新数据时快速确定新写入行是否已经存在,以及其存在的位置信息。腾讯云 TCHouse-C 的 Upsert 方案为每个表设计了一个全局索引,用于存放KEY -> 行号的关键信息,便于每次进行 Upsert 操作时能迅速定位到需要更新的行。
轻量级数据更新/删除
update [db.]table set column1 = expr1 [, ...] WHERE filter_expr
复制
delete from [db.]table WHERE filter_expr
复制
后台数据合并优化
选取参与数据合并的 Part(Part 在合并期间仍可被查询)。
将多个待合并的 Part,采用多路归并算法,按需将去重或聚合后的数据写入新的 Part。
将新的 Part 提交到系统。
将参与合并的 Part 标记为过期,并通过引用计数管理,最终从文件系统中删除。
需要考虑正在合并的数据会被写入流程标记删除,以及合并 Part 中包含由 DELETE FROM 语句产生的无数据特殊 Part
标记删除的数据需要在 Merge 流程中删除,否则随着写入进行,冗余数据会越来越多,导致数据膨胀。
腾讯云 TCHouse-C 的具体解决方案如下
生成快照


多副本高可用

(2)墓碑机制
(3)副本间同步删除请求
故障恢复优化
#4
性能对比测试
导入性能对比
单次查询性能对比

并发小规模查询性能对比

更新/删除性能对比

高并发更新/删除性能对比
测试总结
#5
后续工作
关注腾讯云大数据公众号
邀您探索数据的无限可能

点击阅读原文,了解更多产品详情
↓↓↓