“ 摘要: 本文主要讲述如何阅读ClickHouse开源数据库代码的一些方式和技巧。主要内容如下:
ClickHouse开源库简介
搭建运行环境
针对于ClickHouse库提出问题
阅读开源代码的步骤
结论
”
01
—
ClickHouse开源库简介
ClickHouse是一个开源的列式数据库(DBMS),主要用于在线分析处理查询(OLAP),于2016年开源,采用C++开发。凭借优秀的性能,市场反应非常热烈。
从上面简介中提取关键字
数据库
列式存储
在线分析处理查询OLAP领域
C++开发
ClickHouse库的特点如下
支持完备的SQL操作
列式存储与数据压缩
向量化执行引擎
关系型模型
丰富的表引擎
并行处理
在线查询
数据分片
ClickHouse开源库痛点如下
不支持事务。
不擅长根据主键按行粒度进行查询。
不擅长按行更新、删除数据
通过简介我们知道了这个开源库是做什么的,主要特性是什么。那么对于这个开源库我们不了解具体实现的时候,我们需要试着使用它,看看它都有什么样的功能。
02
—
搭建运行环境
能搭建开源库的运行环境一定要搭建,因为通过可运行的开源库,我们可以很方便的知道,这个开源库是做什么的?有哪些功能?并且加强了对于整个项目的认知。
ClickHouse可以在任何具有x86_64,AArch64或PowerPC64LE CPU架构的Linux,FreeBSD或Mac OS X上运行。
官方预构建的二进制文件通常针对x86_64进行编译,并利用SSE 4.2指令集,因此,除非另有说明,支持它的CPU使用将成为额外的系统需求。下面是检查当前CPU是否支持SSE 4.2的命令:
$ grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
要在不支持SSE 4.2或AArch64,PowerPC64LE架构的处理器上运行ClickHouse,您应该通过适当的配置调整从源代码构建ClickHouse。
DEB安装包
建议使用Debian或Ubuntu的官方预编译deb软件包。运行以下命令来安装包:
$ sudo apt-get install apt-transport-https ca-certificates dirmngr$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4$ echo "deb https://repo.clickhouse.tech/deb/stable/ main/" | sudo tee \ /etc/apt/sources.list.d/clickhouse.list$ sudo apt-get update$ sudo apt-get install -y clickhouse-server clickhouse-client$ sudo service clickhouse-server start clickhouse-client
如果您想使用最新的版本,请用testing替代stable(我们只推荐您用于测试环境)。
RPM安装包
推荐使用CentOS、RedHat和所有其他基于rpm的Linux发行版的官方预编译rpm包。
首先,您需要添加官方存储库:
$ sudo yum install yum-utils$ sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG$ sudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64
如果您想使用最新的版本,请用testing替代stable(我们只推荐您用于测试环境)。prestable有时也可用。
然后运行命令安装:
$ sudo yum install clickhouse-server clickhouse-client
通过上面两种方式就可以搭建ClickHouse的环境了,让我们一起来使用他吧。
通过使用和对于这个开源库的了解。提出我们想要知道的问题,方便后面我们带着问题去阅读开源项目。
03
—
针对于ClickHouse库提出问题
首先看一下ClickHouse源码这么大体工作量, 理解开发一个数据库, 工作量在哪些主要的地方。大致分为下面几大问题:
用户怎么下发SQL到服务器后台,后台是如何接收用户的SQL的?(会话管理器)
用户下发过来的SQL是字符串,ClickHouse是如何转成自己的格式的?自己的格式又是什么?(SQL解析器)
用户访问某些库、表等数据库对象是如何控制权限的?(数据库权限管理器)
表、用户等数据库对象的元数据是如何处理的?(数据库元数据管理器)
数据库的逻辑计划是如何生成的?逻辑计划都做了哪些优化方案?(SQL计划生成器)
集群中的主节点是如何和从节点通信从而完成一个SQL的计算任务?(SQL调度器)
数据库的物理计划是如何处理的?(SQL执行器)
数据库的表的数据是如何存储的?存储在哪里?按照什么格式存储?(数据存储器)
集群间节点通信采用什么方案?优化方式有哪些?如何保证传输的可靠性?(网络传输管理器)
数据库支持哪些索引?索引的具体实现方式是什么?(数据库索引)
数据库是如何控制并发的?是如何控制内存资源、CPU资源来避免木桶效应?(数据库资源管理)
04
—
阅读开源代码的步骤
通过上面的步骤,我们就要真正的阅读开源代码了,那么我们把阅读开源代码也分为几个步骤
阅读代码工具的选择
开源库源码目录分解
网络资料的搜索
摸清主线,避免过早陷入一些旁枝末节
重视日志信息
阅读源码过程中,同步绘制时序图,固化对流程的理解
阅读源码过程中,不断解决之前提出的问题
看开源库中的Issues问题列表,看看之前有哪些问题和解决方案是什么?
阅读代码工具的选择
推荐使用Understand,这个工具可以很直观的生成调用关系图、类图、时序图。是个非常强大的静态分析工具。
开源库源码目录分解
优秀的开源库,从源码的目录就可以很清晰的了解整个程序的架构是什么?有哪些非常重要的组件?
程序入口
上面是数据库非常重要的功能,那么ClickHouse的程序入口是什么呢?
dbms/programs目录说明
benchmark目录ClickHouse benchmark测试工具
client目录ClickHouse客户端命令行工具
compressor目录ClickHouse数据压缩和解压的工具
copier目录ClickHouse数据迁移工具
extract-from-config目录获取配置项工具
format目录ClickHouse数据格式化工具
local目录快速处理存储表的本地文件的工具
obfuscator目录表数据混淆工具
odbc-bridge目录odbc链接的工具
server目录ClickHouse服务器相关的代码
dbms/src目录说明
Access目录功能数据库关于权限控制、资源管理等代码
AggregateFunctions目录功能数据库关于聚集函数功能的代码
Client目录网络关于客户端的代码
Columns目录内存的数据结构中关于列的代码
Common目录数据库共用独立的代码
Compression目录数据压缩处理逻辑的代码
Core目录核心模块,包括Block、Field、ColumnWithNameAndType、Row定义,SQL标准、DB引擎、DB设置等等
DataBases目录数据库,包含数据库中的操作如表迭代器、库信息等等
DataStreams目录输入输出流操作管理代码
DataType目录数据类型定义相关代码
Dictionaries目录Dictionary引擎的处理代码
Disks目录磁盘读写操作管理代码
Formats目录格式转化相关代码
Functions目录系统内置函数相关代码
Interpreters目录SQL语句的翻译和执行相关代码
IO目录内核IO相关的代码
Parsers目录语句解析,构造AST,遍历AST元素相关代码
Processors目录query执行引擎相关代码
Storages目录存储管理,如分布式表数据分发、MergeTree分布式存储模块等等
TableFunctions目录表函数相关逻辑的处理代码
05
—
结论
前面我们已经把一个非常大的开源库ClickHouse的各个目录都介绍了,那么后续的文章就从我们理解的数据库常用的SQL执行流程来揭开ClickHouse神秘的面纱并且讲述后续代码阅读的产出物。