本章将以CrateDB 3.3.6的版本为基础对CrateDB的源码做介绍,首先会对CrateDB各个包的功能做个整体介绍,然后会以一条insert语句的执行流程为例,结合源码介绍介绍crate执行过程,最后会对关键模块各找一个典型类进行详细的源码分析。
由于CrateDB代码庞大,大概有几十万行,所以仅能通过对各个关键模块找典型类的方式介绍,也很推荐大家在阅读完源码介绍之后,详细的去看CrateDB的全部源码。通过阅读CrateDB源码,大家可以比较清晰地了解一个高效的分布式HTAP数据库的实现方式,分布式节点之间的协同方式,对于大家设计类似架构有很强的参考意义。对CrateDB基本架构和相关术语不熟悉的朋友可以参考我前面的几篇博客,也可以随时在评论区讨论。
CrateDB代码结构
CrateDB是一个开源项目,遵从apache 2.0协议,这是一个比较开放的协议,比较方便大家基于他的源码做二次开发。项目地址位于github上:https://github.com/crate/crate,项目主页位于:https://crate.io 打开CrateDB的源码,我们可以发现存在以下关键目录:
app :与elastic search的app源码目录类似,用于服务bootstrap相关,包含一些config解析和启动异常类;
azure-discovery :云服务自动发现功能相关;
benchmarks:CrateDB性能测试相关;
blackbox :CrateDB黑盒测试相关;
blob:CrateDB大对象存储支持相关;
common:CrateDB底层工具类,有一部分代码来自于elastic search;
dex:CrateDB中数据库相关的数据结构实现,包括Row和Iterator;
dns-discovery:dns自动发现
devs:用其他语言开发的工具
docs:文档
enterprise:CrateDB企业feature相关
es:elastic search,这里是抽取了elastic search的部分源码
http:http通信相关
idea :idea支持
sql-parser:sql层的语法解析器,主要引入了antlr组件
sql:CrateDB sql层实现
ssl :安全认证相关
udc:收集一部分统计信息
其实CrateDB抽取了很多elastic search和lucene的源码,而不是以引入jar包的方式进行调用,这就代表对于elastic search和luene的版本升级和新特性,CrateDB可能难以做到及时的吸取和跟踪。
CrateDB的启动入口位于app/src/main/java/io/crate/bootstrap/CrateDB,主要是用定义的CrateNode代替ES Node代替bootstrap。
依赖注入
CrateDB使用guice实现依赖注入来构造和管理对象,guice是google开发的一个依赖注入框架,在elastic search中得到了广泛使用,相对于spring的依赖注入会更加灵活一些。
CrateDB SQL执行流程
本节以一条insert语句在CrateDB的执行流程为例,介绍CrateDB各个模块的workflow。对于一个正常运行的CrateDB进程,通过JDBC协议接收到如下一条insert语句的时候:
insert into