什么是ClickHouse?
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。
在传统的行式数据库系统中,数据按如下顺序存储:处于同一行中的数据总是被物理的存储在一起。
Id Device_code Title Cmd Log_time
1 89354350662 read 500 2018-10-18 05:19:20
2 90329509958 Contact 501 2018-10-18 08:10:20
3 89953706054 Mission 102 2018-10-18 07:38:00
常见的行式数据库系统有: MySQL、Oracle、 SQL Server。 在列式数据库系统中,数据按如下的顺序存储:
Id 1 2 3
Device_code 89354350662 90329509958 89953706054
Title read Contact Mission
Cmd 500 501 102
Log_time 2018-10-18 05:19:20 2018-10-18 08:10:20 2018-10-18 07:38:00
该示例中只展示了数据在列式数据库中数据的排列顺序。 对于存储而言,列式数据库总是将同一列的数据存储在一起,不同列的数据也总是分开存储。
常见的列式数据库有: hbase、 Google Dremel、 Drill、 Druid。
不同的存储方式适合不同的场景,这里的查询场景包括: 进行了哪些查询,多久查询一次以及各类查询的比例; 每种查询读取多少数据————行、列和字节;读取数据和写入数据之间的关系;使用的数据集大小以及如何使用本地的数据集;是否使用事务,以及它们是如何进行隔离的;数据的复制机制与数据的完整性要求;每种类型的查询要求的延迟与吞吐量等等。
OLAP场景的关键特征
- 大多数是读请求
- 数据总是以相当大的批(> 1000 rows)进行写入
- 不修改已添加的数据
- 每次查询都从数据库中读取大量的行,但是同时又仅需要少量的列
- 宽表,即每个表包含着大量的列
- 较少的查询(通常每台服务器每秒数百个查询或更少)
- 对于简单查询,允许延迟大约50毫秒
- 列中的数据相对较小: 数字和短字符串(例如,每个URL 60个字节)
- 处理单个查询时需要高吞吐量(每个服务器每秒高达数十亿行)
- 事务不是必须的
- 对数据一致性要求低
- 每一个查询除了一个大表外都很小
- 查询结果明显小于源数据,换句话说,数据被过滤或聚合后能够被盛放在单台服务器的内存中
面向列的数据库更适合于OLAP方案(对于大多数查询,处理速度至少提高了100倍),原因如下:
1 对于分析查询,只需要读取少量的列。在面向列的数据库中,您只能读取所需的数据。例如,如果您需要100列中的5列,则I/O可能会减少20倍。
2 由于数据是以数据包的形式读取的,因此压缩比较容易。列中的数据也更容易压缩。这进一步减少了I/O量。
3 由于减少的I/O,更多的数据适合在系统缓存中。
ClickHouse的显著特性
1.真正的面向列的DBMS
2.数据高效压缩
3.磁盘存储的数据
4.多核并行处理
5.在多个服务器上分布式处理
6.SQL语法支持
7.向量化引擎
8.实时数据更新
9.索引
10.适合在线查询
11.支持近似预估计算
12.支持嵌套的数据结构,支持数组作为数据类型
13.支持限制查询复杂性以及配额
14.复制数据复制和对数据完整性的支持
我们来看看其中的一些功能:
1.面向列的DBMS
在一个真正的面向列的DBMS中,没有任何额外的数据会被存在value中。即使在未压缩的情况下,紧凑地存储数据是非常重要的,因为解压缩的速度(CPU使用率)主要取决于未压缩数据的量。
2.数据压缩
一些面向列的DBMS(InfiniDB CE和MonetDB)不使用数据压缩。但是,数据压缩确实提高了性能。clickhouse提供了两种:LZ4和ZSTD LZ4在速度上会更快,但是压缩率较低,ZSTD正好相反。尽管ZSTD比LZ4慢,但是相比传统的压缩方式Zlib,无论是在压缩效率还是速度上,都可以作为Zlib的替代品。
3.磁盘存储的数据
许多面向列的DBMS(SAP HANA和Google PowerDrill)只能在内存中工作。但即使在数千台服务器上,内存也太小,无法在Yandex.Metrica中存储所有浏览量和会话。ClickHouse设计用于常规硬盘驱动器,这意味着每GB数据存储的成本很低
4.多核并行处理
多核多节点并行化大型查询。会获取到集群的所有可用资源
5.在多个服务器上分布式处理
上面列出的列式DBMS几乎都不支持分布式处理。在ClickHouse中,数据可以驻留在不同的分片上。每个分片可以是用于容错的一组副本。查询在所有分片上并行处理。
6.SQL支持
ClickHouse支持基于SQL的声明性查询语言,在许多情况下与SQL标准相同。支持的查询包括GROUP BY,ORDER BY,FROM,IN和JOIN查。不支持关联子查询和窗口函数。子查询在FROM,IN,JOIN子句中被支持;
7.向量化引擎
数据不仅按列存储,而且由矢量(列的部分)进行处理。这使我们能够实现高CPU性能。
8.索引
通过主键对物理数据进行物理排序,可以提取具有低延迟(小于几十毫秒)的特定值或值范围的数据。
9.支持在线查询
我们使用该系统作为Web界面的后端。可以无延迟实时地处理查询,前端即时显示
10.数据复制和对数据完整性的支持。
使用异步多主复制。写入任何可用的副本后,数据将分发到所有剩余的副本。系统在不同的副本上保持相同的数据。数据在失败后自动恢复。
ClickHouse目前未实现功能
1.无事务处理。
2.缺乏全面的UPDATE / DELETE实现