我上网查阅了一些资料,读了一些相关论文。现对Postgresql整体架构进行粗略的剖析一下,供大家参考:
Postgresql的配置结构:Postgresql采用的是经典的C/S架构模型,主体是由一个守护监听进程Postmaster,若干个前端应用程序(比如Postgresql的客户端,DBMS等)和后段服务器进程(Postgresql服务器本身)所组成。大体宏观上的连接过程如下:前端数据库应用程序要访问数据库,首先要调用数据库应用连接接口库(libpq),根据我的理解,这个libpq可能是一些统一的接口,供第三方实现与Postgresql连接的组件(比如jdbc,odbc)之类,通过网络套接字进行连接,将连接请求发送给守护监听进程Postmaster,此后其启用一个新的后台服务器进程Postgresql与前端应用进行连接,此后前端应用与后台数据库之间的通信便不再通过Postmaster进行通信,可见Postmaster只是起到监听用户连接的作用。但是值得注意的是:根据一些相关资料,Postgresql采取的是单线程的方式来处理客户端所发来的命令。采取这种方案是由于历史因素所造成的。弊端在于:当系统对进程数有限制的时候,客户发来的请求过多时,会造成系统负载过大。导致执行速度变慢。
上面是对整体架构的一些论述,对于我研究的存储引擎模块:存储部分大致可以分为缓存管理以及外存管理两大子模块。
缓存管理:缓冲区最小的单位是页,由大量的页组成缓存区。缓存管理的源码大体架构如下:
storage/buffer下:
buf_init.c:初始化缓冲池,缓冲池的存取方式。
buf_table.c:定义了磁盘页面映射到缓冲区的哈希表以及相关的一些操作。
Bufmgr.c:缓冲区管理的接口,包括对缓冲区的一些操作:读取缓冲区,释放缓冲区,置页面位置为“脏”等。
freelist.c:管理缓冲池,以及缓冲池的替换策略。
Localbuf.c:管理本地缓冲区,本地临时表的快速缓冲区。
storage/page下:
bufpage.c:对于缓冲区页面的一些操作,如页面初始化,获得临时页面,修复页面段等。
Itemptr.c:磁盘项指针(根据我的理解,磁盘是以B树的形式进行管理的,这里可能是B树节点的指针)。
上面是今天所阅读的内容作的一些总结,希望大家分享一下给出意见,一起讨论。