OpenGauss体系架构图
Opengauss体系具体部分
1、主体模块:Instance
(1)线程组
GaussMaster线程
作为数据库主线程,也称为Postmaster,负责全局协调与监控,包括:
- 监听客户端连接请求,创建新会话线程(如Postgres线程)处理请求
- 监控所有子线程状态,对异常退出的线程进行重启或数据库重初始化
- 初始化共享内存、信号量池等核心资源,但不直接参与锁管理或数据操作
gaussdb线程
核心服务线程:
- 处理客户端SQL请求,执行查询解析、优化、执行全流程
- 通过共享缓冲区(如shared buffer、cstore buffer)访问数据,支持行存(OLTP)和列存(OLAP)引擎
- 在非线程池模式下,每个客户端连接对应一个独立线程;线程池模式下复用线程资源
WalWriter线程
管理WAL日志的持久化:
- 周期性地将WAL缓冲区内容写入磁盘日志文件(如pg_xlog目录),保障事务的原子性和持久性
- 在归档模式下触发日志切换,将在线日志拷贝至归档目录
CheckPoint线程
触发检查点操作:
- 全量检查点:强制将所有内存脏页同步到磁盘,保证数据库一致性
- 增量检查点:分阶段滚动式刷盘,减少性能抖动,更新控制文件记录恢复起始点
- 与BgWriter协作,通过双写机制防止数据页断裂,异常时从双写区域恢复
PageWriter
双写保护与脏页中转:
-
双写机制(Double-Write):将共享缓冲区中的脏页先拷贝至双写区域(磁盘上的固定区域),再异步写入实际表文件。此举旨在防止因系统崩溃或I/O中断导致的数据页"折断"(Partial Write)问题
例如:若某页写入表文件时仅完成部分操作,后续可通过双写区域的完整副本恢复数据一致性。
-
脏页中转:完成双写后,将脏页转发给BgWriter线程进行最终刷盘操作,形成流水线式处理
BgWriter
后台异步刷盘与资源调度:
- 脏页批量刷盘:持续扫描共享缓冲区,将PageWriter转发的脏页或未被双写机制覆盖的常规脏页批量写入表文件,减少随机I/O带来的性能波动
- 检查点协作:在检查点(Checkpoint)触发前提前刷写部分脏页,避免检查点期间集中刷盘导致的性能陡降
(2)内存缓冲区
Shared Buffer(共享缓冲区):
- 核心作用:作为全局共享内存区域,用于缓存频繁访问的数据页(如行存表、索引页),通过减少磁盘IO提升查询性能
WAL Buffer(事务日志缓冲区):
- 核心作用: 临时存储WAL日志(事务操作的预写日志),保障事务的原子性和持久性
- 协作机制
- 异步刷盘:WalWriter线程周期性将日志写入磁盘(如pg_xlog目录),避免每次事务提交触发IO
- 双写保护:结合PageWriter线程防止日志页断裂,异常时通过双写区域恢复
- 参数建议:默认16MB,高并发事务场景可调高至64MB以减少日志溢出风险
Cstore Buffer(列存储缓冲区)
-
核心作用
专为列式存储引擎设计,缓存列数据块,优化OLAP场景的大数据量扫描性能
-
技术特点
- 压缩优化:支持列级字典压缩,减少内存占用并提升缓存效率
- 向量化处理:结合SIMD指令加速列数据批量计算(如聚合、过滤)
- 参数配置:默认128MB,需根据列存表占比动态调整
Temp Buffer(临时表缓冲区)
-
核心作用
存储临时表数据及复杂查询中间结果(如排序中间表、物化视图)
-
管理策略
- 会话隔离:每个Worker独立分配,避免并发操作冲突
- 自动回收:会话结束后自动释放,支持ON COMMIT DELETE ROWS语义
- 参数调优:默认8MB,复杂查询(如多表JOIN)建议调大以减少磁盘临时文件生成
Work Mem(工作内存)
-
核心作用
为单个会话的排序、聚合、哈希连接操作提供私有内存空间
-
运行机制
- 动态分配:按需分配,超出阈值时数据溢出到磁盘(如外部排序)
- 并行优化:多线程场景下每个Worker独立分配,避免锁竞争
- 参数调优:默认4MB,OLAP场景建议增大(如64MB)以加速大结果集处理
(3)后台辅助进程
WalSender/WalReceiver 线程
主备节点间WAL日志传输的发送和接收线程。
jemalloc_bg_thd
基于jemalloc的高内存管理后台线程,监控内存分配与碎片整理。
StatCollector
统计信息采集器,收集表和索引的访问特征,优化查询计划。
LWLLockMonitor
轻量级锁监控器,检测锁竞争和死锁风险。
Autovacuum相关
- AutoVacLauncher
自动清理任务调度器(如删除无效数据、更新统计信息)。 - AutoVacWorker
实际执行清理操作的工作线程。
Jobworker/percentworker/snaphotworker/ashworker
分别处理定时任务、资源配额监控、快照维护、性能采样等。
syslogger
系统日志收集线程,记录数据库运行状态和错误信息。
Jobworker线程
用于处理定时任务的核心线程组,由调度线程(JobScheduler 和 工作线程(Jobworker 组成,负责周期性地执行用户预定义的数据库维护任务。
- 任务调度(JobScheduler)
- 调度线程通过扫描系统表pg_job获取任务配置(如执行周期、目标存储过程等),并根据预设时间触发任务。
- 支持任务优先级管理,确保高优先级任务优先执行。
- 任务执行(Jobworker)
- 工作线程接收调度线程分配的JOB,执行具体操作(如统计信息收集、数据清理等)。
- 每个Jobworker独立运行,支持并行处理多个任务,通过共享内存传递执行状态。
2、核心连接与驱动
- 客户端程序
JDBC/ODBC/Libpq/Psycopg等驱动的应用程序连接入口。 - 连接驱动
协议适配层,支持不同语言/协议(如Java的JDBC、Python的Psycopg)的通信。
3、OpenGauss配置文件
文件名称 | 描述 |
---|---|
postgresql.conf | 主配置文件,控制数据库服务器的全局运行参数,在数据库启动时会读取该文件,从该文件中获取监听地址、服务端口、内存分配、功能设置等配置信息。 |
pg_hba.conf | 客户端认证策略文件,定义允许连接的客户端及认证方式 |
pg_ident.conf | 操作系统用户与数据库用户的映射文件,主要用于 ident 或 peer 认证 |
gaussdb.state | GaussDB 特有文件,记录数据库实例的运行时状态(如主备节点状态、健康检查结果等) |
4、Database文件
文件 | 功能/作用 |
---|---|
base | 存储默认表空间 pg_default 的数据文件,每个数据库对应一个以 OID 命名的子目录 |
global | 存储全局系统表(如 pg_database 、pg_authid )及控制文件 pg_control |
pg_tblspc | 管理自定义表空间的符号链接目录,每个链接指向自定义表空间的物理路径 |
pg_xlog | 存储预写日志(WAL),确保事务持久性和崩溃恢复 |
pg_clog | 记录事务提交状态(提交/中止),通过 CLOG(事务提交日志)实现 MVCC 的可见性判断 |
pg_csnlog | 记录事务提交序列号(Commit Sequence Number),用于快照隔离级别下的可见性判断 |
pg_twophase | 存储两阶段提交(2PC)事务的预提交状态(如 PREPARE TRANSACTION ),确保分布式事务的原子性 |
pg_serial | 管理序列(Sequence)的元数据,确保自增列在多会话下的唯一性 |
pg_multixact | 处理多事务并发锁(如行级锁),记录多个事务对同一数据行的锁定关系,防止死锁 |
5、opengauss其他重要文件
文件 | 作用 | 应用场景 |
---|---|---|
Archived WAL(归档预写日志) | 将已提交事务的 WAL 日志文件从 pg_wal 目录备份至外部存储(如 NAS、对象存储),用于数据库崩溃恢复、主备同步及时间点恢复(PITR) | 灾难恢复、主备复制 |
pg_audit(审计扩展) | 记录数据库操作日志,满足合规性要求(如 ISO、金融审计),追踪 DDL、DML 及用户登录行为 | 安全审计、操作回溯 |
pg_replslot(复制槽) | 管理主库与备库/逻辑订阅者之间的 WAL 日志保留策略,防止日志过早删除导致复制中断 | 高可用、逻辑订阅 |
pg_llog(逻辑解码日志) | 存储逻辑复制槽的解码状态元数据,确保逻辑复制进程断连后能恢复至断点 | 数据实时同步 登录行为 |
pg_replslot(复制槽) | 管理主库与备库/逻辑订阅者之间的 WAL 日志保留策略,防止日志过早删除导致复制中断 | 高可用、逻辑订阅 |
pg_llog(逻辑解码日志) | 存储逻辑复制槽的解码状态元数据,确保逻辑复制进程断连后能恢复至断点 | 数据实时同步 |