openGauss逻辑架构
- 了解openGauss逻辑架构
参考文档:https://blog.opengauss.org/zh/post/jiajunfeng/%E6%B5%85%E8%81%8Aopengauss%E9%80%BB%E8%BE%91%E6%9E%B6%E6%9E%84/
https://my.oschina.net/gaussdb/blog/5057889
openGauss逻辑架构图在openGauss源码doc目录下,见下图。
线程管理
列举了openGauss的后台线程。
- 业务处理线程池
业务处理线程(gaussdb)负责处理客户端请求的任务。高并发场景下,推荐使用线程池。
-- 线程模式在高并发下,线程切换频繁会导致性能下降;所有线程共享内存,可能出现线程把内存写坏了,其他线程感知不到,出现错误。openGauss实现线程池通过线程利用来解决线程频繁切换的问题
线程池的实现:
- 客户端向数据库发起连接请求,数据库主线程创建会话,将会话分发给线程组,加入到线程组的epoll列表中
- 线程组的监听线程负责监听epoll列表中的所有客户端连接
- 线程组监听线程监听到客户端任务请求,将会话分配给空闲的线程组worker线程。任务完成后,worker线程返还会话给监听线程,如无其他等待响应请求的会话,则worker线程标记为空闲状态
- 线程组worker线程在客户端断开连接后,关闭连接,并释放相关资源
- 每个线程组可以与一个NUMA节点绑定
- 日志写线程
日志写线程(WALwriter)将WAL buffer的内容刷新到磁盘并保存在WAL日志中,确保已提交的事务都被永久记录,不会丢失。 - 数据页写线程
数据页写线程包括:pagewriter和bgwriter。
pagewriter线程负责将脏页写入双写文件,推进整个数据库的检查点。
bgwriter线程主要将pagewriter转发过来的脏页落盘。 - 检查点线程
检查点线程(checkpointer),周期性发起数据库检查点。
检查点(checkpoint)是一个事务日志中的点,所有数据文件都在该点被更新以反映日志中的信息,所有数据文件都将被刷新到磁盘。 - 统计线程
统计线程(statscollector)进行数据库统计信息收集,并将这些信息保存在pgstat.stat文件中。 - 日志发送线程
日志发送线程(WALsender),在主节点将预写日志发送到备节点。 - 日志接收线程
日志接收线程(WALreceiver),在备节点接收主节点发送过来的预写日志。 - 清理线程
清理线程(autovacuum)主要负责清理dead tuples,冻结事务id,清理不需要的clog部分,更新目标表的FSM、VM,更新部分统计信息。 - 归档线程
归档线程,数据库打开归档功能时启动的一个线程,此线程用于将数据库日志归档到指定的路径。 - 管理线程
管理线程可以看作是一个消息转发中心,在接收到请求后,启动相应的子线程完成相关操作。
通信管理
- 通信协议处理
openGauss数据库使用的前端后端协议,根据连接状态的不同,存在几种不同的子协议。 - 控制命令信号处理
信号是一种软件中断机制,openGauss数据库线程之间的通讯离不开这些信号。
SQL引擎
- SQL解析器
解析接收到的SQL命令,生成语法树。 - SQL查询重写
利用已有语句特征和关系代数运算生成更高效的等价语句。 - SQL优化
枚举不同的候选执行路径,根据代价估算,选择最优的执行路径。 - SQL执行
SQL执行器遍历执行计划树,根据计划树的具体逻辑完成操作。 - DDL命令处理
解析DDL命令语法,查询数据字典执行更新操作。 - 存储过程解析
存储过程是一组可以完成特定功能的SQL语句集合,经编译后存储在数据库中。对存储过程的解析在SQL引擎中完成。
存储引擎
- 行存
将表以行为单位存储在硬盘。 - 列存
列存的基本单位是CU(压缩单元),表中一列的一部分数据组成的压缩数据块。 - 内存表
基于全内存态的数据存储,为openGauss提供了高吞吐的实时数据处理分析能力和极低的事务处理延时。 - CSN快照
CSN:在openGauss内部,使用的一个全局自增的长整数作为逻辑的时间戳,它模拟数据库内部的时序。openGauss事务启动时会创建CSN快照。 - 大内存缓冲管理
与外部文件系统进行page页面交换并作缓冲,对内存共享页面的脏页进行LRU算法淘汰并刷盘。 - 日志管理
采用多个Log Writer线程并行写的机制。 - 空闲空间管理
清理数据库中的历史版本数据。 - 索引管理
主要管理索引结构,如索引创建,更新,删除等。 - 并行日志回放
将重做日志中已记录的数据文件变更操作重新应用到系统/页面中的过程,主要发生在故障恢复或者主备数据同步的备节点上。 - 锁管理
对事务并发访问过程中数据库对象的加锁操作进行管理。 - 存储管理适配
对存储介质层的管理,对不同的存储介质进行适配封装,对上层数据页面访问屏蔽底层真正存储系统的差异,例如管理HDD的使用、管理SSD的使用。 - 增量检查点
增量检查点会小批量的分阶段的滚筒式的去进行脏页刷盘,同时更新lsn信息,回收不需要的xlog日志。 - NUMA 数据结构
通过numa绑核,减少跨核内存访问的时延问题,提升CPU利用率,提升多线程间同步性能,xlog日志批量插入,热点数据分散处理。
安全管理
- 身份管理
openGauss使用了一系列的认证机制来实现,通过认证模块限制用户对数据库的访问,通过口令认证、证书认证等机制保障认证过程中的安全,通过黑白名单限制访问IP,通过数据库属性或用户属性限制连接数。 - 访问控制
基于角色的访问控制机制,控制数据库资源和对象的访问权限。 - 通信加密
openGauss提供了数据加密、数据脱敏、加密数据导入导出等机制保障数据的隐私安全。 - 审计
openGauss提供了基础审计能力,审计内容包括事件的发起者,事件的发生时间和事件的内容。
通用组件
- 数据字典
数据库的元数据,可以通过查询数据字典查看数据库的相关信息,如数据库对象的属性等。 - 内存管理
根据openGauss的配置参数,规划数据库各种内存的分配。 - 数据类型
数据库中数据的属性。 - 内置函数
数据库内定义的子程序,实现特定的功能需求。
工具
- 客户端命令行工具
gsql - 数据库实例控制工具
实例初始化(gs_initdb),实例启停(gs_ctl) 等。 - 物理备份/恢复工具
gs_basebackup - 逻辑导入导出工具
gs_dump,gs_dumpall - OM安装
gs_om
客户端驱动
- 命令行接口(CLI)
gsql客户端 - Java数据库连接(JDBC)
openGauss提供了对JDBC 4.0特性的支持 - 开放式数据库连接(ODBC)
openGauss提供了对ODBC 3.5的支持