Clickhouse-Notes

根据数据库处理的业务数据量和数据处理方式的不同,数据库分为OLTP(on-line transaction processing)和OLAP(On-Line Analytical Processing)两种。Clickhouse数据库由俄罗斯yandex搜索引擎公司开发并开源,最初定位于yandex内部的分析型数据库,符合OLAP数据库的实现特点。

 

OLTP Vs. OLAP

Oracle、MySQL等数据库都属于OLTP类型,即在线事务处理。 OLTP 数据库在处理请求和数据时需要高延迟,保证数据的完整性和一致性。这种数据库是面向终端用户的,需要7×24不间断的服务能力。

OLAP 的意思是在线分析数据处理。这种数据库需要存储海量但很少更新和修改的数据,主要用于多维历史数据分析和统计。对于这个需求,OLAP 数据库需要保证足够高的查询效率,至少 90% 的请求应该在短时间内返回。

另一方面,OLAP数据库并不直接面向最终客户,而是更注重数据吞吐量。它需要海量数据尽快持久化,为业务决策、战略定位与分析、个性化推荐等任务提供分析统计能力。因此,此类数据库中的查询一般是低频的。

 

ClickHouse主要特点

 

列式存储

列存储是基于OLAP数据库的特点,ClickHouse采用列式数据存储引擎。传统的行数据库在存储信息时将信息--记录在数据库中。以用户注册信息为例,行数据库会依次记录每个用户的姓名、职业、年龄等数据。当业务需要查找注册用户的职业或年龄分布时,数据库需要打开所有存储用户注册信息的文件,遍历所有数据行,依次挑出所有的职业和年龄信息进行汇总。这样,查询遍历的数据往往远大于所需的数据大小,会造成IO容量的严重浪费。

相比之下,列存储会将数据分成多个属性列,比如用户注册信息分为职业、年龄等多个属性,并根据这些属性列分别存储在多个文件中。这样,当查询需要获取某些属性的数据时,只需要找到对应的文件即可完成,大大节省了IO需求。

以包含1亿条数据的测试为例,简单的count查询在MySQL上耗时两分钟多,而在列式Clickhouse数据库上返回结果只用了不到一秒。通过学习ClickHouse,可以了解具体设计思路,如何实现如此高效率的提升。

 

DBMS功能

ClickHouse拥有完备的管理功能,称得上是一个DBMS(Database Management System, 数据库管理系统)。

  • DDL(数据定义语言): 可以动态地创建、修改或删除数据库、表和试图(view),无须重启服务。
  • DML(数据操作语言): 可以动态查询、插入、修改和删除数据。
  • 权限控制:可以按照用户粒度设置数据库或者表的操作权限,保证数据的安全性。
  • 数据备份与恢复:提供了数据备份导出与导入恢复机制,满足生产环境需求。
  • 分布式管理: 提供集群模式,能够自动管理多个数据库节点。

 

数据压缩

如果提升查询效率,最简单且有效的方法是减少扫描范围和数据传输的大小,而列式存储和数据压缩就可以实现以上两点。列式存储和数据压缩通常是伴生的,一般来说列式存储是数据压缩的前提。

数据中重复数据项越多,则压缩率越高;压缩率越高,则数据体量越小;而数据体量越小,则数据在网络中的传输越快,对网络带宽和磁盘IO的压力也就越小。

 

向量化执行

SIMD(Single Instruction Multiple Data),即单条指令操作多条数据。现代计算机中,通过数据并行以提高性能的一种实现方式(其他的还有指令级并行和线程级并行),它的原理是CPU寄存器层面实现数据的并行操作。

ClickHouse 目前利用 SSE4.2 指令集实现向量化执行(SIMD)。

 

关系模型与SQL查询

Clickhouse使用关系模型描述数据并提供了传统数据库的概念(数据库、表、视图和函数)。Clickhouse完全使用SQL作为查询语言,容易理解和学习。

 

多样化的表引擎

Clickhouse经存储进行了抽象,把存储引擎作为一层独立的接口。目前Clickhouse共拥有Mergetree、Memory、File和其他6大类20多种表引擎。

 

多线程与分布式

Clickhouse在数据库存取方面,既支持分区(纵向扩展,利用多线程原理),也支持分片(横向扩展,利用分布式原理)。

 

多主架构

Clickhouse采用Multi-Master多主架构,集群中的每个节点角色对等,客户端访问任意一个节点都能得到相同的效果。

对等的角色使系统架构变得更加简单,不用再分区主控节点、数据节点和计算节点,集群中的所有节点功能相同。

可以避免单点故障的问题,适用于多数据中心、异地多活的场景。

 

数据分片与分布式查询

Clickhouse提供了本地表(Local Table)与分布式表(distributed Table)的概念。一张本地表等同于一份数据的分片,分布式表本身不存储任何数据,它是本地表的访问代理,作用类似于分库中间件。借助分布式表,能够代理访问多个数据分片,从而实现分布式查询。