PostgreSQL学习笔记(二) PostgreSQL体系结构

PostgreSQL的体系结构非常简单,从图中可以看到它是由共享内存和一组后台进程组成的。

共享内存

共享内存主要分为两种,一种是为数据缓存的,另外一种是为事务日志缓存的。可以看到图中内存最重要的元素就是Shared Buffer和WAL Buffer.

Shared Buffer

共享缓冲区的最主要的目的就是为了尽量的减少物理I/O,为此,必须满足以下几种规则:
1.你需要快速的从缓冲区中检索出数据(数十,数百GB)
2.当很多用户同时访问的时候,应当尽量减少争用.
3.经常使用的块必须长时间的保留在缓冲区中.

WAL Buffer

WAL缓冲区是临时存储数据库更改的缓冲区,存储在WAL缓冲区中的内容在预定的时间被写入到WAL文件中。从备份恢复上来看,WAL缓冲区和WAL文件非常的重要。

PostgreSQL进程

1.Postmaster进程

Postmaster进程是您启动PostgreSQL时启动的第一个进程。在启动的时候执行恢复,初始化共享内存并运行后台进程。当客户端连接发起连接请求时,创建后台进程。如果使用pstree进程可以看到,postmaster是所有进程的父进程。

postgres 24733  2763  0 20:38 pts/2    00:00:00 /opt/PostgreSQL-10/bin/postgres -D /pgdata/data
postgres@postgres-N65S01:~$ ps -ef | grep 24733
postgres 24733 2763 0 20:38 pts/2 00:00:00 /opt/PostgreSQL-10/bin/postgres -D /pgdata/data
postgres 24735 24733 0 20:38 ? 00:00:00 postgres: checkpointer process
postgres 24736 24733 0 20:38 ? 00:00:00 postgres: writer process
postgres 24737 24733 0 20:38 ? 00:00:00 postgres: wal writer process
postgres 24738 24733 0 20:38 ? 00:00:00 postgres: autovacuum launcher process
postgres 24739 24733 0 20:38 ? 00:00:00 postgres: stats collector process
postgres 24740 24733 0 20:38 ? 00:00:00 postgres: bgworker: logical replication launcher

postgres@postgres-N65S01:~$ pstree -p 24733
postgres(24733)─┬─postgres(24735)
├─postgres(24736)
├─postgres(24737)
├─postgres(24738)
├─postgres(24739)
└─postgres(24740)

2.服务器后台进程

PostgreSQL后台进程如下:
logger 将错误日志写入到Log文件。
checkpointer 发生检查点,将脏缓冲区中的数据写入到文件。
writer 定期将脏缓冲区中的数据写入到磁盘。
wal writer 将WAL缓冲区中的数据写入到WAL文件。
Autovacuum launcher 在PostgreSQL数据库中,对表元组的UPDATE或DELETE操作并未立即删除旧版本的数据,表中的旧元组只是被标识为删除状态,并未立即释放空间。当事务提交后,过期元组版本将对事务不再有效,因而其占据的空间必须回收以供其他新元组使用,此时对数据库的清理工作通过运行VACUUM来实现。
archiver 当开启了归档模式模式时,将WAL文件复制到指定的目录。
stats collector 统计信息收集进程,例如session执行的信息(pg_stat_activity)和表的统计信息(pg_stat_all_tables)

3.后端进程(Backend Process)

后端进程最大的连接数量是由max_connections参数进行控制的。默认值为100,后端进程执行用户的查询请求,然后传输结果给用户。查询的时候需要一些内存结构,称为本地内存。与本地内存相关的主要参数有:
1.work_mem,主要用于排序,位图操作,hash join和merge join。默认设置为4M.
2.Maintenance_work_mem,用于Vacuum和CREATE INDEX,默认设置为64M.
3.Temp_buffers,用于临时表,默认设置是8M.

4.客户端进程(Client Process)

客户端进程通过发起连接请求,由postmaster接收请求就会“forks”一个新的进程(Backend Process),然后客户端就和(Backend Process)直接通信,就不再经过最初的postgres进程。

分享到: 更多

Post a Comment

Your email is never published nor shared. Required fields are marked *