火山引擎:ClickHouse增强计划之“资源隔离”

简介: 火山引擎:ClickHouse增强计划之“资源隔离”


   相信大家都对大名鼎鼎的ClickHouse有一定的了解了,它强大的数据分析性能让人印象深刻。但在字节大量生产使用中,发现了ClickHouse依然存在了一定的限制。例如:

  • 缺少完整的upsert和delete操作
  • 多表关联查询能力弱
  • 集群规模较大时可用性下降(对字节尤其如此)
  • 没有资源隔离能力

因此,我们决定将ClickHouse能力进行全方位加强,打造一款更强大的数据分析平台。后面我们将从五个方面来和大家分享,本篇将详细介绍我们是如何为ClickHouse增强资源隔离能力的。

广告业务遇到的资源管控问题

ClickHouse的资源管控能力不够完善,在 insert、select 并发高的场景下会导致执行失败,影响用户体验。这是因为社区版ClickHouse目前仅提供依据不同用户的最大内存控制,在超过阈值时会杀死执行的 query。

在字节的广告业务中,需要区分不同查询的优先级;对查询性能抖动的容忍度较低;同时也需要支持adhoc能力;查询类型广泛、资源占用可能会较多。

ClickHouse提供的粗粒度并发控制不能满足需求;

  1. 无法灵活控制并发,导致查询迅速占满集群资源,部分后来的高优查询持续pending,导致报错。
  2. 无法给特定业务预留cpu资源,出现大查询占满cpu,而后来的查询执行时间大幅增加。

ByteHouse的解决方案:Resource Group

在这种情况下,字节在ByteHouse(字节基于ClickHouse能力增强的版本)中开发了资源管理的组件:Resource Group。

基本思路是将并发、内存、CPU等资源拆分给不同的资源组,同时通过资源组的父子关系实现不同资源组共享部分资源的能力。当用户的查询提交给引擎,依照定义的规则选定相应的资源组,然后评估该资源组以及父资源组是否能够执行该查询,如是则直接执行,否则进入该资源组的等待队列,等待资源释放。

并发控制

max_concurrent_queries 配置项控制一个资源组能够同时运行的查询上限。当资源组并发达到上限,或者该资源组的父资源组并发达到上限,引擎会把查询放入该资源组的等待队列。当该资源组有一个查询结束,引擎会执行该资源组等待队列中最早的查询;如果此时该资源组等待队列为空,则会触发父资源组的资源释放,进一步触发该父资源组的其他子资源组的等待队列查询执行,实现并发quota在一个父资源组之间的共享。

内存控制

每一个资源组可以配置一个软性的内存上限,当资源组中的查询使用内存超过这个软性限制之后,新查询将会进入等待队列。和并发控制类似,内存也会判断父资源组的限制,并使用类似的逻辑实现内存在一个父资源组之间的共享。

由于目前还没有一个准确的查询占用内存预估的模型,当前采取的策略是预估+实际内存矫正的模式,当一个新查询进入时,引擎会按照预估内存评估是否可以执行,在开始执行之后则是利用查询现有的memory_tracker在下一轮判断之前矫正预估值。

此软性的内存限制不同于原生ClickHouse的硬性内存限制,并不会杀死已经在执行的查询,而是用于控制新查询的可执行判断,因此可以配合使用。

CPU控制

ByteHouse使用cgroups提供的cpu controller实现资源组的CPU控制。Cpu controler通过使用 CFS 调度器将CPU资源按照相同的时间分片进行分配,以实现不同group按照预定义的cpu shares占用相应的CPU资源。

在ByteHouse内部,我们实现了一个新的线程池类,在该类中给查询分配线程资源时,会依据当前Context中记录的资源组信息分配关联到相应cgroup的线程。

由于采用的CFS调度器,我们可以很容易的得到以下结论:

  1. 当所有资源组都有查询在执行时,每个资源组可以使用的CPU比例为 cpu_shares / sum(cpu_shares)
  2. 当只有一个资源组有查询在执行时,该资源组可以使用的CPU比例为 100%

因此每个资源组可以使用的CPU资源比例范围就是 [cpu_shares/sum(cpu_shares), 100%],通过这个功能我们也就实现了两个预期效果:

  1. 保证了每个资源可以使用的CPU资源下限
  2. 保证了在任何workload情况下服务器CPU资源的总体利用率

Resource Group带来的效果提升

Resource Group能够显著的提升查询体验,为优先业务的查询提供保障,并且减小查询返回时间的方差。与此同时,也能够为集群稳定性带来提升,不会因为OOM杀死执行中的查询,以及防止一个服务出现故障而拖垮整个集群。

ByteHouse的Resource Group主要有以下优点:

  • 能够在CPU、内存、并发控制等全方位的提供资源隔离的能力
  • 可以限制低优先级查询带来的影响
  • 降低写入语句可能带来的不良影响

在上文提到的广告业务中,使用ByteHouse替换ClickHouse后,查询时间明显缩短,体验明显改善。

应用前:

应用后:

可以看到上线前用户每天的查询平均耗时在2.3s到14.1s之间抖动,十分剧烈,用户的使用体验很差。上线后每天的查询平均耗时则在0.4s到1.7s之之间抖动,较好的保证了该优先业务的查询资源,并且显著缩短的平均查询返回时间。

这是本次ClickHouse增强计划系列文章的最后一篇啦,除了这五篇文章提到的能力,ByteHouse还有有一个与ClickHouse使用不同执行引擎的版本,能够实现全面的存算分离,是真正的云原生数据仓库!后续我们也将为大家带来专题介绍。

相关文章
|
5月前
|
存储 SQL 消息中间件
ClickHouse(12)ClickHouse合并树MergeTree家族表引擎之AggregatingMergeTree详细解析
AggregatingMergeTree是ClickHouse的一种表引擎,它优化了MergeTree的合并逻辑,通过将相同主键(排序键)的行聚合为一行并存储聚合函数状态来减少行数。适用于增量数据聚合和物化视图。建表语法中涉及AggregateFunction和SimpleAggregateFunction类型。插入数据需使用带-State-的聚合函数,查询时使用GROUP BY和-Merge-。处理逻辑包括按排序键聚合、在合并分区时计算、以分区为单位聚合等。常用于物化视图配合普通MergeTree使用。查阅更多资料可访问相关链接。
269 4
|
5月前
|
存储 SQL 算法
ClickHouse(13)ClickHouse合并树MergeTree家族表引擎之CollapsingMergeTree详细解析
CollapsingMergeTree是ClickHouse的一种表引擎,它扩展了`MergeTree`,通过折叠行来优化存储和查询效率。当`Sign`列值为1和-1的成对行存在时,该引擎会异步删除除`Sign`外其他字段相同的行,只保留最新状态。建表语法中,`sign`列必须为`Int8`类型,用来标记状态(1)和撤销(-1)。写入时,应确保状态和撤销行的对应关系以保证正确折叠。查询时,可能需要使用聚合函数如`sum(Sign * x)`配合`GROUP BY`来处理折叠后的数据。使用`FINAL`修饰符可强制折叠,但效率较低。系列文章提供了更多关于ClickHouse及其表引擎的详细解析。
181 1
|
5月前
|
传感器 存储 SQL
ClickHouse(15)ClickHouse合并树MergeTree家族表引擎之GraphiteMergeTree详细解析
GraphiteMergeTree是ClickHouse用于优化Graphite数据存储和汇总的表引擎,适合需要瘦身和高效查询Graphite数据的开发者。它基于MergeTree,减少存储空间并提升查询效率。创建表时需包括Path、Time、Value和Version列。配置涉及pattern、regexp、function和retention,用于指定聚合函数和数据保留规则。文章还提供了建表语句示例和相关资源链接。
87 1
|
5月前
|
存储 SQL 关系型数据库
ClickHouse(11)ClickHouse合并树MergeTree家族表引擎之SummingMergeTree详细解析
`SummingMergeTree`是`MergeTree`引擎的变种,它合并相同主键的行并计算数值列的总和,从而节省存储空间和加速查询。通常与`MergeTree`配合使用,存储聚合数据以避免数据丢失。创建`SummingMergeTree`表时,可选参数`columns`指定要汇总的数值列。未指定时,默认汇总所有非主键数值列。注意,聚合可能不完整,查询时需用`SUM`和`GROUP BY`。文章还介绍了建表语法、数据处理规则以及对嵌套数据结构和`AggregateFunction`列的处理。查阅更多ClickHouse相关内容可访问相关链接。
214 5
|
5月前
|
存储 SQL 算法
ClickHouse(14)ClickHouse合并树MergeTree家族表引擎之VersionedCollapsingMergeTree详细解析
VersionedCollapsingMergeTree是ClickHouse的一种优化引擎,扩展了MergeTree,支持多线程异步插入和高效的数据折叠。它通过Sign和Version列处理对象状态的变化,Sign表示行的状态(正向或撤销),Version追踪状态版本。引擎自动删除旧状态,减少存储占用。在查询时,需注意可能需使用GROUP BY和聚合函数确保数据折叠,因为ClickHouse不保证查询结果已折叠。文章还提供了建表语法、使用示例和相关资源链接。
139 0
|
6月前
|
SQL 消息中间件 关系型数据库
ClickHouse(10)ClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析
`ReplacingMergeTree`是ClickHouse的一种表引擎,用于数据去重。与`MergeTree`不同,它在合并分区时删除重复行,但不保证无重复。去重基于`ORDER BY`列,在ver列未指定时保留最新行,否则保留ver值最大者。数据处理策略包括延迟合并导致的不确定性及按分区去重。`CREATE TABLE`语法中,`ReplacingMergeTree`需要指定可选的`ver`列。相关系列文章提供了更深入的解析。
190 0
|
6月前
|
存储 SQL 关系型数据库
ClickHouse(09)ClickHouse合并树MergeTree家族表引擎之MergeTree详细解析
ClickHouse的MergeTree系列引擎是其高性能大数据存储的核心,特别适合大量数据的快速插入。数据按主键排序,支持分区和数据副本,提供数据采样功能。建表时,通过`ENGINE = MergeTree()`指定引擎,`ORDER BY`指定排序键,可选`PARTITION BY`分区,`SAMPLE BY`进行采样。此外,MergeTree支持多种索引和设置,如`index_granularity`控制索引粒度。查询时,ClickHouse利用主键和索引来高效检索数据,尤其在使用等值或范围条件时。
62 0
|
OLAP 数据处理 数据库
聊聊ClickHouse向量化执行引擎-过滤操作
聊聊ClickHouse向量化执行引擎-过滤操作
331 0
|
数据挖掘 数据管理 测试技术
火山引擎:ClickHouse增强计划之“Upsert”
火山引擎:ClickHouse增强计划之“Upsert”
火山引擎:ClickHouse增强计划之“Upsert”
|
SQL 存储 缓存
13.【clickhouse】ClickHouse从入门到放弃-引擎
【clickhouse】ClickHouse从入门到放弃-引擎
13.【clickhouse】ClickHouse从入门到放弃-引擎