一、内存结构介绍
1.shared_buffers:
数据库服务器的共享内存缓冲区。在数据库系统中的读写操作,都是针对内存中的数据,磁盘中的数据必须在处理前加载到内存,也就是数据库缓存中。
利用内存充当慢速磁盘与快速CPU之间的桥梁,从而加速IO的访问速度。
2.cstore_buffers:
列存所使用的共享缓冲区。在列存表为主的场景中,几乎不用shared_buffers。在此场景中,应减少shared_buffers,增加csstore_buffers。
3.MOT:
MOT 是内存引擎默认使用的缓冲区,openGauss的MOT内存引擎的索引结构以及整体的数据组织都是基于Masstree模型实现的,
其乐观并发控制和高效的缓存块利用率使得openGauss可以充分发挥内存的性能,
同时,在确保高性能的前提下,内存引擎有着与openGauss原有机制相兼容的并行持久化和检查点能力(CALC逻辑一致性异步检查点),确保数据的永久存储,
适合于高吞吐低时延的业务处理场景。
4.wal_buffers:
用于还未写入磁盘的WAL日志的共享内存。
SQL执行器在共享缓冲区中对数据页的操作会被记录到 WAL buffer 中,当客户端发起事务的commit请求时,
WAL buffer的内容将被WalWriter线程刷新到磁盘并保存在WAL日志文件中,确保那些已提交的事务都被永久记录,不会丢失。
但需要注意的是,当walwriter的写操作跟不上时数据库实际的需求时,常规后端线程仍然有权进行WAL日志的刷盘动作。
5.maintain_work_mem:
maintenance_work_mem 一般是在openGauss执行维护性操作时使用,如:VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等操作,
maintenance_work_mem内存区域的大小决定了维护操作的执行效率。
6.work_mem:
用于查询操作,例如排序或哈希表等。work_mem 是事务执行内部排序或Hash表写入临时文件之前使用的内存缓冲区。
7.temp_buffer:
数据库会话使用的临时缓存,用于访问临时表。
temp_buffer 是每个数据库会话使用的LOCAL临时缓冲区,主要缓存会话所访问的临时表数据。
需要注意的是,openGauss支持全局临时表和会话级临时表,全局临时表的表定义是全局的,而临时表的数据是各个会话私有的。
二、主要线程介绍
8.GaussMaster线程:
openGauss的管理线程,也称为postmaster线程。用于数据库启停、消息转发等管理工作。
9.pagewriter线程:
负责将脏页数据拷贝至双写(double-writer)区域并落盘,然后将脏页转发给bgwriter。
10.bgwriter:
bgwriter进行数据下盘操作。
11.walwriter线程:
负责将内存中的预写日志(WAL)页数据刷新到预写日志文件中,确保已提交的事务都被永久记录,不会丢失。
12.checkpoint:
周期性触发,每次触发会将全部脏页面刷到磁盘中。
Checkpointer周期性的发起数据库检查点,在这个检查点时刻,所有的数据文件都被更新,脏数据页也被刷新到磁盘,此刻数据库是一致的。
openGauss支持全量检查点和增量检查点,增量检查点打开后会小批量的分阶段的滚筒式的去进行脏页刷盘。
三、后台辅助线程
1.jemalloc_bg_thd:
管理并实现内存的动态分配
2.StatCollector:
负责统计openGauss数据库的信息,包括:物理硬件资源使用信息、对象属性及使用信息、SQL运行信息、会话信息、锁信息、线程信息等,并且将这些收集到的统计信息保存在pgstat.stat文件中
3.Auditor:
使用重定向的方式从管理线程、后台线程以及其他子线程获取审计数据,并保存在审计文件中
4.LWLockMonitor:
负责检测轻量级锁(LWLock)产生的死锁,轻量级锁主要提供对共享内存的互斥访问控制,比如Clog buffer(事务提交状态缓存)、Shared buffers(数据页缓存)、Substran buffer(子事务缓存)等
5.sysLogger:
使用重定向的方式捕获管理线程、后台线程以及其他子线程的stderr输出,并写入日志文件中
6.Jobworker:分为调度线程和工作线程。
调度线程(JobScheduler)会根据pg_job表里面定义的JOB周期,对已经过期的JOB进行调用,由工作线程(Jobworker)执行实际的JOB任务。
7.percentworker:
根据percentile参数设置的值计算sql响应时间的百分比信息,目前percentile参数仅支持80和95
8.snapshotworker:
收集snapshot信息
9.WalSender:
运行在openGauss主备环境中主节点,发送预写日志给备节点
10.WalReceiver:
运行在openGauss主备环境中备节点,接收预写日志记录
11..AutoVacLauncher:
AutoVacLauncher线程由Postmaster线程启动,它不断地将数据库需要做vacuum的对象信息保存在共享内存中,
当表上被删除或更新的记录数超过设定的阈值时,会调用AutoVacWorker线程对表的存储空间执行回收清理工作。
四、配置文件
1.postgresql.conf:
openGauss的配置文件,在gaussmaster线程启动时会读取该文件,
获取监听地址、服务端口、内存分配、功能设置等配置信息,
并且根据该文件,在openGauss启动时创建共享内存和信号量池等。
2.pg_hba.conf:
基于主机的接入认证配置文件,主要保存鉴权信息(如:允许访问的数据库、用户、IP段、加密方式等)。
3.pg_ident.conf:
客户端认证的配置文件,主要保护用户映射信息,将主机操作系统的用户与openGauss数据库用户做映射。
4.gaussdb.state:
主要保存数据库当前的状态信息(如:主备HA的角色、rebuild进度及原因、sync状态、LSN信息等)。
五、数据库文件
1.base:
openGauss数据库对象默认存储在目录,如默认的数据库postgres、用户创建的数据库及关联的表等对象。
2.global:
存储openGauss共享的系统表或者说是共享的数据字典表。
3.pg_tblspc:
openGauss的表空间目录,里面存储openGauss定义的表空间的目录软连接,
这些软链接指向openGauss数据库表空间文件的实际存储目录。
4.pg_xlog:
存储openGauss数据库的WAL日志文件。
5.pg_clog:
存储openGauss数据库事务提交状态信息。
6.pg_csnlog:
存储openGauss数据库的快照信息,openGauss事务启动时会创建一个CSN快照,
在MVCC机制下,CSN作为openGauss的逻辑时间戳,模拟数据库内部对时序,用来判断其他事务对于当前事务是否可见。
7.pg_twophase:
存储两阶段事务提交信息,用来确保数据一致性。
8.pg_serial:
存储已提交的可序列化事务信息。
9.pg_multixact:
存储多事务状态信息,一般用于共享行级锁(shared row locks)。
六、openGauss其他重要文件
目录名称描述
1.Archived WAL
openGauss数据库WAL日志的归档目录,保存openGauss的历史WAL日志。
2.pg_audit
存储openGauss数据库的审计日志文件。
3.pg_replslot
存储openGauss数据库的复制事务槽数据。
4.pg_llog
保存逻辑复制时的状态数据。