暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ClickHouse架构设计

Ty3306 2022-12-26
1138

ClickHouse架构设计



1.Column和Field

Column和Field是ClickHouse数据最基础的映射单元。ClickHouse按列存储数据,内存中的一列数据由一个Column对象表示。在大多数情况下,ClickHouse都会以整列的方式操作数据,但如果需要操作某列中单个具体的数值,就需要使用Field对象,Field对象代表一个单值。

Column对象采用泛化设计思路,对象分为接口和实现两个部分。接口定义了对数据进行各种关系运算的方法;而这些方法的具体实现,根据数据类型的不同,由相应的对象实现。

Field对象使用了聚合的设计模式,在Field对象内部聚合了Null、UInt64、String和Array等多种数据类型和对应的处理逻辑。

2.DataType
数据的序列化和反序列化工作由DataType负责,虽然DataType负责序列化相关工作,但DataType并不直接负责数据的读取,而是转由从Column或者Field对象获取数据。

虽然Column和Field组成了数据的基本映射单元,但在实际操作中还缺少一些必要信息,如数据的类型和列的名称,于是ClickHouse设计了Block对象,ClickHouse内部的数据操作是面向Block对象进行的,Block对象可以看作是数据表的子集。

Block对象的本质是由数据对象(Column)、数据类型(DataType)和列名称(列名称字符串)组成的三元组。Column提供了数据的读取能力,DataType提供了序列化和反序列化,Block在这些对象的基础上实现了进一步的抽象和封装,从而简化了整个使用的过程,仅通过Block对象就能完成一系列的数据操作。

3.Function
ClickHouse主要提供两类函数:普通函数和聚合函数。

普通函数由IFunction接口定义,内部有很多函数的实现,如FunctionFormatDateTime,FunctionSubstring等。普通函数是没有状态的,函数效果作用于每行数据之上,在函数执行过程中,并不会逐行计算,而是采用向量化的方式直接作用与一整列数据。

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

4.Storage

ClickHouse在数据表的底层设计中并没有所谓的Table对象,它直接使用IStorage接口指代数据表。

表引擎是ClickHouse的一个显著特性,不同的表引擎由不同的子类实现,例如IStorageSystemOneBlock(系统表引擎),StorageMergeTree(合并树表引擎)和StorageTinyLog(日志表引擎)等。

IStorage接口定义了DDL(如alter、rename、drop等)、read和write方法,分别负责数据的定义、查询与写入。在数据查询时,IStorage负责根据AST(抽象语法树)查询语句的要求,返回指定列的原始数据。

5.Parser和Intercepter
Parser和Intercepter是非常重要的两组接口,Parser分析器负责创建AST对象;Intercepter解释器负责解释AST,并进一步创建查询的执行管道。它们与IStorage一起串联了整个数据查询过程。

Parser分析器可以将一条SQL语句解析成AST语法树的形式,不同的SQL语句,会由不同的Parser实现类解析。
Intercepter解释器对AST进行解释,然后创建查询的执行通道。
IStorage负责根据AST查询语句的指示要求,返回指定列的原始数据。
通过Block对象完成一系列的数据操作。
6.Server
服务器实现了多个不同的接口:

(1)一个用于任何外部客户端的 HTTP 接口。

(2)一个用于本机 ClickHouse 客户端以及在分布式查询执行中跨服务器通信的 TCP 接口。

(3)一个用于传输数据以进行拷贝的接口。

整个流程:

ClickHouse Server负责接收客户端提交的SQL查询语句
然后交给Parser将SQL语句解析成AST语法树。
Intercepter解释器负责解释AST,并进一步创建查询的执行管道。
IStorage负责根据AST(抽象语法树)查询语句的要求,返回指定列的原始数据。
ClickHouse内部的数据操作是面向Block对象进行的(由数据对象(Column)、数据类型(DataType)和列名称(列名称字符串)组成的三元组)
Column提供了数据的读取能力,DataType提供了序列化和反序列化
7.Data Streams
ClickHouse集群中,一张数据表可以有多个分片,而每个分片都拥有自己的副本。

ClickHouse的1个节点只能拥有1个分片,也就是说如果实现1分片、1副本,则至少需要部署2个服务节点。
分片只是一个逻辑概念,其物理承载还是由副本承担。

原文链接:https://blog.csdn.net/dajiangtai007/article/details/126018331

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论