一、体系结构概览
二、驱动程序
客户端程序使用驱动程序,向openGauss的后端管理线程GaussMaster发起连接请求。openGauss目前支持以下四种驱动程序:
- JDBC,用于Java连接
- ODBC,开放数据库互连
- Libpq,C语言程序接口
- Psycopg,python访问接口
三、数据库实例
Instance部分其实主要指的是数据库运行时的内存部分。当 GaussMaster 线程接收到客户端程序发送过来的服务请求后,会根据收到的信息会立即fork()一个子线程,这个子线程对请求进行身份验证成功后成为对应的后端业务处理子线程( gaussdb )。
四、内存缓冲区
共享内存:数据库启动时将分配一个共享内存区域
私有内存:后台服务进程除访问共享内存外,还会申请一些私有内存,以便暂存一些不需要全局存储的数据。
共享内存区:shared buffer
访问数据页时检查该页是否已在共享数据缓冲区中
如果是,直接从内存中读取数据,否则从磁盘加载数据页到缓冲区再进行访问。
共享内存区:cstore buffer
列存引擎将整个表按照不同列划分为若干个CU(Compression Unit,压缩单元),以CU为单位进行管理,适合于OLAP场景
共享内存区:wal buffer
wal buffer记录数据块的修改,由walwriter线程负责写到xlog,确保已提交的事务不会丢失。
共享内存区:MOT
私有内存区
私有内存:maintence_work_me
本地内存区:temp_buffer
本地内存区:work_mem
五、主要进程和线程
openGauss主要线程共有五个,分别为图中的GaussMaster进程、pagewriter线程、bgwriter线程、walwriter线程、checkpoint线程。
GaussMaster主进程
客户端发送服务请求至GaussMaster
GaussMaster fork gaussdb
子线程(gaussdb)接收到客户端发送过来的查询(SQL)后,会调用openGauss的SQL引擎对SQL语句进行处理
pagewriter线程
openGuass使用bgwriter和pagewriter两类线程来负责脏页的磁盘写入工作。pagewrite负责数据库检查点LSN的推进,将脏页数据拷贝至双写区域并落盘。pgwriter的工作流程大致如下:
bgwriter线程
Bgwriter是一个Background Writer进程的简称,Bgwriter会定时将缓存中一些已经更改的数据(脏缓冲区)写入到磁盘。BgWriter也是postmaster通过fork创建的子进程。它的工作流程大致如下:
walwriter线程
WAL Writer(Write-Ahead Logging Writer)线程是负责将WAL(Write-Ahead Logging)日志缓冲区中的数据写入到持久化存储介质(通常是磁盘)中的后台进程。这个后台进程的实现涉及以下几个主要步骤:
checkpoint线程
检查点(CHECKPOINT)是一个事务日志中的点,所有数据文件都在该点被更新以反映日志中的信息,所有数据文件都将被刷新到磁盘。checkpoint线程是周期性触发的,每次触发会将全部脏页面刷到磁盘中。
openGauss后台辅助线程
opengauss的后台辅助线程是一组特殊的线程,它们在数据库运行期间负责执行一些重要的后台任务,以提高数据库的性能和可靠性
openGauss物理结构
openGauss相关文件如上所示,分为Database相关文件,配置文件以及其他重要文件
六、常见问题
在进行VACUUM(可能并发),CREATE INDEX,ALTER TABLE ADD FOREINGN KEY性能下降可以调整参数:maintenance_work_mem
如果数据库中的写入操作频繁,导致大量脏页积压在内存中,PageWriter 线程可能无法及时处理所有的脏页,导致性能下降。
明确各配置文件的作用:postgresql.conf openGauss的配置文件、pg_hba.conf基于主机的接入认证配置文件,pg_ident.conf 客户端认证的配置文件,gaussdb.state主要保存数据库当前的状态信息。
七、总结
- openGauss主要可以使用JDBC、ODBC、Libpq、Psycopg驱动与应用连接
- openGauss数据库实例是OpenGauss数据库系统中的一个独立运行环境,它包含了一组相关的数据库对象和数据,可以独立地进行管理和操作。
- 共享内存区域:shared buffer、 cstore buffers 、WAL buffer、MOT
- 数据库中可以通过内存参数work_mem、shared_buffers等进行调优,或者根据实际情况选择是否开启参数enable_memory_limit。
- 本地内存区主要有work_mem、temp_buffers、maintenance_work_mem三个内存区