【ClickHouse内核】源码阅读策略

目录

ClickHouse开源库简介

搭建运行环境

DEB安装包

RPM安装包

针对于ClickHouse库提出问题

阅读开源代码的步骤

阅读代码工具的选择

开源库源码目录分解

程序入口

结论


ClickHouse开源库简介

ClickHouse是一个开源的列式数据库(DBMS),主要用于在线分析处理查询(OLAP),于2016年开源,采用C++开发。凭借优秀的性能,市场反应非常热烈。

 

从上面简介中提取关键字

  • 数据库
  • 列式存储
  • 在线分析处理查询OLAP领域
  • C++开发

 

ClickHouse库的特点如下

  • 支持完备的SQL操作
  • 列式存储与数据压缩
  • 向量化执行引擎
  • 关系型模型
  • 丰富的表引擎
  • 并行处理
  • 在线查询
  • 数据分片

 

ClickHouse开源库痛点如下

  • 不支持事务。
  • 不擅长根据主键按行粒度进行查询。
  • 不擅长按行更新、删除数据

 

通过简介我们知道了这个开源库是做什么的,主要特性是什么。那么对于这个开源库我们不了解具体实现的时候,我们需要试着使用它,看看它都有什么样的功能。

 

搭建运行环境

能搭建开源库的运行环境一定要搭建,因为通过可运行的开源库,我们可以很方便的知道,这个开源库是做什么的?有哪些功能?并且加强了对于整个项目的认知。

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的环境了,让我们一起来使用他吧。

通过使用和对于这个开源库的了解。提出我们想要知道的问题,方便后面我们带着问题去阅读开源项目。

 

针对于ClickHouse库提出问题

首先看一下ClickHouse源码这么大体工作量, 理解开发一个数据库, 工作量在哪些主要的地方。大致分为下面几大问题:

  • 用户怎么下发SQL到服务器后台,后台是如何接收用户的SQL的?(会话管理器)
  • 用户下发过来的SQL是字符串,ClickHouse是如何转成自己的格式的?自己的格式又是什么?(SQL解析器)
  • 用户访问某些库、表等数据库对象是如何控制权限的?(数据库权限管理器)
  • 表、用户等数据库对象的元数据是如何处理的?(数据库元数据管理器)
  • 数据库的逻辑计划是如何生成的?逻辑计划都做了哪些优化方案?(SQL计划生成器)
  • 集群中的主节点是如何和从节点通信从而完成一个SQL的计算任务?(SQL调度器)
  • 数据库的物理计划是如何处理的?(SQL执行器)
  • 数据库的表的数据是如何存储的?存储在哪里?按照什么格式存储?(数据存储器)
  • 集群间节点通信采用什么方案?优化方式有哪些?如何保证传输的可靠性?(网络传输管理器)
  • 数据库支持哪些索引?索引的具体实现方式是什么?(数据库索引)
  • 数据库是如何控制并发的?是如何控制内存资源、CPU资源来避免木桶效应?(数据库资源管理)

 

阅读开源代码的步骤

通过上面的步骤,我们就要真正的阅读开源代码了,那么我们把阅读开源代码也分为几个步骤

  • 阅读代码工具的选择
  • 开源库源码目录分解
  • 网络资料的搜索
  • 摸清主线,避免过早陷入一些旁枝末节
  • 重视日志信息
  • 阅读源码过程中,同步绘制时序图,固化对流程的理解
  • 阅读源码过程中,不断解决之前提出的问题
  • 看开源库中的Issues问题列表,看看之前有哪些问题和解决方案是什么?

 

阅读代码工具的选择

推荐使用Understand,这个工具可以很直观的生成调用关系图、类图、时序图。是个非常强大的静态分析工具。

 

开源库源码目录分解

优秀的开源库,从源码的目录就可以很清晰的了解整个程序的架构是什么?有哪些非常重要的组件?

 

程序入口

上面是数据库非常重要的功能,那么ClickHouse的程序入口是什么呢?

【ClickHouse内核】源码阅读策略_第1张图片

 

dbms/programs目录说明

【ClickHouse内核】源码阅读策略_第2张图片

  • benchmark目录ClickHouse benchmark测试工具
  • client目录ClickHouse客户端命令行工具
  • compressor目录ClickHouse数据压缩和解压的工具
  • copier目录ClickHouse数据迁移工具
  • extract-from-config目录获取配置项工具
  • format目录ClickHouse数据格式化工具
  • local目录快速处理存储表的本地文件的工具
  • obfuscator目录表数据混淆工具
  • odbc-bridge目录odbc链接的工具
  • server目录ClickHouse服务器相关的代码

 

dbms/src目录说明

【ClickHouse内核】源码阅读策略_第3张图片

  • 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目录表函数相关逻辑的处理代码

 

结论

前面我们已经把一个非常大的开源库ClickHouse的各个目录都介绍了,那么后续的文章就从我们理解的数据库常用的SQL执行流程来揭开ClickHouse神秘的面纱并且讲述后续代码阅读的产出物。

 

分享大数据行业的一些前沿技术和手撕一些开源库的源代码
微信公众号名称:技术茶馆
微信公众号ID    :    Night_ZW

你可能感兴趣的:(ClickHouse内核,源码分析,数据库)