Clickhouse的架构设计

最近在读《ClickHouse原理解析与应用》,把一些重点的东西整理出来分享。

1、Column和Field

Clickhouse中最基础的单位是Column和Field。

  • 在Clickhouse中Column对象分为接口和实现两个部分,IColumn接口对象中,定义了对数据操作的各种关系运算的方法。

  • Field对象代表一个单值。

2、DateType

DateType负责数据的序列化和反序列化工作。但是DateType不直接负责数据的读取,而是由Column或Field对象获取。

3、Block和Block流

Block对象的本质是由数据对象、数据类型和列名称组成的三元组,即Column、DataType及列名称字符串。在具体实现中,Block并没有直接聚合Column和DataType对象,而是通过ColumnWithTypeAndName对象进行间接引用。

IBlockInputStream负责数据的读取和关系元算,IBlockOutputStream负责将数据输出到下一环节。

4、Table

Clikchouse底层使用IStorage接口指代数据表。不同引擎会由不同的子类去实现。在数据查询时,IStorage负责根据AST查询语法的指示要求,返回指定列的原始数据。后续对数据的进一步加工、计算和过滤,则会统一交由Interpreter解释器对象处理。

5、Parser与Interpreter

Parser分析器负责创建AST对象。Interpreter解释器则负责解释AST,并进一步创建查询的执行管道。

6、Functions与Aggregate Functions

  • 普通函数由IFunction接口定义,函数是没有状态的,函数效果作用于每行数据之上。执行的时候是采用向量化(可以简单的看成是循环的优化)(CPU层面实现数据的并行操作)的方式直接作用于一整列数据。

  • 聚合函数由IAggregateFunction接口定义,聚合函数有状态。聚合函数的状态支持序列化与反序列化,所以能够在分布式节点之间进行传输,以实现增量计算。

7、Cluster与Replication

Clickhouse集群由分片组成,分片又通过副本组成。

Clickhouse集群特别之处:

  • CH的一个节点只能拥有一个1个分片

  • 分片只是一个逻辑概念,其物理承载还副本


猜你喜欢

转载自blog.csdn.net/sileiH/article/details/113701324