开发者学堂课程【PolarDB for PostgreSQL 开源人才初级认证培训课程:PolarDB 数据库结构】学习笔记(二),与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1077/detail/15551
PolarDB 数据库结构
内容介绍:
一、数据库集群逻辑结构
二、数据库集群物理结构
三、表数据文件内部布局
四、访问表的读写方式
五、进程和内存结构
四、访问表的读写方式
1、行如何写
(1)行如何写入块
(a) Before insertion of Tuple 2 (b)After insertion of Tuple 2
一行的数据如何插入到数据块当中,开始的时候是放在快的底部然后在块头会产生一个指针,这个指针指向盘开始的一个位置,如果又插入了一条新的行,这个行就像垒柴火一样是留下往上垒,然后又会产生一个新的竞争,快存放数据的时候新插入一行会产生新的函指针。所以插入数据越来越多里面可用的空间双向的减少,双向的减少就是底下存放函的数据,上面的又要产生函指针,函指针也要占用空间。
2、行如何从块中读
(a)Sequential Scan SELECT*FROM tbl:
(b) Index Scan SELECT*FROM tb WHERE col="Queen':
在 PG 下面访问表的方式有两种,PolarDB 下面第一种叫做顺序扫描,通俗一点说法是全表扫描,全表扫描比如当前有两个数据块,PolarDB 在访问的时候先找到块的位置,然后从第一行开始直到把表的所有行找完以后,接下来再去找第二个快的第一行,按照快的顺序还有函的顺序来访问叫做顺序扫描或者叫做全表扫描,全表就是把表数据块里面所有的函扫描一遍,所以也叫全表扫描。索引扫描先根据索引行里面记录行所在的 id,通过函的 ID 就找到比如在函 ID 里面记录行在哪个数据块,然后是第几行,就会找到第七块的第二行,不需要进行全表扫描,这是 PolarDB 访问表的两种方式。
五、进程和内存结构
1、PolarDB 进程结构
postgres server process-postgres 服务器进程是与数据库群集管理相关的所有进程的父进程。
backend process- 每个后端进程处理连接的客户端发出的所有查询和语句。
background processes- 各种后台进程执行用于数据库管理的每个特性的进程(例如清空和检查点进程)。
replication associated processes- 在与复制相关联的进程中,它们执行流式复制。
background worker process- 它可以执行用户实现的任何处理。
启动 PolarDB 数据库的时候,实际上是先启动实例,实例由进程和内存组成,PolarDB 的进程结构首先是一个父进程叫做 postgres server 进程,是一个父进程,所有的比如后台进程还有后端进程等等,都是由父进程派生出来。Backend 进程是以后负责处理用户的请求。后台进程是用来管理整个数据库的,比如将来做主重复制或有复制进程等等。
PolarDB 的进程结构,起来的时候是它的一个父进程,然后所有的后台进程由它派生,所有的 back 进程也是由它派生,back 的进程实际上就是负责客户的请求,客户端访问数据库的时候,实际上不是直接跟数据库打交道,而是通过 back 的进程,可以把它称为是一个代理进程,把所有的请求发给 postgres,然后由 postgres 跟 server 进程发出请求或者跟后台进程发出请求,请求以后将来执行的结果再由 postgres 返回给用户进去,这是一个整个的 PolarDB 进程结构。
2、Postgres 服务进程
PolarDB 进程结构
postgres 服务器进程是 PostgreSQ L服务器中所有进程的父进程。早期版本它被称为“postmaster”。
pg_ctl 实用程序启动该进程,然后派生出各个后台进程。同时分配共享内存区域。
一个 postgres 服务器进程侦听一个网络端口,默认端口为5432。
进程启动通过一个命令 pg_ctl 启动,启动完以后默认会有一个网络监听端口 5432,可以在配置文件去修改所监听的端口。
PolarDB 进程的名字为 postgres,是一个父进程,下面派生了很多进程比如后台进程,以后要用到的检查点进程,写进程还有一些日志进程。
3、Backend 进程
后端进程(也称为 postgres )由 postgres 服务器进程启动,并处理一个连接的客户
端发出的所有查询。
PostgreSQL 允许多个客户端同时连接;配置参数 max_connections 控制客户端的最大数量。
基于 WEB应用程序,通常使用池中间件(pgbouncer 或 pgpool ll)。
Backend 的进程跟 Oracle 的 server 进程一样,代表用户进程然后去提供服务,PolarDB 下面 Backend 进程跟客用户进程是一一对应关系,把这种连接方式叫做专用连接,正常的 PG 数据库只支持专业连接,PolarDB 在这个基础上面后来又开发出一个跟 Oracle相类似的共享连接,也提供这种共享连接的方式,接下来也会开源出来。一个数据库允许有多少个用户连接由 max_connections 参数来控制最大的连接数。
4、Background 进程
process description
background writer In this process, dirty pages on the shared buffer pool are written to a persistent storage (e.q.HD DSSD) on a reqular basis qradually.(In version 9.1 or earlier,it was also responsible for checkpoint process.)
checkpointer In this process in version 9.2 or latercheckpoint process is performed.
autovacuum launcher The autovacuum-worker processes are invoked for vacuum process periodically.(More precisely, it requests to create the autovacuum workers to the postgres server.)
WAL writer This process writes and flushes periodically the WAL data on the WAL buffer to persistent storage.
statistics collector In this process, statistics information such as for pg stat activity and for pg stat database, etc. is collected.
logging collector (logger) This process writes error messages into log files.
archiver In this process, archiving logging is executed.
Backend
有很多后台进展,功能简单介绍比如写进程负责把 PolarDB 数据缓冲区的方块把它写到数据文件。检查点进程就是专门用它来发检查点,检查点进程同时也负责写。在 PolarDB 下面数据缓冲区的方块,除了写进程以外检查点进程也会写。还有对空间整理的时候有一个 WAL writer 还有日志文件写进程还有收集进程等等。如果数据库是归档也有一个归档进程,进程的结构跟 Oracle 都很相像,而且功能都一样。
$ pstree -p 27506
postgres(27506)-+-postgres(27507)
|-postgres(27508)
|-postgres(27509)
|-postgres(27511)
|-postgres(27512)
|-postgres(27514)
|-postgres(27515)---{postgres}(27516)
|-postgres(27517)
|-postgres(27518)
|-postgres(27519)
|-postgres(27520)
|-postgres(27521)
|-postgres(27522)
|-postgres(27523)
|-postgres(27524)
|-postgres(27525)
|-postgres(27526)
|-postgres(27527)
|-postgres(27528)
-postgres(27712)
通过查看父进程派生出来的进程。
5、内存结构
PostgreSQL 中的内存架构可以分为两大类:
Local memoryarea- 由每个后端进程分配给自己使用
Shared memoryarea- 由 PostgreSQL 服务器的所有进程使用
PolarDB 的内存结构分为两种,一种是本地内存,一个是共享内存。本地内存是每一个进程启动的时候给分配的自己用,共享是给整个实例提供服务的。
(1)本地内存区域
sub-area description
work_mem Executor uses this area for sorting tuples by ORDER BY and DISTINCT operations, and for joining tables by merge-join and hash-join operations.
Maintenance_work_mem Some kinds of maintenance operations(e.g.VACUUM,REINDEX)use this area.
temp_buffers Executor uses this area for storing temporary tables.
本地内存分为工作内存,工作内存比如执行一个 sql 语句的时候,如果里面涉及到排序操作的时候还有一些表连接的时候也要遇到。维护进程是对表进行VACUUM 或者 REINDEX的时候用到,还有一个临时 buffers 里面是存放临时表,如果要创建临时表就会遇到这个,本地进程像 Oracle 的 pga 一样,专门给 backend进程使用。经常看到 Oracle的一个结构,比如 Oracle 一个数据库,然后里面会有用户进程连接到数据库,会有 server 的进程,然后同时会分配一个缓冲区叫做 pga,pga 下面跟结构一样只不过名称不一样,server 进程叫做 backend,pga 叫做本地内存 local,结构非常相似。
(2)共享内存区域
sub-area description
shared buffer pool PostgreSQL loads pages within tables and indexes from a persistent storage to here, and operates them directly.
WAL buffer To ensure that no data has been lost by server failuresPostareSoL supports the WAL mechanism.WAL data(also referred to as XLOG records) are transaction loa in PostareSQL:and WAL buffer is a
buffering area of the WAL data before writing to a persistent storage
commit log Commit Log(CLOG) keeps the states of all transactions(e.g.. in_proaress.committedaborted)for Concurre ncy Control(CC mechanism.
一个是共享缓冲区,共享缓冲区实际上包含了数据缓冲区,如果要修改一个数据文件的数据块,是读到数据缓冲区里面进行修改,叫做共享缓冲区。在进行事务操作的时候,会分配一个日志缓冲区。 PolarDB 叫做 WAL buffer。还有一个内存区域叫做 commit log,PolarDB 下面有专门的进程去记录提交的一个事物的一个信息,所以呢专门分配一个commit log 缓冲区,为整个实例提供服务的,本地是给某一个后端进程提供服务。