openGauss源码解析(3)

openGauss源码解析:openGauss简介(3)

1.4 代码结构

本节从数据库系统通信管理、SQL引擎和存储引擎3个方面对openGauss的代码结构进行介绍。

1.4.1 通信管理

openGauss查询响应使用简单的“单一用户对应一个服务器线程”的客户端/服务器模型实现。由于无法提前知道需要建立多少个连接,因此必须使用主进程(gaussmaster)。主进程在指定的TCP/IP(transmission control protocol/internet protocol,传输控制协议/互联网协议)端口上侦听传入的连接,只要检测到连接请求,主进程就会生成一个新的服务器线程。服务器线程之间使用信号量和共享内存相互通信,以确保整个并发数据访问期间的数据完整性。

客户端进程可以被理解为满足openGauss协议的任何程序。许多客户端都基于C语言库libpq进行通信,但是该协议有几种独立的实现,例如Java JDBC驱动程序。

建立连接后,客户端进程可以将查询发送到后端服务器。查询使用纯文本传输,即在前端(客户端)中没有进行解析。服务器解析查询语句、创建执行计划、执行并通过在已建立连接上传输检索到的结果集,将其返回给客户端。

openGauss数据库中处理客户端连接请求的模块叫作作postmaster。前端程序发送启动信息给postmaster,postmaster根据信息内容建立后端响应线程。postmaster也管理系统级的操作,比如调用启动和关闭程序。postmaster在启动时创建共享内存和信号量池,但它自身不管理内存、信号量和锁操作。

当客户端发来一个请求信息,postmaster立刻启动一个新会话,新会话对请求进行验证,验证成功后为它匹配后端工作线程。这种模式架构上处理简单,但是高并发下由于线程过多,切换和轻量级锁区域的冲突过大导致性能急剧下降。因此openGauss通过线程资源池化复用的技术来解决该问题。线程池技术的整体设计思想是线程资源池化,并且在不同连接直接复用。

1. postmaster源码组织

postmaster源码目录为:/src/gausskernel/process/postmaster。postmaster源码文件如表1-2所示。

表1-2 postmaster源码文件

模块

源码文件

功能

postmaster

postmaster.cpp

用户响应主程序

aiocompleter.cpp

完成预取(prefetch)和后端写(backWrite)I/O操作

alarmchecker.cpp

闹钟检查线程

lwlockmonitor.cpp

轻量锁的死锁检测

pagewriter.cpp

写页面

pgarch.cpp

日志存档

pgaudit.cpp

审计线程

pgstat.cpp

统计信息收集

startup.cpp

服务初始化和恢复

syslogger.cpp

捕捉并写所有错误日志

autovacuum.cpp

垃圾清理线程

bgworker.cpp

后台工作线程(服务共享内存)

bgwriter.cpp

后台写线程(写共享缓存)

cbmwriter.cpp

修改数据块跟踪记录线程

remoteservice.cpp

远程服务线程,用于双机损坏页修复时的远程服务

checkpointer.cpp

检查点处理

fencedudf.cpp

保护模式下运行用户定义函数

gaussdb_version.cpp

版本特性控制

twophasecleaner.cpp

清理两阶段事务线程

walwriter.cpp

预写式日志写入

2. postmaster主流程

postmaster主流程代码如下:

/* postmaster.cpp */

...

int PostmasterMain(int argc, char* argv[])

{

InitializePostmasterGUC(); /* 初始化postmaster模块配置参数*/

...

pgaudit_agent_init(); /* 初始化审计模块*/

...

for (i = 0; i < MAXLISTEN; i++) /* 建立输入socket监听*/

t_thrd.postmaster_cxt.ListenSocket[i] = PGINVALID_SOCKET;

...

/* 建立共享内存和信号池*/

reset_shared(g_instance.attr.attr_network.PostPortNumber);

...

/* 初始化postmaster信号管理*/

gs_signal_slots_init(GLOBAL_ALL_PROCS + EXTERN_SLOTS_NUM);

...

InitPostmasterDeathWatchHandle(); /* 初始化宕机监听*/

...

pgstat_init(); /* 初始化统计数据收集子系统*/

InitializeWorkloadManager(); /* 初始化工作负载管理器*/

...

InitUniqueSQL(); /* 初始化unique SQL资源*/

...

autovac_init(); /* 初始化垃圾清理线程子系统*/

...

status = ServerLoop(); /* 启动postmaster主业务循环*/

...

}

posted @ 2024-03-30 11:08  openGauss-bot  阅读(29)  评论(0编辑  收藏  举报