ClickHouse高原理与实践
ClickHouse是俄罗斯公司Yandex研发的一款开源的,用于OLAP( Online Analytical Processing,联机分析,即通过多种不同的维度审视数据。OLAP具有多维度、快速响应、聚合计算、数据切片等特点)的列式存储的数据库管理系统。
ClickHouse名称的来源是Click Stream,Data WareHouse,即基于点击事件流的数据仓库。
ClickHouse设计的初衷就是以最快的速度进行GROUP BY查询和过滤,它充分利用了列式存储,数据压缩,向量化执行,数据分片等架构特性,并且在算法选择上精益求精,因此具备了极高的实时查询性能。
ClickHouse是一款关系型数据库,支持了大部分标准SQL,具备完备的DBMS功能(DDL、DML、权限控制、数据备份与恢复、分布式管理),因此使用起来较友好。
1 ClickHouse的特性
1.1. OLAP
ClickHouse是一个OLAP数据库。OLAP(Online Analytical Processing),即联机分析处理或多维分析,它指的是通过多种不同的维度审视数据,通常会涉及到复杂的聚合计算。体现在关系模型的数据库,我们查看某个维度的数据,就是通过聚合函数计算指标数据并汇总(GROUP BY)到这个维度。在数据量非常大,汇总维度非常多的情况下,就会对数据库的性能要求非常高,而ClickHouse正是为了解决这个场景的问题而诞生的。
广告投放业务的数据BI,就是一种典型的OLAP场景:从媒体拉取的展点消数据和计算的用户行为的转化数据的数据量非常庞大,用户希望在时间、媒体、代理商、平台、账户、广告组、素材等多个维度自定义地组合起来查看和分析数据。
1.2. 列式存储
ClickHouse是列式存储的数据库,数据按列组织存储到一起,它的特点是:
- 缩小查询数据时扫描数据的范围,比如一张表有50个列,我们需要取其中5个列分析,那么列式存储只需要扫描这5个列的列数据即可,而行式存储则需要扫描所有数据,再对每行数据取出这5个列;
- 利于数据压缩,同一列的数据,其业务含义相同,则数据重复的可能性会更高,进而数据压缩时压缩率更高;
- 查询时数据扫描范围更小,数据传输大小也更小,所以列式存储的数据库有优秀的查询性能。
- 相对的是写操作时,行存储数据库只需要找到该行数据对应的索引位置写入数据即可,而列式存储需要将数据的每个列写入相应的列存储文件,因此列式存储数据库写性能不佳。
1.3. 表引擎
ClickHouse为适配不同业务场景,提供了几十种表引擎:
- MergeTree(合并树)家族:最常用的引擎,它具有支持索引、数据分区、数据副本的特点;
- 基于外部存储构建表的表引擎:HDFS、MySQL、Kafka等,其特点是直接其他存储系统读写数据,相当于对其他存储系统做了一个代理;
- 面向内存查询的表引擎:Memory、Set、Buffer等,此类表引擎在数据表被加载时,会将数据全部加载至内存,因此其拥有良好的查询性能。Memory表引擎被作为临时表而广泛地应用于ClickHouse内部;Set表引擎则具有去重的能力,且拥有物理存储,数据不会丢失,但是Set表引擎不能被查询,只能作为IN语句的右侧条件;
- Log家族表引擎:为小数据量(百万级以下),一次写入多次查询的场景而设计,拥有物理存储;
- 接口类型: Merge、 Dictionary 、Distributed,它们不是存储数据的表引擎,而是用于整合其他数据表。Merge表引擎可以作为代理查询任意数据的数据表,并最终合成一个结果集返回; Dictionary表引擎是数据字典的一层代理封装,它可以取代字典函数,让用户通过数据表查询字典; Distributed表引擎是分布式表的代理,用于分发读写请求到集群中的各个节点;
1.4. 向量化执行
向量化执行是一种将数据转换为向量形式以进行计算和分析的方法。其主要思想是将数据存储在多维数组或矩阵中,并通过使用向量和矩阵操作来执行计算。这种方法可以利用底层硬件的并行性,并且通常比使用循环和条件语句的传统方法更高效。
ClickHouse使用了CPU的SIMD指令(Single Instruction Multiple Data,即用单条指令操作多条数据),实现了向量化执行。基于向量化执行和列式存储,优化了循环处理的场景,从而提升了逻辑计算的性能。
1.5. 分区
定义:MergeTree家族表引擎的表支持数据分区,把数据按分区键区分,每个分区用单独的文件存储。这里的分区是对本地数据(同一个节点)的纵向切分,并不是把分区分到不同节点;
目的:ClickHouse分区的目的是在查询时缩小扫描数据的范围,从而提升查询性能;
使用:创建MergeTree家族表的时候可以通过PARTITION BY语句指定分区键, ClickHouse按分区键生成分区目录,插入数据时属于同一个分区的数据会被合并到同一个分区目录;
其他:MergeTree家族表引擎的特性都是基