摘要:
从整体上梳理STONEDB的架构设计, 细分到具体的类级别, 但是不深入具体的函数逻辑的层次。
目的在于建立整体的抽象和最高层的视角, 用来为下一步各个模块的突破。
整体模块架构:
宏观架构(取自infobright)
关键概念:
- 插件式引擎
- 知识网格: Knowledge Node
- DP: DATA Pack
- DPN: DATA Pack Node
顶层引擎代码目录模块:
代码目录模块说明:
- async: 异步包装, 封装协程概念. (未启用)
- base: 基础模块
- core:系统接口相关, 包含线程封装,文件IO, 缓存模块等
- fmt: 格式化字符串相关
- net: 网络socket相关
- util: 常用工具模块, 包含日志, 以及其他常用的工具,例如参数解析和元组包装
- common: 常用模块, 包含日期模块,以及异常接口模块
- compress: 压缩mok, 包含一些压缩算法的实现
- core: 核心功能模块, 包含主要核心业务功能, 是引擎的核心
- exporter: export接口, 主要是一些监控数据
- handler: 与mysql的插件式接口交互的模块, 实现mysql的handler接口
- index: 物理数据的索引, 当前是与rocksdb的接口配合使用
- loader: 包含load解析模块, 读缓存模块, 以及值缓存模块
- mm: 内存管理模块
- system: 系统模块, 包含文件系统, 网络数据流, 内存缓冲池, 以及管道模块
- types: 具体的物理存储的数据类型
- util: 工具模块, 包含日志, 线程池, 定时器, crc校验及位图工具等
- vc: 虚拟列, 与查询时的类型有关. 并非所有虚拟列都与物理列关联
数据目录结构说明:
数据文件名定义:
defs.h
constexpr const char *TIANMU_EXT = ".tianmu";
constexpr uint32_t TABLE_DATA_VERSION = 3;
constexpr const char *TABLE_DESC_FILE = "TABLE_DESC";
constexpr const char *TABLE_VERSION_FILE = "VERSION";
constexpr const char *TABLE_VERSION_FILE_TMP = "VERSION.tmp";
constexpr const char *TABLE_VERSION_PREFIX = "V.";
constexpr uint32_t COL_FILE_MAGIC = 0x004c4f43; // "COL"
constexpr const char *COLUMN_DIR = "columns";
constexpr const char *COL_DICT_DIR = "dict";
constexpr const char *COL_FILTER_DIR = "filters";
constexpr const char *COL_FILTER_BLOOM_DIR = "bloom";
constexpr const char *COL_FILTER_CMAP_DIR = "cmap";
constexpr const char *COL_FILTER_HIST_DIR = "hist";
constexpr const char *COL_KN_FILE = "KN";
constexpr const char *COL_META_FILE = "META";
constexpr const char *COL_DN_FILE = "DN";
constexpr const char *COL_DATA_FILE = "DATA";
constexpr const char *COL_VERSION_DIR = "v";
以tpch.lineitem表为例
整体数据目录结构:
.
├── columns
│ ├── 0 -> /stonedb57/install/data/tianmu_data/16.0
│ ├── 1 -> /stonedb57/install/data/tianmu_data/16.1
│ ├── 10 -> /stonedb57/install/data/tianmu_data/16.10
│ ├── 11 -> /stonedb57/install/data/tianmu_data/16.11
│ ├── 12 -> /stonedb57/install/data/tianmu_data/16.12
│ ├── 13 -> /stonedb57/install/data/tianmu_data/16.13
│ ├── 14 -> /stonedb57/install/data/tianmu_data/16.14
│ ├── 15 -> /stonedb57/install/data/tianmu_data/16.15
│ ├── 2 -> /stonedb57/install/data/tianmu_data/16.2
│ ├── 3 -> /stonedb57/install/data/tianmu_data/16.3
│ ├── 4 -> /stonedb57/install/data/tianmu_data/16.4
│ ├── 5 -> /stonedb57/install/data/tianmu_data/16.5
│ ├── 6 -> /stonedb57/install/data/tianmu_data/16.6
│ ├── 7 -> /stonedb57/install/data/tianmu_data/16.7
│ ├── 8 -> /stonedb57/install/data/tianmu_data/16.8
│ └── 9 -> /stonedb57/install/data/tianmu_data/16.9
├── TABLE_DESC
├── V.630c75a90000274c
└── VERSION -> V.630c75a90000274c
单个列的数据文件说明:
.
├── DATA
├── DN
├── filters
│ ├── bloom
│ ├── cmap
│ └── hist
├── META
└── v
└── 630c75a90000274c
- DN: DPN文件, data pack node, pack的元数据
/*-------------------------------
| DPN | DPN | DPN | DPN | DPN |
--------------------------------*/
- DATA: 列的数据文件
/*-----------------------------------
| PACK | PACK | PACK | PACK | PACK |
------------------------------------*/
- V/xid:
- 当前xid事务ID下的DPN数据的快照, 包含所有DPN的基本信息. 每次启动从该版本中恢复DPN数据
- 同表中写事务是串行的,读写是并行的.
- 每次写事务有对应的meta版本和data版本快照.
- 读事务获取的是已提交的最新的版本
- 小于VERSION版本号的所有版本是可以回收的
- filters:
- bloom: 布隆过滤器
- cmap: 字符位图,某个位置是否有字符存在
- hist: 数据类型的直方图, 包含数值类型的列信息