openGemini是一款面向物联网、车联网、工业互联网、运维监控等领域的开源分布式时序数据库。作为一款专门为时序场景设计并实现的数据库系统,openGemini具有卓越的读写性能和高效的数据分析能力。本文主要介绍openGemini源码的目录结构,以方便用户理解openGemini强大功能和突出性能背后的实现。
一、openGemini源码目录结构
openGemini主目录下包括上述这些关键目录,每个目录各自负责的功能如下:
- app:包括ts-meta、ts-monitor、ts-store、ts-sql各自的启动和通信模块的代码,以及单机版ts-server的启动等
- config:包含单机版和集群版的配置文件
- coordinator:包含DDL与DML操作有关系统配置、搭配open_src/influx/coordinator模块实现查询tag值等功能、包含数据写入的部分代码
- engine:包含ts-store和ts-sql的主要代码
- lib:各种通用工具和支持函数的实现
- open_src:依赖的第三方开源代码和工具
- scripts:系统启动脚本
- services:hierarchical和retention服务的初始化
- tests:包含基于gotest工具的测试文件
- yacc:词法分析和语法分析
此外,通过执行主目录下的build.py脚本将生成包含系统二进制包的build目录。
二、Engine目录结构
- common:通用数据结构定义,包括cursor接口等
- executor、op和optimizer:执行器和多路复用网络的实现,包括ts-sql中逻辑计划生成与优化、DAG的构建与调度、流水线执行、物理算子的实现等
- hybridqp:定义了执行器会用到的一些类型与方法
- immutable、mutable和index:存储引擎的主体实现,包括倒排索引、memTable、chunk、tssp、压缩算法等
- 其他源文件:定义了数据库实体的engine结构和初始化接口,存储层逻辑计划展开和各层级cursor的创建、 WAL的实现等
三、模块间调用关系
启动时模块间的调用关系
以ts-server为例,启动时模块间调用关系如图一所示,main函数中分别启动app模块下的ts-meta、ts-sql、ts-store并在各自启动流程中通过调用open_src/influx/httpd和engine/executor/spdy的有关接口开启服务监听。
图一 ts-server启动时模块间调用关系
数据写入的模块间调用关系
系统启动后,数据读写入口在open_src/influx/httpd模块中。数据写入时ts-sql模块调用关系如图二所示,open_src/influx模块完成数据解析等工作,进一步调用coordinator模块完成数据分发,coordinator模块通过调用lib/netstorage把数据序列化后发送到每个存储节点,lib调用到engine/executor/spdy的多路复用网络框架完成网络包发送。
图二 数据写入时ts-sql模块间调用关系
数据写入时ts-store模块间调用关系如图三所示。首先在engine/executor/spdy网络库中收到报文,在app/ts-store/transport模块中对应接口完成报文解析等工作后调用engine模块完成数据写入,写入时涉及engine/index模块和engine/mutable模块的索引写入和内存表写入。
图三 数据写入时ts-store模块间调用关系
数据查询的模块间调用关系
查询时ts-sql模块调用关系如图四所示。open_src/influx模块帮助完成一系列前置解析与检查,yacc模块完成词法和语法解析,open_src/influx/query和open_src/influx/coodinator构建逻辑计划、DAG并调度执行流水线,open_src/influx/coodinator模块进一步调用到engine/executor模块的有关接口来构建执行计划。
图四 查询时ts-sql模块间调用关系
查询时ts-store模块调用关系如图五所示。在engine/executor/transport中解析报文得到存储层逻辑计划,调用engine/executor模块构建对应的DAG并执行,在执行过程中完成调用common模块和engine/immutable模块有关接口获得查询的数据。
图五 查询时ts-store模块间调用关系
结束
本文以宏观地视角对openGemini源码的目录结构做了一个整体概述并通过模块间调用关系图的形式展示了系统启动和读写数据的大致流程,希望对大家阅读源码有所帮助。
openGemini 官网:http://www.openGemini.org
openGemini 开源地址:https://github.com/openGemini
openGemini 公众号: