openGauss 存储引擎概述

  • 系统架构
  • 系统功能
  • 源码目录

目录


1 存储引擎系统架构

openGauss的存储引擎在整个系统架构中,向上对接SQL引擎,为SQL引擎提供或接收标准化的数据格式(元组或向量数组);向下对接存储介质,按照特定的数据组织方式,通过存储介质提供的特定接口,对存储介质中的数据完成读、写操作。在此基础之上,存储引擎:

  • 通过日志系统提供数据的持久化和可靠性能力。
  • 通过并发控制(事务)系统保证同时执行的、多个读写操作之间的原子性、一致性和隔离性。
  • 通过索引系统提供对特定数据的加速寻址和查询能力。
  • 通过主备复制系统提供整个数据库服务的高可用能力。

openGauss 存储引擎架构


1.2 存储引擎系统功能

统一的日志系统

在openGauss的存储引擎中,日志系统保证在数据库故障恢复场景下,各个引擎内和各个引擎间数据的持久性和一致性。基于上述统一的日志系统,openGauss支持主、备机之间的流式日志复制,并通过Quorum复制协议,在保证复制一致性的前提下,尽可能降低日志同步对主机业务的影响。

多种并发控制和事务系统

在openGauss的存储引擎中,有两种并发控制和事务系统:

  • 适合高并发、高冲突、追求确定性结果的悲观并发控制机制
  • 适合低冲突、短平快、低时延的乐观并发控制机制
    在磁盘引擎中,采用读写冲突优化的悲观并发控制机制:
  • 对于读、写并发操作,采用多版本并发控制(MVCC)
  • 对于写、写并发操作,采用基于两阶段锁协议(2PL)的悲观并发控制(PCC)

在内存引擎中,采用乐观并发控制来尽可能降低并发控制系统对业务的阻塞,以获得极致的事务处理性能和时延。

表级存储格式/存储引擎和跨格式事务

在openGauss的存储引擎中,支持在建表语句中指定目标表的存储格式和存储引擎,即行存储astore、列存储cstore、内存mstore和后续扩展的其他存储格式或存储引擎。因此,在同一个数据库中,为了适配不同的业务场景,用户可以创建不同存储格式或不同存储引擎的表。

进一步,当前openGauss在同一个事务内,支持对同一引擎不同存储格式的表的读写查询,这将极大地简化不同存储格式表中数据一致性、同步性和实时性的运维难度。

统一的行存储访存接口

为了便于后续新型行存储格式的扩展,在openGauss中提供了统一的行存储访存接口层,为上层SQL引擎屏蔽了底层不同的行存储数据组织形式。

对于不同的行存储数据格式,它们向上对接统一的行存储访存接口,向下共享缓冲区管理、事务并发控制、日志系统、持久化和故障恢复、主备系统、索引机制。


1.3 源码目录

openGauss存储引擎的代码主要位于“src/gausskernel/storage/”目录下,具体目录结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
--src
--gausskernel
--storage
--access
--buffer
--bulkload
--cmgr
--cstore
--dfs
--file
--freespace
--ipc
--large_object
--lmgr
--mot
--page
--remote
--replication
--smgr

其中每个子目录都是一个相对独立的模块:

模块名 子目录 说明
访存模块 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”目录下。


Author

Lamber

Posted on

2022-03-22

Updated on

2022-05-06

Licensed under