一、整体结构

苹果 自研架构_缓存

苹果 自研架构_苹果 自研架构_02

苹果 自研架构_缓存_03

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日志记录;