这里只列举前6章节的内容,因为后面章节的内容,需要对前面的知识内容有一定的熟悉后,才好理解,这里列出来无意义。
前6章节就能够大致了解ClickHouse整体的存储、读取、写入相关的设计实现。
基于下面的笔记,个人觉得比较重要的几个知识点概述:
RENAME只支持单个节点内的数据表移动(集群间节点不支持)INSERT都会生成新的分区目录(写入同一个分区也会生成不同的分区目录),后台任务会定时对多个相同分区的分区目录进行合并(或手动执行optimize指令)index_granularity索引粒度,生成primary.idx一级索引(如果声明了二级索引,还会创建二级索引文件),每一列字段的.mrk数据标记和.bin压缩数据文件。minmax.idx分区索引寻找需查询的分区,再通过primary.idx一级索引、skip_idx.idx 二级索引筛选数据查询的范围,然后通过.mrk数据标记查找索引对应的.bin数据压缩文件,解压后读取数据。ClickHouse拥有完备的管理功能,所以它称得上是一个DBMS(Database Management System,数据库管理系统),而不仅是一个数据库。作为一个DBMS,它具备了一些基本功能,如下所示。
一个实用的经验告诉我们,存储媒介距离CPU越近,则访问数据的速度越快。

ClickHouse利用SSE4.2指令集实现向量化执行。
相比基于底层硬件实现的向量化执行SIMD,线程级并行通常由更高层次的软件层面控制。现代计算机系统早已普及了多处理器架构,所以现今市面上的服务器都具备良好的多核心多线程处理能力。由于SIMD不适合用于带有较多分支判断的场景,ClickHouse也大量使用了多线程技术以实现提速,以此和向量化执行形成互补。
在各服务器之间,通过网络传输数据的成本是高昂的,所以相比移动数据,更为聪明的做法是预先将数据分布到各台服务器,将数据的计算查询直接下推到数据所在的服务器。
ClickHouse在数据存取方面,既支持分区(纵向扩展,利用多线程原理),也支持分片(横向扩展,利用分布式原理),可以说是将多线程和分布式的技术应用到了极致。
HDFS、Spark、HBase和Elasticsearch这类分布式系统,都采用了Master-Slave主从架构,由一个管控节点作为Leader统筹全局。
而ClickHouse则采用Multi-Master多主架构,集群中的每个节点角色对等,客户端访问任意一个节点都能得到相同的效果。
这种多主的架构有许多优势,例如对等的角色使系统架构变得更加简单,不用再区分主控节点、数据节点和计算节点,集群中的所有节点功能相同。所以它天然规避了单点故障的问题,非常适合用于多数据中心、异地多活的场景。
篇幅较长,建议阅读书籍原文。该章节大致介绍了ClickHouse代码的数据结构设计。
ClickHouse按列存储数据,内存中的一列数据由一个Column对象表示。
下图中从下到上,

CREATE TEMPORARY TABLE [IF