PostgreSQL 是一个开源数据库管理系统,具有对象关系性质。 PostgreSQL 是最早的系统之一即 POSTGRE 系统的继承者。它是使用最广泛的开源数据库管理系统之一。
PostgreSQL 有一个客户端-服务器架构模型。简单来说,PostgreSQL 服务有 2 个进程:
- 服务器端进程:这是管理连接、操作以及静态和动态资产的“Postgres”应用程序。
- 客户端进程(前端应用程序):这些是用户用来与数据库交互的应用程序。它通常具有简单的 UI,通常通过 API 用于用户和数据库之间的通信。
客户端流程:
当用户在 PostgreSQL 上运行查询时,客户端应用程序可以连接到 PostgreSQL 服务器(Postmaster Daemon Process)并通过 PostgreSQL 支持的许多数据库客户端应用程序接口之一提交查询,如 JDBC、Perl DBD、ODBC 等,这有助于提供客户端库。在客户端进程中,客户端应用程序和客户端应用程序库之间的通信是在库API的帮助下发生的,如下图所示:
1. Postmaster 守护进程:
PostgreSQL 的系统架构基于 Process-Per-Trans cation Model(Client/Server Model)。正在运行的 PostgreSQL 站点由Postmaster管理,这是一个中央协调过程。它也称为服务器进程。
postmaster 守护进程负责:
- 初始化服务器
- 关闭服务器
- 处理来自新客户端的连接请求。
- 执行恢复。
- 运行后台进程。
共享内存:共享内存是由多个程序同时访问的内存,以便以较少的冗余提供快速高效的结果。这是为数据库缓存和事务日志缓存保留的内存。在 PostgreSQL 中使用了共享磁盘缓冲区和共享表,其工作解释如下:
共享磁盘缓冲区:共享磁盘缓冲区的目的是最小化磁盘输入/输出。如果不使用它,则磁盘输入/输出需要更多时间,从而导致冗余和低效系统。使用共享缓冲区的优点是:
- 减少时间。
- 可以轻松访问大量数据。
- 当多个用户同时访问时,尽量减少加热。
共享表:这种方法涉及使用同一组表来托管多个客户端数据。使用这种方法的主要优点是:
- 最低的硬件成本
- 最低的备份成本
- 它允许在单个数据库中处理大数据。
UNIX 系统:在 UNIX 系统内核磁盘缓冲区维护一个内存缓冲区,并为磁盘存储中的数据提供物理存储。此外,PostgreSQL 的命令会验证语法是否编写正确,并提供错误消息,原因是命令中缺少什么等。
2、后台流程:
Postmaster 负责处理初始客户端连接。为此,它不断地侦听作为已知端口的新连接。 postmaster 执行用户认证等初始化过程后,会产生一个新的后端服务器进程来处理新的客户端。客户端只与后端服务器进程交互,如提交查询和接收查询结果。这将表明 PostgreSQL 实际上使用 Process-per-transaction 模型。
后端服务器负责通过执行特定操作来执行客户端提交的查询。每个后端服务器一次仅处理一个查询。一次有多个客户端连接到系统,因此多个后端服务器同时执行查询。后端服务器从位于共享内存中的主内存缓冲池访问数据。
之后,获得的结果由后端进程提供给客户端进程。
WAL(Write Ahead Log)Writer | This process Write and flushes WAL Data on WAL buffer |
logging collector | This process is also called logger. It will write an error message to the log file. |
Auto vacuum launcher | When auto vacuum is enabled, this process has the responsibility of the auto vacuum daemon to carry vacuum operations on bloated tables. This process relies on the stats collector process for perfect table analysis. |
Archiver | When Achiever is enabled, the process has the responsibility to copy WAL log file to the specified directory. |
stats collector | In this statistics information like pg_stat_activity and pg_stat_all_tables is collected |
checkpointer | When a checkpoint occurs, the dirty buffer written to the file. |
writer | It will periodically write the dirty buffer to the file. |
3.共享池:
共享池是在启动时创建的 RAM 堆中的一个 RAM 区域。共享池是 SGA(系统全局区域)的一个组成部分。如果共享池在 RAM 中不可用或未使用,则会导致高库缓存重新加载、高行缓存重新加载。共享池是在启动时创建的 RAM 堆中的一个 RAM 区域。共享池是 SGA(系统全局区域)的一个组成部分。如果共享池在 RAM 中不可用或未使用,则会导致高库缓存重新加载、高行缓存重新加载。
为什么 PostgreSQL 没有使用共享池?
PostgreSQL 不提供共享池,尽管大多数数据库系统如 Oracle,但共享池是其结构的重要组成部分。它没有,因为与共享池相比,PostgreSQL 将提供在进程级别共享 SQL 信息的功能。简单地说,如果用户在一个进程中多次执行相同的 SQL 查询,它只会硬解析一次,这比其他数据库系统更有优势,因为在另一个使用共享池的数据库系统中,硬解析发生在从共享池加载的单个 SQL 语句。如果用户同时多次执行单个 SQL 查询,则会导致更多负载。
4. PostgreSQL 中的 OID :
OID 代表对象标识符类型。 OID 被 PostgreSQL 用作各种系统表的主键。它被实现为一个无符号的四字节整数。我们还可以选择将用户定义表中的 OID 用作“WITH OIDS”,但不鼓励使用,因为它不够大,无法在大型用户定义表中提供唯一性。 OID 通常最适合系统表。它基本上为包含在系统列中的每一行提供了一个内置 ID。
在 PostgreSQL 12 版本中,用户表的 OID 功能已被间接删除,即我们可以显式使用 OID。
PostgreSQL 的优点:
- PostgreSQL 是一个高风险承受能力的数据库,维护成本低。
- 它使用 LAMP(Linux、Apache、MySQL、 PHP)堆栈来执行动态网站和 Web 应用程序。
PostgreSQL 的缺点:
- 与商业数据库相比,它有点慢。
- 与 MYSQL 相比,它不支持各种开源应用程序。