PostgreSQL的体系结构(三)
Postgresql 系列博文讲解(B站同步介绍教学:https://space.bilibili.com/282421760)
支持一下,关注一波微信公众号:【 钥道不止 】
1. PG的体系结构
PostgreSQL与Oracle都是使用共享内存的进程结构,而MySQL是线程模型。
1.1. Postmaster进程
守护进程,实际上是第一个postgres进程,主要职责有:
- 数据库的启停
- 监听客户端连接
- 为每个客户端连接衍生(fork)专用的postgres服务进程
- 当postgres进程出错时尝试修复
- 管理数据文件
- 管理数据库的辅助进程
1.2. postgres进程
实际上是postgres的子进程:
- 直接与客户端进程通讯
- 负责接收客户端所有的请求
- 包含数据库引擎,负责解析SQL和生成执行计划等
- 根据命令的需要调用各中辅助进程和访问各内存结构
- 负责返回命令执行结果给客户端
- 在客户端断开连接时释放进程
1.3. 本地内存
本地内存是服务器进程独占的内存结构,每个postgre子进程都会分配一小块相应内存空间,随着连接会话的增加而增加,它不属于实例的一部分。
- work memory:用于排序的内存
- maintenance work memory:内部运维工作的内存,如VACUUM垃圾回收、创建和重建索引
- temp buffer:用于存储临时表的数据
1.4. 数据库实例(INSTANCE)
- 实例是管理和访问数据库的一套方法,即所有客户端的请求,最终都会转
换成实例对数据库磁盘文件的各种操作,从而达到读写数据的目的 - 实例和数据库是一一对应的
- 实例包含了若干个内存结构和进程
1.4.1. 共享内存
- Shared buffer
用于缓存表和索引的数据块。
数据的读写都是直接对buffer操作,若所需的块不在缓存中,则需要从磁盘中读取。
在buffer中被修改过的,但又没有写到磁盘文件中的块被称之为脏块。
大小由shared_buffers参数控制。 - WAL(Write Ahead Log) buffer:预写日志缓存
用于缓存增删改等写操作产生的事务日志。
大小由wal_buffers参数控制 - Clog buffer:日志缓存
Commit Log Buffer是记录事务状态的日志缓存 - Stats buffer
- Other buffer
1.4.2. 辅助进程
- Backgroup write:后台写进程(BgWrite),LRU算法清理脏页,将shared buffer中的脏数据页写到磁盘文件中
- AutoVacuum launcher/workers:系统自动清理进程(自动清理垃圾回收进程)
当参数autovacuum设为on的时候启用自动清理功能。
Launcher为清理的守护进程,每次启动的时候会调用一个或多个worker。
Worker是负责真正清理工作的进程,由autovacuum_max_workers参数设定其数量。 - WAL Writer:预写式日志进程,将预写日志写入磁盘文件
触发时机:
• WAL BUFFER满了;
• 事务commit时;
• WAL writer进程到达间歇时间时;
• checkpoint发生时。 - Checkpointer:检查点进程
用于保证数据库的一致性
它会触发bgwriter和wal writer动作 - Archiver:归档进程(PgArch)
用于将写满的WAL日志文件转移到归档目录,该进程只有在归档模式才会启用 - SysLogger:系统日志进程
采集PostgreSQL的运行状态,并将运行日志写入日志文件;
logging_collector参数为on时启动,不建议关闭;
log_directory设定日志目录;
log_destination设定日志输出方式,甚至格式;
log_filename设定日志文件名;
log_truncate_on_rotation设定是否重复循环使用且删除日志;
log_rotation_age设定循环时间;
log_rotation_size设定循环的日志尺寸上线。 - WAL Sender/Receiver
- Stats collector:统计信息收集进程(PgStat)
收集表和索引的空间信息和元组信息等,甚至是表的访问信息。收集到的信息能被优化器和autovaccum利用,甚至给数据库管理员作为数据库管理的参考信息。
1.5. Database Cluster
- 这里的database cluster并非数据库集群,而是数据库簇,即数据库。PostgreSQL在磁盘上的一整套文件集合叫做database cluster。
- 数据库包含了数据文件、日志文件等多种文件,用于存储用户数据和保证数据一致性。
1.6. 查询验证
# 进入postgres用户
su - postgres
# 查看postgres进程
ps -ef | grep postgres
2. PG的数据目录结构
-
base目录用于存放数据库的所有实体文件,下属子目录均以数据库OID命名
数据库子目录下是以对象OID命名的文件 -
PG_VERSION 是当前数据库数据格式对应的版本号
-
_fsm结尾的文件是数据文件对应的FSM(free space map)文件,用位图方式来标识哪些block是空闲的
-
_vm结尾的文件是数据文件对应的VM(visibility map),在做多版本并发控制时是通过在元组头上标识“已无效”来实现删除或更新的,最后通过VACUUM功能来清理无效数据回收空闲空间。
-
pg_hba.conf:客户端认证配置文件,可以配置客户的连接协议、加密方式、ACL等等
-
pg_wal:WAL日志目录。
-
pg_xact:Commit log目录。V9版本以前为pg_clog目录。
-
postgresql.conf:配置文件,文本格式。
-
postgresql.auto.conf:也是参数配置文件,所有通过alter命令修改的命令,都会保存在这个文件中,该文件中的参数将会覆盖postgresql.conf文件相同参数的值,该文件为二进制
-
postmaster.pid:Postmaster主进程的操作系统PID,数据库实例正常启动以后就会生成该文件。
-
表空间目录可以任意指定,结构与base目录类似