openGauss 存储引擎概述
- 系统架构
- 系统功能
- 源码目录
目录
1 存储引擎系统架构
openGauss的存储引擎在整个系统架构中,向上对接SQL引擎,为SQL引擎提供或接收标准化的数据格式(元组或向量数组);向下对接存储介质,按照特定的数据组织方式,通过存储介质提供的特定接口,对存储介质中的数据完成读、写操作。在此基础之上,存储引擎:
- 通过日志系统提供数据的持久化和可靠性能力。
- 通过并发控制(事务)系统保证同时执行的、多个读写操作之间的原子性、一致性和隔离性。
- 通过索引系统提供对特定数据的加速寻址和查询能力。
- 通过主备复制系统提供整个数据库服务的高可用能力。
1.2 存储引擎系统功能
统一的日志系统
在openGauss的存储引擎中,日志系统保证在数据库故障恢复场景下,各个引擎内和各个引擎间数据的持久性和一致性。基于上述统一的日志系统,openGauss支持主、备机之间的流式日志复制,并通过Quorum复制协议,在保证复制一致性的前提下,尽可能降低日志同步对主机业务的影响。
多种并发控制和事务系统
在openGauss的存储引擎中,有两种并发控制和事务系统:
- 适合高并发、高冲突、追求确定性结果的悲观并发控制机制
- 适合低冲突、短平快、低时延的乐观并发控制机制
在磁盘引擎中,采用读写冲突优化的悲观并发控制机制: - 对于读、写并发操作,采用多版本并发控制(MVCC)
- 对于写、写并发操作,采用基于两阶段锁协议(2PL)的悲观并发控制(PCC)
在内存引擎中,采用乐观并发控制来尽可能降低并发控制系统对业务的阻塞,以获得极致的事务处理性能和时延。
表级存储格式/存储引擎和跨格式事务
在openGauss的存储引擎中,支持在建表语句中指定目标表的存储格式和存储引擎,即行存储astore、列存储cstore、内存mstore和后续扩展的其他存储格式或存储引擎。因此,在同一个数据库中,为了适配不同的业务场景,用户可以创建不同存储格式或不同存储引擎的表。
进一步,当前openGauss在同一个事务内,支持对同一引擎不同存储格式的表的读写查询,这将极大地简化不同存储格式表中数据一致性、同步性和实时性的运维难度。
统一的行存储访存接口
为了便于后续新型行存储格式的扩展,在openGauss中提供了统一的行存储访存接口层,为上层SQL引擎屏蔽了底层不同的行存储数据组织形式。
对于不同的行存储数据格式,它们向上对接统一的行存储访存接口,向下共享缓冲区管理、事务并发控制、日志系统、持久化和故障恢复、主备系统、索引机制。
1.3 源码目录
openGauss存储引擎的代码主要位于“src/gausskernel/storage/”目录下,具体目录结构如下:
1 | --src |
其中每个子目录都是一个相对独立的模块:
模块名 | 子目录 | 说明 |
---|---|---|
访存模块 | access子目录 | 主要包括:各种行存储格式中,元组格式;元组与页面之间的转换和访存管理;元组扫描、插入、删除和更新功能的接口实现;几类索引,包括B-Tree、hash、GIN(generalized inverted index,通用倒排索引)、GiST(generalized search tree,通用搜索树)、psort(列存储局部排序索引),的访存管理和接口实现;各类数据库操作对应的日志实现和恢复机制;以及事务模块实现 |
行存储共享缓冲区模块 | buffer子目录 | 主要包括:行存储共享缓冲区的结构;物理页面和缓冲区页面的映射管理;缓存页面的加载和淘汰算法等 |
列存储只读共享缓冲区模块 | cmgr子目录 | 主要包括:cstore列存储格式只读共享缓冲区的结构;压缩单元和缓冲区的映射管理;缓冲压缩单元的加载和淘汰算法等 |
列存储访存模块 | cstore子目录 | 主要包含:cstore列存储格式中,向量数组与压缩单元之间的转换和访存管理;以及在此基础之上向量数组的扫描、插入、删除和更新功能的接口实现 |
文件操作和虚拟文件描述符模块 | file子目录 | 主要包含:磁盘文件系统存储介质的文件和目录操作;虚拟文件描述符的实现和管理 |
行存储空闲空间管理模块 | freespace子目录 | 主要包含:各种行存储格式中,页面空闲空间的管理 |
内存引擎模块 | mot子目录 | 主要包含:内存引擎的实现 |
页面模块 | page子目录 | 主要包含:各种行存储格式中,页面格式、页面校验、页面加密和页面压缩 |
备机页面修复模块 | remote子目录 | 主要包含:从备机获取完整页面或压缩单元,用于修复主机损坏的页面或压缩单元 |
主备日志复制模块 | replication子目录 | 主要包含:主备日志发送和接收线程的实现;流式日志同步功能的实现;Quorum复制协议的实现,逻辑日志的实现以及主备重建;主备心跳检测功能的实现 |
存储介质管理模块 | smgr子目录 | 主要包含:存储介质管理层的实现;磁盘文件系统(当前默认的存储介质)的基本功能接口实现 |
其余还有,外表批量导入模块(bulkload子目录)、外表服务器连接模块(dfs子目录)、进程间通信模块(ipc子目录)、大对象模块(large_object子目录)、锁管理模块(lmgr子目录)。
而 openGauss存储引擎相关的后台线程实现代码包含在“src/gausskernel/process/postmaster”目录下。
openGauss 存储引擎概述