pgsql架构
整体模式
pgsql采用C/S架构(客户端/服务端)模式。应用层通过INET或者Unix Socket利用既定的协议与数据库服务器进行通信。
pgsql把客户端称为前端,把服务端称为后端。前端通过调用libpq来与后端通信。 后端由多个进程组成,前端发送网络数据报文(查询请求)到后端,后端解析请求后回复相应的报文。
pgsql后端进程
- postgres主进程(postmaster)
管理后端的常驻进程,也称为’postmaster’。 其默认监听UNIX Domain Socket和TCP/IP(Windows等,一部分的平台只监听tcp/ip)的5432端口,等待来自前端的的连接处理。 监听的端口号可以在PostgreSQL的设置文件postgresql.conf里面可以改。
当有前端连接过来的时候,postmaster会fork一个子进程来处理前端的连接请求。并通过共享内存进行进程间通信。
- postgres子进程
子进程根据pg_hba.conf定义的安全策略来判断是否允许进行连接,根据策略,会拒绝某些特定的IP及网络,或者也可以只允许某些特定的用户或者对某些数据库进行连接。
-
辅助进程
- writer process
- WAL wriiter process
- archive process
- stats collector process
- logger process
- autovacuum
- wal sender/wal receiver
启动流程
后端处理流程
- 接收前端发送过来的请求报文
- parse模块进行文本解析,得到查询树
- analyze模块进行分析处理
- 通过查询语句的重写实现视图和规则
- 查询优化,优化查询树
- executor执行处理
- 返回执行结果给前端
- 重复步骤1-7
后端运行主要逻辑
-
initdb初始化一个数据库,创建data目录、模板数据库、默认用户、默认配置文件,主要涉及内容如下:
-
pg_wal:存放wal日志
-
base:存放表数据
-
-
postgresql采用先写wal日志,再写数据的方式;通过保证wal数据库写入的方式来保证数据写入,并通过wal日志可以进行数据redo和undo;
-
initdb初始化数据目录后,可以通过pg_ctl启动后端服务进程;
-
后端服务进程首先是启动了一个postgres进程,该进程会fork出startup、logger、bgwriter、walwriter、walreceiver等子进程,并通过共享内存和信号进行通信,同时该进程还会监听配置的ip和端口;
-
postgres进程启动后会先启动startup进程,startup进程会读取control文件,确认是否需要恢复,即是否还有wal日志还没有转换为数据,若有或者配置recovery,则需要根据对应的control信息和检查点信息,找到离检查点或配置的最近的lsn,再根据lsn找到对应wal日志进程redo;
-
redo完成后,若开启了流复制,则startup进程将唤醒walreceiver进程,walreceiver获取到最新的lsn后,将和主库walsender进程进行wal同步;
-
postgres启动walreceiver进程时,walreceiver会和另外一个postgres服务端建立连接,另一端将会启动一个walsender进程来进行流复制同步;