当前位置: 首页 > news >正文

ClickHouse基础知识

ClickHouse介绍

ClickHouse是由俄罗斯的Yandex开发的一个开源列式数据库管理系统(DBMS),专门为大规模数据分析和实时数据查询设计。它的设计目标是为需要快速分析大数据集的场景提供高效的解决方案,尤其是实时分析、OLAP(在线分析处理)任务。

ClickHouse的设计理念是基于列式存储结构,与传统的行式存储相比,列式存储能够极大提高大规模数据查询的效率。在列式存储中,每一列的数据都被单独存储,这使得查询时只需访问相关列数据,而无需读取整个表,从而提升了性能,特别是在执行复杂查询时。

ClickHouse特性

1.列式存储架构:与传统行式存储相比,ClickHouse使用列式存储。在列式存储中,数据按列而不是按行组织。这意味着每一列的数据被独立存储,读取时可以只访问所需的列,而不需要加载整行数据。这对于需要进行聚合计算的查询,如SUM、AVG等,非常高效。

2.高效的数据压缩:ClickHouse支持多种高效压缩算法,如LZ4和ZSTD(Zstandard)。这些算法允许系统减少数据存储的占用空间,同时保证在读取时能迅速解压,提供快速查询响应。

3.SQL支持与查询功能:ClickHouse在SQL支持与查询功能方面,提供了丰富的特性和扩展,尽可能地满足大数据分析的需求。它支持几乎所有标准的SQL查询功能,并且在此基础上提供了许多优化和扩展功能,使得大规模数据分析更加高效。

4.高度并行化:ClickHouse使用多核CPU并行执行查询。它可以在多个CPU核心上并行读取数据,进行计算并生成查询结果,这使得即便是在极大的数据集下,查询依然能够快速完成。

5.实时数据写入:ClickHouse支持高效的实时数据写入,能够处理大量并发的实时数据流。通过优化的数据导入路径,它能够以非常高的吞吐量接收数据,并立即开始处理。数据写入时不会阻塞查询执行,实时查询和数据加载可以并行进行,确保低延迟数据分析。

6.内存与持久化结合ClickHouse的内存与持久化结合的计算模型特性,使其能够在保证高效查询性能的同时,灵活处理大规模数据。这个计算模型结合了内存计算的速度优势与持久化存储的可靠性。

7.自动数据清理:ClickHouse提供了数据清理功能,通过定期删除或合并过期的数据,优化磁盘空间的使用,同时保持较高的查询性能。ClickHouse可以根据配置的策略定期删除或归档过期的数据。数据在内存中处理时,过期数据会被清理或推送至磁盘归档。

8.无主节点架构:与传统的分布式数据库架构不同,ClickHouse的每个节点在集群中是平等的,没有明确的主节点,系统中的每个节点都可以独立工作,ClickHouse天然支持水平扩展。为了应对更多的数据处理需求,可以简单地添加更多的节点到集群中,系统会自动分配新的数据分片和查询负载。

9.支持物化视图:ClickHouse可以将复杂查询的结果预先存储在一个物化视图表中,减少了查询时的计算负担。物化视图会在数据插入时自动计算和存储查询结果,从而避免了每次查询时都要重复计算。

10.延迟容忍与容错能力:ClickHouse在实时数据处理中提供了一定程度的延迟容忍能力。即使在大规模数据流入的情况下,系统也能够保证数据的完整性,并根据系统的负载情况进行延迟调节。

ClickHouse架构设计

1.Column(列):在 ClickHouse中,数据是按列存储的,即每一列的数据在物理上存储在一起。这种设计对于读取大量的某一列数据非常高效,因为只有需要的列会被读取,从而减少I/O操作。每个列通常包含同类型的数据,并且存储在单独的文件中。

2.Field(字段):数据表中的一列的具体值。在查询过程中,字段的值会根据列存储的方式进行操作,字段表示的是一个单一数据元素。每一列的字段是该列存储数据的基础单元。

3.DataType(数据类型):定义如何存储和处理表中的数据的核心元素。ClickHouse提供了多种数据类型,支持高效的存储和查询操作。数据类型的选择直接影响查询性能、存储效率以及执行时的内存使用。

4.Table(数据表):存储数据的容器,包含多个Column。每个Column存储某种类型的数据,而表通过这些列来定义数据的组织结构。每个表可以有一个表引擎,表引擎决定了数据的存储方式、访问方式和性能优化方式。

5.Block(数据块):在ClickHouse中,查询的执行是基于Block的。一个Block是一组行数据(或多列数据)的集合,它包含了多个列的值,并且这些列的值是按顺序排列的。通常,一个查询操作会从磁盘加载多个Block,并对它们执行所需的计算和处理。

6.Parser(解析器):查询引擎的一个组件,负责将用户输入的SQL查询解析为一个抽象语法树(AST)。AST是查询的结构化表示,记录了查询的各个组成部分和操作步骤。解析器的任务是将SQL查询字符串转换为数据库能够理解和执行的形式。

7.Interpreter(解释器):ClickHouse查询引擎的核心,它负责执行解析后的查询。根据AST,Interpreter调用不同的组件来执行查询,如数据读取、计算、聚合、排序等操作。执行过程中,Interpreter会根据查询的要求与数据表的IStorage接口进行交互,提取数据并进行处理。

8.Functions(函数): 主要用于对单个值或列的数据进行操作,如数学运算、字符串处理、日期计算等。它们用于SQL查询中的表达式,支持灵活的数据转换和计算。

9.Aggregate Functions(聚合函数): 用于对一组数据进行汇总计算,通常结合group by使用。常见的聚合函数包括sum,avg,count,min,max等,此外还提供了更复杂的统计聚合和窗口函数。

ClickHouse存储引擎

在 ClickHouse中,存储引擎决定了数据如何存储、管理、索引以及如何优化查询性能,是用于管理和优化数据存储和查询的核心组件。

MergeTree

MergeTree是ClickHouse最常用的存储引擎系列,也是默认的存储引擎,适用于绝大多数场景,支持大规模的并发写入、高效查询和数据合并。其特点是支持高效的数据写入、快速查询和自动数据合并。MergeTree通过将数据按照时间戳或者其他字段进行分区、排序和索引,可以显著提高查询性能。MergeTree具有以下特性:

1.分区:数据按照指定字段(例如时间字段)分区,每个分区会存储在一个单独的文件中,便于并行处理和查询优化。分区字段一般选择日期或者时间字段

2.排序:数据在物理存储时会根据指定的列进行排序。排序列决定了数据在磁盘上的存储顺序,可以加速基于这些列的范围查询。

3.主键索引:MergeTree可以使用主键索引来加速查询。主键通常是排序列,它对查询性能有直接影响。

4.数据合并:在存储过程中,MergeTree会定期进行合并操作,合并小的文件为较大的文件,减少磁盘碎片,并提高读取性能。

5.并发插入:MergeTree设计上支持高并发的数据写入和查询,因此特别适合需要高吞吐量的 OLAP 场景。

ReplacingMergeTree

ReplacingMergeTree是MergeTree的变种,允许在合并过程中根据特定的字段替换掉已有的记录。通常用于处理数据中的重复数据或者更新操作。ReplacingMergeTree具有以下特性:

1.去重功能:根据指定的字段(如version)来决定是否替换重复数据。

2.保持最新版本:通常会根据某个版本号字段来决定保留数据的最新版本。

3.适用场景:去除重复数据,或者在每次插入数据时,只保留最新的版本。

SummingMergeTree

SummingMergeTree在MergeTree的基础上进行了扩展,专门设计用来对某些数值列进行求和操作。使用 SummingMergeTree可以显著简化一些数据聚合需求,并且可以优化查询性能。

SummingMergeTree在数据合并时自动对指定的数值列进行求和。具体来说,当合并相同分区内的数据时,所有符合order by和partition by条件的记录将根据配置的列进行求和。

AggregatingMergeTree

AggregatingMergeTree在MergeTree的基础上进行了扩展,允许在合并过程中进行复杂的聚合计算。聚合操作通常在插入数据时就开始进行,而不是等到查询时才进行。AggregatingMergeTree存储的是聚合状态,而不是直接的聚合结果。

当插入数据时,AggregatingMergeTree会将指定的字段值传递给一个聚合函数,并将该函数的状态(而不是结果)存储在表中。这些状态数据会随着数据的合并而继续被聚合,最终可以通过查询获取聚合结果。

CollapsingMergeTree

CollapsingMergeTree在MergeTree的基础上进行了扩展,专门用于处理“冲突记录”(或者说“撤销操作”)的场景。设计目的是为了在数据的写入和合并过程中进行“冲突消解”,从而避免重复数据的产生。它通常用于场景中有撤销或状态回退需求的应用,比如交易记录、日志事件或需要标记数据撤销的情况。

CollapsingMergeTree表中有一个特殊的列,通常称为sign列。这个列的作用是标记某一行数据是否已被撤销(或“回滚”)。该列的值通常为1或-1,表示数据是有效(新增的)还是已被撤销(删除的)。

在后台合并过程中,会根据sign列的值来判断如何处理冲突数据。如果有一条记录被标记为撤销(sign=-1),而之前的记录被标记为有效(sign=1),则它们会在合并过程中消除,从而避免重复记录的出现。

VersionedCollapsingMergeTree

VersionedCollapsingMergeTree是CollapsingMergeTree的进一步扩展,支持版本控制功能。它在sign字段的基础上增加了版本号字段,通过一个版本号字段来控制数据的版本更新,在合并时选择保留最新版本的数据。

Log

Log引擎旨在处理日志数据。它的设计理念是优化对日志类数据的写入与查询效率,尤其适用于那些数据量巨大、查询不涉及复杂聚合计算的场景。Log引擎不仅支持高效的日志写入,还能够提供高效的查询性能,尤其是在处理按时间戳排序的大数据集时。Log具有以下特性:

1.磁盘存储:Log引擎将数据存储在磁盘上,写入时将数据追加在文件末尾,不支持突变操作(如更新和删除),也不支持索引‌。

2‌.写操作上锁:.Log引擎支持并发读取数据文件,但在写入数据时,会锁定表并阻塞其他读写操作,直到写入完成‌。

3.低存储开销:由于Log引擎不执行复杂的合并和压缩操作,因此相较于其他存储引擎,它的存储开销较低,适用于不需要复杂查询优化的场景。

TinyLog

TinyLog旨在处理小型的日志数据。它通常用于需要快速插入少量数据、但同时又不要求复杂查询处理的场景。与Log引擎相比,TinyLog设计得更加简化,适用于小型、低负载的日志数据存储和分析。

Memory

Memory专门设计用于存储在内存中的数据。它非常适合用于高性能的临时数据存储场景,其中数据量较小且查询速度要求非常高。由于所有数据都存储在内存中,Memory的读取速度非常快,读写操作不会互相阻塞,不支持索引。Memory并不适合长期数据存储,因为一旦服务器重启,数据就会丢失。

Join

Join用于优化和处理表之间的连接操作。它通常用于查询优化,尤其是在执行大型查询时,涉及多个表的连接。Join本身并不是一个存储引擎,而是用于帮助高效执行查询中的连接操作。在处理较大的数据集时,Join会考虑使用内存和磁盘之间的协同作用。

ClickHouse数据压缩

压缩原理

ClickHouse的数据压缩机制是其高性能、高可用性存储的核心功能之一。由于ClickHouse是一个列式数据库,它的设计非常适合于高效压缩大规模数据,尤其是在处理大数据分析和实时查询的场景中。数据压缩不仅可以节省存储空间,还可以提升查询性能。

ClickHouse使用列式存储架构,这种架构的特点是同一列的数据类型和数值通常具有相似性,这使得数据压缩效果非常好。与传统的行式存储相比,列式存储不仅能提高压缩效率,还能加快查询过程,因为查询只涉及少数几个列,不需要读取整个行的数据。

ClickHouse采用压缩块(Compression Blocks)来进行数据压缩。数据表在存储时会被拆分成多个数据块,每个数据块通常包含1MB的数据。每个块会根据其数据的特性,使用不同的压缩算法进行处理。默认情况下,每个压缩块的大小为1MB,但用户可以根据需要调整这个大小,过小的压缩块可能会导致更多的I/O操作,而过大的压缩块则可能导致内存消耗过大或查询延迟增加。

压缩算法

在列式存储中,数据按列而不是按行分布,每一列的数据存储在一起,因此可以采用不同的压缩算法处理不同列的数据,从而提高整体存储效率。

1.LZ4:LZ4是一个速度非常快的压缩算法,它在压缩和解压缩时都能提供很高的性能,但压缩比相对较低。LZ4通常用于要求低延迟和实时数据查询的场景,例如:实时数据流、日志数据、需要高频写入和查询的应用。

2.ZSTD:ZSTD是一种新型的压缩算法,提供比LZ4更高的压缩比,同时保持较好的解压缩速度。ZSTD被认为是一个综合性能优秀的压缩算法,适用于要求较高压缩率的场景。

3.LZMA:LZMA提供极高的压缩比,但压缩和解压速度较慢。它非常适合存储空间要求极高,但对性能要求较低的场景。

4.Delta:Delta压缩通过存储数据项之间的差异来压缩数据,适用于变化较小的数值型数据(例如时间序列数据)。它能够提供非常高的压缩比,尤其是对于差异较小的数据集。适用于有时间顺序和规律性的数值数据(例如日志、监控数据等),尤其是变化较小的字段。

5.Plain:Plain是一种无压缩的数据存储方式,适用于对压缩比要求不高,或需要极高写入性能的场景。

ClickHouse物化视图

物化视图是一种特殊类型的视图,它与普通视图的最大区别在于,物化视图会将查询结果实际存储在数据库中,而普通视图则是每次查询时动态计算数据。物化视图在ClickHouse中是一种高效的数据处理方式,尤其适用于大规模数据集和频繁查询的场景。

物化视图本身并不负责存储数据,而是依赖于指定的存储引擎来持久化数据。

物化视图的核心思想是将查询的结果预先计算并存储,这样可以避免在每次查询时都进行重复的计算,从而提升查询的性能,这在处理复杂的聚合查询、连接操作或统计分析时尤其有效,但是因为物化视图会存储查询的计算结果,所以会占用额外的存储空间,在数据量非常大的情况下,存储开销可能会非常大,也会带来一定的管理复杂性。

物化视图的一个重要特性是它的自动更新机制。每当源表的数据发生变化时,无论是数据的新增,修改,还是删除,物化视图随着数据的变化而自动更新。但是,数据的更新可能会有一定的延迟。

ClickHouseMPP架构

ClickHouse的MPP(Massively Parallel Processing)架构是其分布式数据处理能力的核心,旨在提供高效的数据查询和分析能力,特别是在处理大规模数据集时。MPP架构通过将计算任务并行化,充分利用集群中的所有节点来加速数据的读取和计算,从而大幅提升查询性能。

MPP架构

MPP架构是一种分布式计算架构,专门设计用来高效处理大规模数据集。在这种架构下,数据库被分割成多个部分,每个部分可以在不同的服务器节点上并行处理。当执行一个查询时,它可以被分解为许多小的任务,这些任务可以同时在多个节点上运行,从而极大地提高查询性能和系统的整体吞吐量‌。

组成部分

1.分布式表:定义数据的逻辑结构,包含分片和副本的元数据。分布式表帮助将数据分散到不同的物理节点上,并支持水平扩展。

2.分片:数据的物理分片,每个分片都是一个独立的ClickHouse节点或集群。每个分片存储数据的一部分,并负责处理与其相关的查询任务。

3.副本:每个分片的冗余副本,用于提高数据的可靠性和容错性。副本之间保持同步,确保在某个节点发生故障时,查询可以通过其他副本继续执行。

4协调节点‌:负责解析查询、生成执行计划,并将任务分配给相关的数据节点。协调节点还负责收集来自各数据节点的中间结果,并将它们整合生成最终的查询结果,然后返回给客户端。

5数据节点‌:实际存储数据并执行协调节点分配的查询任务。每个数据节点都存储一部分完整的数据,并能够独立地执行计算和查询任务。通过并行处理,数据节点能显著提高查询性能。

工作流程

1.查询请求的接收与解析:用户向ClickHouse提交查询请求时,首先会被发送到集群中的协调节点。协调节点首先对用户的查询语句进行语法解析,确保查询的合法性。再根据查询内容,协调节点会生成执行计划。这包括识别查询的各个部分(例如扫描、聚合、排序等),并决定如何将任务分配给集群中的各个数据节点。

2.任务分配与查询拆分:根据查询的执行计划,协调节点会将查询任务拆分成多个子任务,并将它们分配给数据节点进行处理。数据在ClickHouse中通常是根据分片来分布的,查询任务会根据分片规则被分配到相关的数据节点。每个分片存储数据的一部分,查询可能会涉及多个分片。如果数据有副本,协调节点会根据负载均衡策略选择一个副本来执行查询,以保证高效和容错性。

3.数据节点的查询执行:数据节点会根据查询的要求读取本地存储的相关数据。这些数据通常以列式存储的形式保存在磁盘上,因此查询时只需读取所需的列。每个数据节点在本地完成查询任务(如过滤、聚合、排序等),然后将局部结果发送给协调节点。这个过程中,数据节点可能还会进行一些数据压缩和优化,以减少网络传输的数据量。

4.协调节点合并中间结果:所有的数据节点将各自处理的局部查询结果发送回协调节点。协调节点接收到这些结果后,会对它们进行合并和处理,通常包括排序、去重、聚合等操作。对于涉及到全局聚合或排序的查询,协调节点会在接收到各数据节点的部分结果后进行最终的计算。最终,协调节点将处理后的查询结果返回给客户端。

ClickHouse分片

ClickHouse的分片机制是其分布式架构中的核心组成部分,能够有效地将数据分布到多个节点上,以便实现横向扩展、提高吞吐量并优化查询性能。

分片是将数据按一定规则分布到不同物理节点的基本单位。每个分片包含了一部分数据集,并且可以包含一个或多个副本。每个节点上通常会部署一个或多个分片,从而实现数据的分布式存储。通过将数据分布到多个分片,ClickHouse能够在多个节点间平衡查询和数据存储的负载。分片使得查询可以在多个节点并行执行,显著提升系统的吞吐量。随着数据量的增加,可以通过增加新的分片和节点来扩展系统容量。

分片方式

分片的关键在于如何将数据分配到不同的分片上。ClickHouse使用一种叫做分片键(Shard Key)的机制来决定每条数据应该存储在哪个分片上。常见的分片方式有以下几种:

1.基于哈希的分片:ClickHouse最常用的分片方式是哈希分片。在这种方式下,ClickHouse使用一个特定的字段(如时间戳、ID等)计算哈希值,哈希值决定了该数据应该被存储到哪个分片。为了实现均匀分布,ClickHouse会将哈希值对分片数进行取模运算。哈希值的分布保证了数据尽可能均匀地分布到各个分片上,避免某些分片存储过多数据,导致负载不均衡。

2.基于范围的分片:数据根据某个字段的范围来分片,例如按天、周或月分片。这种方法适合用于时间序列数据,能够提高基于时间字段的查询性能。

3.自定义分片规则:ClickHouse也支持自定义的分片策略,用户可以根据业务需求设计特定的分片规则。这些规则可以基于多个字段、特定的算法或其他逻辑进行分片,以适应各种应用场景。

副本机制

每个分片可以有多个副本。副本是分片的完整复制,存在于不同的节点上,ClickHouse保证所有副本之间的数据一致性。

副本机制确保了数据的高可用性和容错能力。如果一个节点发生故障,系统会自动切换到其他副本节点,保证数据的可用性。

当写入数据时,会同时写入到所有副本中,确保每个副本的数据一致,但副本间的数据同步是异步的,这意味着某个副本节点上的数据可能会稍微滞后于主节点的数据。

当查询数据时,查询请求会被分发到集群中的不同节点上,每个节点会查询它所管理的分片,查询请求还会根据负载均衡策略在副本之间选择执行。

ClickHouse的优缺点

优点

1. 高性能查询:ClickHouse支持多线程并行查询执行,可以充分利用多核CPU的计算能力,显著提高查询性能,能够在毫秒级的延迟下处理大数据量,尤其擅长聚合计算,如计数、求和、平均值等。

2.高效的存储和压缩:ClickHouse在存储数据时使用了高效的压缩算法(如LZ4、ZSTD),能够显著节省存储空间。对于大数据量的存储,数据压缩让ClickHouse成为非常具成本效益的解决方案。

3.实时数据处理:ClickHouse能处理大规模的实时数据流,具有高效的写入能力,适合需要高频写入和低延迟查询的场景。在数据写入的同时,ClickHouse还能保持查询的低延迟,能够支持“实时”数据分析和报告。

缺点

1.资源消耗较大:ClickHouse在执行复杂的查询时需要大量的内存和计算资源。对于一些复杂的聚合查询或海量数据的查询,可能会消耗过多的内存和CPU,导致服务器资源不足,从而影响性能。尤其在大规模部署时,ClickHouse对硬件要求较高,尤其是在存储和计算资源上,需要更多的磁盘I/O和CPU性能。

2.更新操作性能差:由于ClickHouse使用的是列式存储,它并不适合频繁的更新操作。在需要经常修改已存数据的场景下,更新操作会相对较慢。ClickHouse不像传统数据库那样直接支持删除数据,它采用的是“标记删除”的方式,意味着真正的数据删除是延迟执行的。这在一些需要经常删除数据的场景中,可能导致性能问题。

3.缺乏传统索引支持:ClickHouse并不像传统的关系数据库那样使用B+树等索引结构来优化查询,而是通过数据分区和排序来加速查询。虽然这种方式对于大多数聚合查询有效,但对于某些复杂查询,用户可能需要自己调整分区键、排序方式等配置,才能达到最优性能。

    相关文章:

  • 嵌入式网络通信与物联网协议全解析:Wi-Fi、BLE、LoRa、ZigBee 实战指南
  • golang pprof性能调试工具
  • 内网对抗之信息收集篇
  • Note2.3 机器学习:Adaptive Learning Rate
  • Java 大视界 -- Java 大数据机器学习模型在金融市场高频交易策略优化与风险控制中的应用(327)
  • springboot+Vue逍遥大药房管理系统
  • SmartETL中数据库操作与流程解耦的设计与应用
  • Stewart并联结构两自由度正逆解计算和工作空间仿真
  • 使用asyncio构建高性能网络爬虫
  • for each循环语句
  • FPGA芯片的配置方法
  • [Java 基础]HashMap
  • Element Plus el-button实例类型详解
  • 什么是数字签名(ECDSA)?
  • 非阻塞 IO
  • Java面试题030:一文深入了解MySQL(2)
  • 将文档转为数据集
  • FPGA内部资源介绍
  • tf serving和torch serve哪个耗时更低
  • 数据结构与算法总概