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主业务循环*/
...
}