一、整体结构
1、Postmaster进程
数据库的启停
监听客户端连接(Socket、TCP/IP)
为每个客户端连接衍生(fork)专用的postgres服务进程验证功能
当postgres进程出错时尝试修复
管理数据文件
管理数据库的辅助进程
2、postgres进程 Session processors
实际上是postgres的子进程,在PM进程fork该进程时会同时分配Work menory 本地私有内存
直接与客户端进程通讯
负责接收客户端所有的请求
包含数据库引擎,负责解析SQL和生成执行计划等整个sql执行流程
根据命令的需要调用各中辅助进程和访问各内存结构
负责返回命令执行结果给客户端
在客户端断开连接时释放进程
3、本地内存
本地内存是服务器进程独占的内存结构,每个postgre子进程都会分配一小块相应内存空间,随着连接会话的增加而增加
work memory:用于排序,hash(join)的内存,
maintenance work memory:内部运维工作的内存,如VACUUM垃圾回收、创建和重建索引
temp buffer:用于存储临时表的数据
work_mem在Postgres中的默认值为4MB,work_mem是PostgreSQL在写入临时磁盘文件之前,进行内部sort(order by)和hash(join)操作需要使用的内存量。work_mem需要通过explain analyze分析语句来确定合适的值,
分析如果出现Sort Method: quicksort Memory表示work_mem配置不够,需要评估是否增大该配置
4、数据库实例(INSTANCE)
实例是管理和访问数据库的一套方法,即所有客户端的请求,最终都会转换成实例对数据库磁盘文件的各种操作,从而达到读写数据的目的
实例和数据库是一一对应的
实例包含了若干个内存结构和进程
5、共享内存
5.1、Shared buffer
数据缓冲区,用于缓存表和索引的数据块。
数据的读写都是直接对buffer操作,若所需的块不在缓存中,则需要从磁盘中读取。
在buffer中被修改过的,但又没有写到磁盘文件中的块被称之为脏块。
大小由shared_buffers参数控制。用 show shared_buffers;查看默认大小128M,可以通过命令或者修改postgresql.conf文件配置,可以配置为总内存的1/4~1/2
5.2、WAL(Write Ahead Log) buffer
预写日志缓冲区
用于缓存增删改等写操作产生的事务日志。wal 文件持久化之前的缓冲区; 默认值 wal_buffers = -1 表示选择 shared_buffers 的 1/32 的尺寸 ( 约 3%) ,但是不小于 64kb 也不大于 WAL 段的尺寸。多个 client 同时提交事务时,缓冲区较大会更大程度的合并 I/O 提高性能
6、辅助进程
Backgroup write
后台写进程(BgWrite),LRU算法清理脏页,将shared buffer中的脏数据页写到磁盘文件中
WAL Writer:预写式日志进程(Redo日志)
将预写日志写入磁盘文件
触发时机:
WAL BUFFER满了;
事务commit时;
WAL writer进程到达间歇时间时;
checkpoint发生时。
Checkpointer:检查点进程
用于保证数据库的一致性,通过一些规则或者定时去检查它会触发bgwriter和wal writer动作
Archiver:归档进程(PgArch)
用于将写满的WAL日志文件转移到归档目录,该进程只有在归档模式才会启用
AutoVacuum launcher/workers
由于PG采用堆表的方式修改数据会产生很多脏数据
系统自动清理进程(自动清理垃圾回收进程)
当参数autovacuum设为on的时候启用自动清理功能。
Launcher为清理的守护进程,每次启动的时候会调用一个或多个worker。
Worker是负责真正清理工作的进程,由autovacuum_max_workers参数设定其数量。
SysLogger系统日志进程
采集PostgreSQL的运行状态,并将运行日志写入日志文件;
logging_collector参数为on时启动,不建议关闭;
log_directory设定日志目录;
log_destination设定日志输出方式,及格式;
log_filename设定日志文件名;
log_truncate_on_rotation设定是否重复循环使用且删除日志;
log_rotation_age设定循环时间;
log_rotation_size设定循环的日志尺寸上线。
Stats collector:统计信息收集进程
Stats collector:统计信息收集进程(PgStat)
收集表和索引的空间信息和元组信息等,甚至是表的访问信息。收集到的信息能被优化器和autovaccum利用,甚至给数据库管理员作为数据库管理的参考信息。
WAL Sender/Receiver
walsender:用于主库发送WAL日志记录到从库;
walreceiver:用于从库接收主库的WAL日志记录;