ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。

本页面主要目录有关于ClickHouse的:历史沿革、特点、主要功能、性能指标、缺点、应用领域等介绍

开发者

Yandex

上线时间

2016年

软件类型

数据库

开发语言

C++

简介

ClickHouse最早由俄罗斯IT公司Yandex为Yandex.Metrica网络分析服务开发。ClickHouse允许分析实时更新的数据,并以高性能为目标。其背后的ClickHouse Inc.公司位于美国旧金山湾区,同时在荷兰阿姆斯特丹有分部。2021年10月,该公司进行了B轮融资,共计融资2.5亿美元。

ClickHouse采用的压缩算法可以将列的数据进行压缩处理,数据中的重复项越多,则压缩率越高。对网络带宽和磁盘I/O的压力也就会进一步地变小,并且支持LZ4、ZSTD压缩算法,其中ZSTD可以提供极高压缩比,节省大量存储空间。

历史沿革

ClickHouse是一个用于OLAP的开源列式数据库。ClickHouse最早由俄罗斯IT公司Yandex为Yandex.Metrica网络分析服务开发。

ClickHouse在2016年基于宽松式的Apache2.0许可证发布。

ClickHouse允许分析实时更新的数据,并以高性能为目标,此外ClickHouse还有以下的特点:真正的列式数据库: 没有任何内容与值一起存储;线性可扩展性: 可以通过添加服务器来扩展集群;容错性: 系统是一个分片集群,其中每个分片都是一组副本;能够存储和处理数PB的数据;SQL支持。其背后的ClickHouse Inc.公司位于美国旧金山湾区,同时在荷兰阿姆斯特丹有分部。

2021年9月20日,ClickHouse,Inc.宣布成立,并获得由Index Ventures和Benchmark领投、Yandex NV等公司参与的近5000万美元A轮融资。2021年10月,该公司进行了B轮融资,共计融资2.5亿美元。

特点

ClickHouse是一个真正的列式数据库管理系统(DBMS)。在ClickHouse中,数据始终是按列存储的,包括向量(提供或列块)执行的过程。操作都是基于向量进行分派的,而不是单个的值,这被称为“矢量化查询执行”,它有利于降低实际的数据处理。

不同的数据存储顺序更适合不同的工作场景。数据场景是指进行何种查询、查询的频率和比例;每种查询需要读取多少数据--行、列、字节;数据的读取和更新是如何关联的;数据的工作大小是多少,在本地的使用情况如何;是否使用事务以及事务的隔离情况如何;对数据的重复性和逻辑完整性有什么要求;每种查询的延迟和吞吐量要求等。

ClickHouse最初是作为一个原型构建的,它只完成一项任务:尽可能快地过滤和聚合数据。这就是构建典型分析报告所需要做的事情,也是典型GROUPBY查询所做的事情。ClickHouse团队做出了几项高层决策,这些决策结合起来,使实现这一任务成为可能。

面向列的存储

源数据包含数百甚至数千列,而报表只能使用其中的几个列。系统需要避免读取不必要的列,以避免磁盘读取操作。

索引

驻留内存的ClickHouse数据结构只允许读取必要的列和这些列的必要行范围。

数据压缩

与面向行的系统相比,将同一列的不同值存储在一起通常能获得更好的压缩比,因为在真实数据中,一列的相邻行通常具有相同或不多的不同值。除通用压缩外,ClickHouse还支持可使数据更紧凑的专用编解码器。

向量化查询执行

ClickHouse不仅按列存储数据,还按列处理数据。这样可以更好地利用CPU缓存,并允许使用SIMD CPU指令。

可扩展性

ClickHouse可以利用所有可用的CPU内核和磁盘来执行单个查询。不仅仅是在单个服务器上,而是在集群的所有CPU内核和磁盘上。

主要功能

真正的列式数据库管理

在真正的面向列的DBMS中,数值不会存储额外的数据。这意味着必须支持长度不变的值,以避免在值旁边存储其长度"数字"。例如,10亿个UInt8类型的值在未压缩的情况下消耗的资源应在1GB左右,否则会严重影响CPU的使用。由于解压缩的速度(CPU占用率)主要取决于未压缩数据的容量,因此即使在未压缩的情况下,也必须紧凑地存储数据。

这与HBase、BigTable、Cassandra和HyperTable等可以分别存储不同列的值,但由于针对其他场景进行了优化而无法有效处理分析查询的系统形成了鲜明对比。在这些系统中,可以获得每秒十万行左右的吞吐量,但无法获得每秒数亿行的吞吐量。

ClickHouse是一个数据库管理系统,而不是一个单一的数据库。它允许在运行时创建表格和数据库、加载数据和运行查询,而无需重新配置和重启服务器。

数据

一些面向列的DBMS不使用数据压缩。然而,数据压缩在实现卓越性能方面发挥着关键作用。

除了在磁盘空间和CPU消耗之间做出不同权衡的高效通用压缩编解码器外,ClickHouse还为特定类型的数据提供了专门的编解码器,这使得ClickHouse能够与时间序列等更小众的数据库竞争,并超越它们。

数据的磁盘存储

通过主键对数据进行物理排序,可以在几十毫秒内根据特定值或值范围以低延迟提取数据。SAP HANA和Google PowerDrill等一些面向列的DBMS只能在RAM中运行。这种方法需要分配比实时分析更多的硬件预算。

ClickHouse设计为在普通硬盘驱动器上工作,这意味着每GB数据存储的成本很低,但如果有固态硬盘和额外的内存,也可以充分利用。

多核并行处理

大型查询会自然并行化,占用当前服务器上的所有必要资源。

多个服务器

在ClickHouse中,数据可以驻留在不同的分片上。每个分片都可以是一组用于容错的副本。所有分片都用于并行运行查询,对用户来说是透明的。

SQL支持

ClickHouse支持基于SQL的声明式查询语言,在许多情况下与ANSI SQL标准相同。支持的查询包括GROUP BY、ORDER BY、FROM中的子查询、JOIN子句、IN操作符、窗口函数和标量子查询。ClickHouse还不支持相关(从属)子查询,但将来可能会支持。

矢量计算引擎

数据不仅按列存储,而且按矢量(列的一部分)处理,从而实现较高的CPU效率。

实时数据

ClickHouse支持带有主键的表格。为了在主键范围内快速执行查询,使用合并树对数据进行增量排序。因此,数据可以不断添加到表中,接收新数据时不会加锁。

主索引

通过主键对数据进行物理排序,可以根据特定值或值范围提取数据,延迟时间短,不超过几十毫秒。

二级索引

与其他数据库管理系统不同,ClickHouse中的二级索引并不指向特定的行或行范围。相反,它们允许数据库提前知道某些数据部分的所有行都不符合查询过滤条件,并完全不读取它们,因此它们被称为数据跳过索引。

适合在线查询

大多数OLAP数据库管理系统并不以亚秒级延迟的在线查询为目标。在其他系统中,几十秒甚至几分钟的报告生成时间通常被认为是可以接受的。有时甚至需要更长的时间,这就迫使系统离线准备报告(提前准备或以"稍后再回来"作为回应)。

在ClickHouse中,"低延迟"是指在用户界面页面加载的同一时刻,可以无延迟地处理查询,而无需提前准备答案。换句话说,就是在线。

支持近似计算

ClickHouse提供了多种方法来交换准确性和性能:

  1. 用于近似计算不同值的数量、中位数和量化值的聚合函数;

  2. 根据部分(样本)数据运行查询并获得近似结果。在这种情况下,从磁盘获取的数据会按比例减少;

  3. 对有限数量的随机密钥而不是所有密钥进行聚合。在数据中密钥分布的特定条件下,这可以提供相当精确的结果,同时使用较少的资源。

自适应连接

ClickHouse可自适应地选择如何连接多个表,首选哈希连接算法,如果有多个大表,则退回到合并连接算法。

数据复制和数据完整性

ClickHouse使用异步多主复制。数据写入任何可用副本后,所有剩余副本都会在后台检索其副本。系统会在不同的副本上维护相同的数据。大多数故障后的恢复都是自动进行的,在复杂情况下则是半自动恢复。

性能指标

根据Yandex的内部测试结果,ClickHouse表现出了比同类可比较产品更优的性能。

单个大查询的吞吐量

吞吐量可以用每秒行数和每秒兆字节数来衡量。假设数据放在页面缓存中,那么在现代硬件上处理一个不太复杂的请求时,单台服务器处理未压缩数据的速度约为2-10GB/秒(在最简单的情况下,速度可高达30GB/秒)。如果数据无法放入页面缓存,速度取决于I/O子系统的速度和数据压缩率。例如,如果I/O子系统的数据读取速度为400MB/s,数据压缩比为3,则速度约为1.2GB/s。要获得以每秒行数为单位的速度,可以用每秒字节数为单位的速度除以查询中使用的列的总大小。例如,如果查询10字节的列,速度将在每秒1亿至2亿行之间。在分布式查询处理中,查询处理速度几乎呈线性增长,但前提是聚合或排序所产生的行数不多。

处理短查询的延迟时间

如果查询使用的是主键,且选择的行数(几十万行)和列数都不多,那么如果数据放在页面缓存中,延迟时间可能会小于50毫秒(最多以毫秒为单位)。否则,延迟取决于寻道操作的次数。如果使用磁盘驱动器,在负载不太重的系统中,延迟时间的计算公式为寻道时间(10毫秒)*查询中的列数*包含数据的块数。

处理大量短查询的吞吐量

在相同条件下,ClickHouse可以在单个服务器上每秒处理数百个(最多数千个)查询。由于这不是分析型数据库管理系统的典型应用场景,因此建议每秒处理查询的速度不超过100次。

数据的写入性能

建议分批插入至少1000行数据,或每秒不超过一次查询。从以制表符作为分隔符的文本文件向合并树表插入数据时,插入速度约为50-200MB/秒。如果插入的行大小约为1KB,速度将在每秒50,000-200,000行之间。如果行数较少,每秒行数的性能会更高(BC数据->每秒500,000行,Graphite数据->每秒1,000,000行)。为提高性能,可以并行执行多个INSERT查询,性能会呈线性增长。

缺点

  1. ClickHouse没有成熟的事务;

  2. ClickHouse无法以高速度和低延迟修改或删除已插入的数据。可以通过批量删除和更新来清理或修改数据,例如遵守GDPR;

  3. 由于索引稀疏,ClickHouse并不适合通过键检索单行的点查询。

应用领域

ClickHouse在Yandex.Metrica中有多种用途。它的主要任务是使用非汇总数据以在线模式创建报告。它使用由374台服务器组成的集群,在数据库中存储了超过20.3万亿行数据。在不考虑重复和复制的情况下,压缩数据量约为2PB。未压缩的数据量(TSV格式)约为17PB。

ClickHouse还可用于:

  • 存储来自Yandex.Metrica的会话重放数据。

  • 处理中间数据。

  • 使用分析功能创建全局报告。

  • 运行用于调试Yandex.Metrica引擎的查询。

  • 分析来自API和用户界面的日志。

  • ClickHouse至少在Yandex的其他服务中安装了十几套:垂直搜索、Market、Direct、商业分析、移动开发、AdFox、个人服务等。