《Clickhouse原理解析与应用实践》1~6章重点回顾章节-读书笔记
这里只列举前6章节的内容,因为后面章节的内容,需要对前面的知识内容有一定的熟悉后,才好理解,这里列出来无意义。
前6章节就能够大致了解ClickHouse整体的存储、读取、写入相关的设计实现。
基于下面的笔记,个人觉得比较重要的几个知识点概述:
- ClickHouse采用多主架构,集群内节点角色对等,天然规避单点问题
- ClickHouse支持物理视图,源表的更新会同步到物理视图(除了删除操作,物理视图会保留源表被删除的数据)
- ClickHouse的
RENAME
只支持单个节点内的数据表移动(集群间节点不支持) - ClickHouse仅MergeTree系列表索引支持数据分区
- ClickHouse以分区目录为单位进行数据删除与修改(Mutation),该异步操作不支持事务,无法回滚。被删除的数据在下次合并动作被触发时才会真正物理删除。
- ClickHouse每次
INSERT
都会生成新的分区目录(写入同一个分区也会生成不同的分区目录),后台任务会定时对多个相同分区的分区目录进行合并(或手动执行optimize
指令) - ClickHouse的一级索引是稀疏索引实现,常驻内存
- ClickHouse的二级索引是跳数索引,由数据的聚合信息构建而成
- ClickHouse的写入过程大致流程,先生成分区目录,后按照
index_granularity
索引粒度,生成primary.idx
一级索引(如果声明了二级索引,还会创建二级索引文件),每一列字段的.mrk
数据标记和.bin
压缩数据文件。 - ClickHouse的查询过程大致流程,先通过
minmax.idx
分区索引寻找需查询的分区,再通过primary.idx
一级索引、skip_idx.idx
二级索引筛选数据查询的范围,然后通过.mrk
数据标记查找索引对应的.bin
数据压缩文件,解压后读取数据。
个人觉得平时可重点回顾的章节
- 《Clickhouse原理解析与应用实践》1~6章重点回顾章节-读书笔记
-
- 2.1.1 完备的DBMS功能
- 2.1.3 向量化执行引擎
- 2.1.6 多线程与分布式
- 2.1.7 多主架构
- 2.2 ClickHouse的架构设计
- 4.2.4 临时表
- 4.2.5 分区表
- 4.2.6 视图
- 4.3.5 移动数据表
- 4.4.5 卸载与装载分区
- 4.7 数据的删除与修改
- 6.2.3 分区目录的合并过程
- 6.3 一级索引
- 6.3.1 稀疏索引
- 6.3.3 索引数据的生成规则
- 6.3.4 索引的查询过程
- 6.4 二级索引
- 6.4.1 granularity与index_granularity的关系
- 6.4.2 跳数索引的类型
- 6.5.1 各列独立存储
- 6.5.2 压缩数据块
- 6.6 数据标记
- 6.6.1 数据标记的生成规则
- 6.6.2 数据标记的工作方式
- 6.7.1 写入过程
- 6.7.2 查询过程
- 6.7.3 数据标记与压缩数据块的对应关系
2.1.1 完备的DBMS功能
- 大致了解ClickHouse的能力,判断业务中是否适用ClickHouse
ClickHouse拥有完备的管理功能,所以它称得上是一个DBMS(Database Management System,数据库管理系统),而不仅是一个数据库。作为一个DBMS,它具备了一些基本功能,如下所示。
- DDL(数据定义语言):可以动态地创建、修改或删除数据库、表和视图,而无须重启服务。
- DML(数据操作语言):可以动态查询、插入、修改或删除数据。
- 权限控制:可以按照用户粒度设置数据库或者表的操作权限,保障数据的安全性。
- 数据备份与恢复:提供了数据备份导出与导入恢复机制,满足生产环境的要求。
- 分布式管理:提供集群模式,能够自动管理多个数据库节点。
2.1.3 向量化执行引擎
- ClickHouse通过硬件支持的向量化指令,实现数据并行操作。
一个实用的经验告诉我们,存储媒介距离CPU越近,则访问数据的速度越快。
ClickHouse利用SSE4.2指令集实现向量化执行。
2.1.6 多线程与分布式
相比基于底层硬件实现的向量化执行SIMD,线程级并行通常由更高层次的软件层面控制。现代计算机系统早已普及了多处理器架构,所以现今市面上的服务器都具备良好的多核心多线程处理能力。由于SIMD不适合用于带有较多分支判断的场景,ClickHouse也大量使用了多线程技术以实现提速,以此和向量化执行形成互补。
在各服务器之间,通过网络传输数据的成本是高昂的,所以相比移动数据,更为聪明的做法是预先将数据分布到各台服务器,将数据的计算查询直接下推到数据所在的服务器。
ClickHouse在数据存取方面,既支持分区(纵向扩展,利用多线程原理),也支持分片(横向扩展,利用分布式原理),可以说是将多线程和分布式的技术应用到了极致。
2.1.7 多主架构
HDFS、Spark、HBase和Elasticsearch这类分布式系统,都采用了Master-Slave主从架构,由一个管控节点作为Leader统筹全局。
而ClickHouse则采用Multi-Master多主架构,集群中的每个节点角色对等,客户端访问任意一个节点都能得到相同的效果。
这种多主的架构有许多优势,例如对等的角色使系统架构变得更加简单,不用再区分主控节点、数据节点和计算节点,集群中的所有节点功能相同。所以它天然规避了单点故障的问题,非常适合用于多数据中心、异地多活的场景。
2.2 ClickHouse的架构设计
篇幅较长,建议阅读书籍原文。该章节大致介绍了ClickHouse代码的数据结构设计。
ClickHouse按列存储数据,内存中的一列数据由一个Column对象表示。
下图中从下到上,
- Columns:ClickHouse数据存储结构
- DataTypes:负责数据的序列化/反序列化,读取数据前需将其转换成Column或Field对象
- Functions:普通函数和聚合函数,函数执行同样采用向量化方式直接作用一列数据
- Storages:数据表底层实现中没有Table对象,取而代之的是IStorage接口,代指数据表
- Interperters:解释器,解释AST,构造查询执行通道
- Parsers:分析器,创建AST(抽象语法树)对象
- Server:ClickHouse服务实例
4.2.4 临时表
CREATE TEMPORARY TABLE [IF NOT EXISTS] table_name (
name1 [type] [DEFAULT|MATERIALIZED|ALIAS expr],
name2 [type] [DEFAULT|MATERIALIZED|ALIAS expr],
)
- 临时表生命周期为整个会话,只支持Memory表引擎(内存中存储数据),会话结束时销毁数据表。
- 临时表不数据任何数据库,其优先级大于普通表,当两张数据表名称相同时,会优先读取临时表的数据。
4.2.5 分区表
目前仅**合并树(MergeTree)**家族系列的表引擎支持数据分区。
CREATE TABLE partition_v1 (
ID String,
URL String