17 ClickHouse为什么会给人极致速度的印象?
你好,我是彭旭。
从这一讲开始,我们就进入到ClickHouse相关内容。在ClickHouse篇,我们会先深入探讨ClickHouse的架构设计和表模型,随后,再结合CDP(客户数据平台)的实际需求,分析ClickHouse的性能表现,并探讨优化策略。
这节课我们先来看看ClickHouse的起源,核心特征,以及为什么它的查询速度很快。
ClickHouse起源
有意思的是,StarRocks起源于百度,用于凤巢广告系统的报表分析,而ClickHouse也是起源于一家俄罗斯的搜索引擎公司Yandex,最初被用在一个叫做Metrica的广告在线流量分析系统。它们的诞生是不是很像?
Metrica广告在线流量分析系统会在前端埋点收集用户行为数据,然后立即进行一系列实时数据分析。这里的“埋点”指的是记录用户在页面上的Click点击行为,每次Click都会生成一个事件Event。这些点击事件流会被发送到数据仓库,用于进行在线分析处理(OLAP)。因此,ClickHouse 的全称就是 Click Stream Data Warehouse,简称 ClickHouse。
据说ClickHouse在内部存储过万亿行数据的情况下,大部分查询请求都能够做到秒级返回,在Yandex内部被广泛用于实时自助分析场景。而且数据量越大,优势相对其他数据库越明显。
ClickHouse的设计目标是高效的列存储和数据分析,还要擅长处理大宽表的查询分析。而ClickHouse的存储模型吸收了LSM的优点,在ClickHouse的MergeTree存储引擎中,数据先写入内存中的小块文件(MergeTree 数据块),然后定期将这些小块文件合并成更大的文件,最终形成一个有序的数据文件。这个过程类似于LSM树的Compact操作。
所以,ClickHouse也适合这种批量写入,多次读取的场景。ClickHouse对事务支持较弱,对事务目前还只有一些试验性的功能,比如支持单表单分区的事务。而且ClickHouse使用稀疏索引,不擅长少数行数据的处理。这也是ClickHouse为极致的查询分析性能所做的平衡。
ClickHouse核心特征
你可能听过这些关于ClickHouse的介绍。
比如ClickHouse被称为数据库管理系统,提供了一套功能和接口,它允许在运行时创建表和数据库、加载数据和运行查询,让用户能够方便地对数据库进行管理和操作。
还有,ClickHouse号称能够得到每秒几亿行的吞吐能力,远超像HBase、Cassandra等数据库所说的每秒数十万的吞吐能力。当然,在我看来这个对比确实不在同一个标准,因为HBase这类数据库更适合在实时随机存取场景,ClickHouse适合在批量导入与分析场景。
接下来,我们主要看下ClickHouse为什么能够做到这种极致的快。
列式存储
不同于HBase的宽列存储,StarRocks的列式存储加混合存储,ClickHouse是纯列式存储。
如果你想让数据查询性能更好,一方面需要让查询扫描的数据量尽量少,另外一方面就是让传输的数据量尽量少。
列式存储因为数据按列聚簇存储在一起,同一列的数据类型相同,并且数据按排序键排序存储,这样更有利于压缩。列式存储与数据压缩,正好能够在OLAP场景下,使得查询扫描的数据量尽量少的同时,传输的数据量也尽量少。
之前我们介绍行式存储与列式存储区别的时候有提到过,在OLAP类查询中,通常只需要读取表的一小部分列。在列式数据库中就只需要扫描这一部分列的数据。比如从一个100列的表中读取5列做统计分析,相比行式存储需要读取100列的所有数据,列式存储可以减少20倍的I/O消耗。
列式存储下,数据的重复率更高,更有利于数据压缩,ClickHouse默认使用LZ4压缩算法,数据压缩率可以达到10倍,数据压缩越高,从磁盘读取与网络传输就越快。
列式存储除了降低了存储与磁盘I/O的压力外,还为向量化执行做好了铺垫。
向量化执行
20世纪60年代到70年代,随着科学计算变得更加复杂,需要对大量数据执行相同的计算操作,这种需求催生了SIMD(Single Instruction, Multiple Data)技术,一些处理器架构引入了支持SIMD操作的指令集,如Intel的SSE(Streaming SIMD Extensions)指令集。而SIMD也为向量化执行提供了硬件支持。
向量化是一种数据处理优化技术,通过将相同的操作同时应用于一组数据元素,从而提高计算效率。
举个例子,假设披萨工厂制作披萨需要准备原料、烤制、切盘这几步。在没有使用向量化技术之前,披萨工厂需要先准备一个披萨的原料,然后烤制,最后切盘。需要制作几个披萨就需要这样串行化地循环几次。采用向量化技术之后,相当于升级了披萨工厂的烤箱,这样就可以一次性准备几个披萨的原料,一起烤制,完成后一起切盘,这样就大大提升了工厂的生产效率。
所以向量化执行,可以认为是一个将需要多次执行的循环,用一次并行执行完成的优化。想想在列式存储场景中,比如需要做两个字段求和的统计分析,是不是之前需要逐行求和,用了向量化执行后,批量的“披萨原料”也就是数据已经现成准备好,然后一起批量烤制,是不是速度也快了,吞吐量也上来了。
你在部署ClickHouse的时候,也需要检查服务器是否支持SIMD指令集,比如ClickHouse现在利用SSE4.2指令集实现向量化执行,你可以用下面的命令查看服务器对指令的支持情况。
看完硬件与存储方面的支持后,再来看看ClickHouse表引擎。
灵活多样的表引擎
ClickHouse支持非常丰富灵活的表引擎,包括合并树(MergeTree)家族、日志引擎系列、集成表引擎、其他特殊表引擎4大类,这4大类下面一共有几十种表引擎。每一个表引擎都有自己的特点,适合不同的业务场景。
在软件领域里,通用系统通常适用各种场景,满足不同需求。不过,通用系统一般并不能在所有情况下表现得最出色。实际上,并没有一款能够适用于所有场景的通用系统,为了突出某些特点,通常需要在其他方面做些取舍。这种情况在各个领域都有体现,就像大象和猎豹一样,它们都是四条腿的动物,但各自的特点塑造了它们的外貌和能力。大象庞大而强壮,擅长长途跋涉和搬运重物,而猎豹则是速度之王,能够以惊人的速度追捕猎物。
把大象和猎豹的特点比作到软件设计领域中,大象可能代表着系统设计注重稳定性和处理大数据量,能够处理复杂的业务逻辑和大规模数据存储;而猎豹则可能代表着系统设计强调高性能和快速响应,专注于处理实时数据和快速计算。
ClickHouse通过各种表引擎的设计,将大象和猎豹的特点都融入其中,以便在不同情况下灵活应用。
比如MergeTree表引擎系列,具备大象的耐力,能够支持大规模复杂数据的持久化存储,常用的大数据数仓一般就使用这个表引擎。
比如Memory存储引擎将数据存储在内存中,像猎豹一样,读写速度非常快,但是数据不持久化,适合于临时的实时计算和快速查询。
比如在一个电子商务系统中,一般会有一些实时大屏,用来展示成交额、成交品类、地域、会员等相关分析,就可以用Memory表引擎来临时存储,用作实时大屏的分析统计。但是仍然需要将数据持久化到MergeTree引擎,用来长期存储与统计分析。
索引支持
跟StarRocks类似,在ClickHouse中,当你合理设计了分区键与主键后,ClickHouse就会自动为主键建立一个稀疏索引。索引的粒度默认为8192行,你也可以配置按数据的大小,也就是字节数来设置索引粒度。
你可以看到,从HBase的基于行键的索引,到StarRocks的1024行稀疏索引,再到ClickHouse的8192行稀疏索引,这种变化反映出了数据库在实时随机存取和批量处理分析查询之间的平衡选择。
除了为排序键默认建立的稀疏索引外,ClickHouse还支持为其他列建立多种跳数索引,包括minmax、set、ngrambf_v1、tokenbf_v1、bloom_filter。
ClickHouse的数据是以数据片段的形式一个接着一个地快速写入的。这些跳数索引会将参数GRANULARITY指定数量的小块组合成大块,再对大块写入索引信息。类似布隆过滤器的模式,这样在使用筛选条件查询时,可以跳过很多不必要的数据,从而减少查询时需要读取的数据量,提升性能。
分布式架构
分布式和多线程这些被广泛使用的技术,在ClickHouse里面当然也不能落下。
向量化执行通过数据集并行提升性能。而多线程则是在一台机器上通过线程并行运行提升性能,分布式则进一步利用了多台机器的能力来提升性能。
而且ClickHouse数据也能够分布式存储,在计算机领域,移动计算比移动数据容易,利用分布式也能将计算与数据“本地化”。
通过“数据并行”“多线程执行”“分布式集群”3步,ClickHouse既支持数据分区,也支持数据分片,将多线程与分布式技术应用到了极致,大大提升了数据处理的性能。
这里提一下ClickHouse的集群其实属于主主架构,也就是集群中每个节点角色对等,客户端访问任意一个节点都可以得到相同的结果,所以,它规避了可能存在的单点故障问题。
小结
ClickHouse的这些核心特征,列式存储、极致压缩、向量化执行、分布式架构与并发执行等构成了它极致性能的基石。但是其实还有很多OLAP数据库,也都采用类似的技术与架构,为什么ClickHouse能够做到特别突出呢?
其实,我觉得还有一个要点,就是业务的驱动。
业务驱动技术的发展,在需要存储处理万亿级业务数据的场景下,ClickHouse持续集成、持续改进,基本上每个月都有版本发布,每次发布都有几十个issue是用来提升性能的,ClickHouse不断尝试将硬件的功效、算法的性能等最大化。很多细节累积起来,造就了今天极致性能的ClickHouse。
对ClickHouse有了基础的了解之后,下节课,我们将详细介绍ClickHouse的表引擎,以及CDP的表该如何选用合适的存储模型。
思考题
ClickHouse属于MPP架构,同时使用多线程模型,你知道MPP与多线程的区别与联系吗?
欢迎你在留言区和我交流。如果觉得有所收获,也可以把课程分享给更多的朋友一起学习。欢迎你加入我们的读者交流群,我们下节课见!
- 阿光 👍(0) 💬(0)
MPP 是一种并行计算架构,使用多个独立的处理单元(通常是独立的计算节点或服务器)来同时处理不同的任务。每个处理单元都有自己的内存和操作系统,彼此之间通过高速网络进行通信和数据交换。 多线程是一种并行计算模型,在单个进程内创建多个线程,每个线程可以独立执行任务。线程共享同一个进程的内存空间和资源,但可以并行运行。 并行计算:两者都是并行计算模型,旨在提高计算效率和处理能力。 结合使用:在一些高性能计算系统中,可以结合使用 MPP 和多线程模型。例如,ClickHouse 作为一个分布式数据库系统,采用 MPP 架构来分布式处理数据,同时在每个节点内部使用多线程模型来提高查询和数据处理的效率。
2024-12-25