概述
PostgreSQL 是一个功能强大的关系型数据库,能够服务于许多不同的用例。在将它用于您的项目之前,最好先概览一下 PostgreSQL 的工作原理、它与其他关系型数据库的不同之处,以及有哪些功能可帮助您建模和管理数据。
本指南将介绍 PostgreSQL 的架构和属性,以使您大致了解数据库系统的工作方式。此概述将帮助您了解应用程序架构、用户通常与之交互的方式,以及它如何通过扩展和安全功能支持数据完整性和增长。
PostgreSQL 的客户端/服务器架构
与许多关系型数据库系统一样,PostgreSQL 的基本架构遵循客户端-服务器模型。
主 PostgreSQL 程序作为服务运行,负责定义数据结构、存储数据和响应查询。此守护程序监听来自客户端的连接,客户端可以验证自己的身份,然后向服务器发送指令。服务器会响应消息,指示成功、失败、查询结果或其他适当的信息。
此架构允许 PostgreSQL 系统为许多不同的客户端提供服务,这些客户端可以在本地或通过网络连接。主 PostgreSQL 进程会为接收到的每个客户端连接派生一个新进程。因此,每个派生进程都专用于单个客户端连接,因此连接数、派生进程数和数据库会话数彼此一致。
概念
- 服务器 (server):在客户端-服务器架构中,服务器是一个软件,它接受来自外部客户端的连接以执行工作。它监听请求、处理适当的信息,并将任何相关结果返回给用户。
- 客户端 (client):在客户端-服务器架构中,客户端是一个软件,用户通过它与服务器连接和通信。客户端将用户的请求中继到服务器,并将任何相关信息传递回用户。
- 派生 (fork):派生是正在运行的进程的克隆,通常用于帮助控制资源使用、权限级别并创建新的执行环境。
- 数据库会话 (database session):数据库会话是数据库服务器和客户端之间的单个连续连接。会话有自己的上下文,该上下文在会话的生命周期内持续存在,从而允许在每个会话的基础上进行一定程度的状态和配置。
PostgreSQL 的默认客户端:psql
用户可以使用各种客户端连接到 PostgreSQL 服务器。作为 PostgreSQL 发行版一部分实现的默认命令行客户端称为 psql
。
psql
客户端可以连接到本地或远程数据库,并以批处理或交互方式处理查询。对于自动化用例,身份验证凭据可以存储在专用身份验证文件中,并且客户端可以从文件中读取查询。
交互式 psql
会话会在身份验证后将用户置于 PostgreSQL 命令提示符下。从那里,您可以将 SQL 发送到客户端,并在终端窗口中查看结果,或将其管道传输到输出文件。
您还可以通过在 psql
客户端中实现的一系列元命令来修改数据库并管理 PostgreSQL 本身。元命令是非 SQL 的“生活质量”快捷方式,以“\
”开头,使您可以查询有关数据结构和系统的信息。
例如,您可以使用 \dt
元命令列出所有可用的表,或使用 \conninfo
元命令显示有关当前连接的信息。您可以在 psql
会话期间使用 \h
和 \?
元命令分别获取有关 SQL 或元命令的信息。
概念
- 批处理 (batch processing):批处理是一种策略,用于成组而不是逐个执行一组操作。批处理通常是自动化工作流程的组成部分,因为它允许脚本和其他进程发送复合请求。
- 交互式会话 (interactive session):交互式会话是用户使用临时命令与数据库界面交互的数据库会话。这与非交互模式形成对比,在非交互模式中,整套指令在没有用户干预的情况下发送到服务器。
- 元命令 (meta-command):在
psql
中,元命令是由psql
本身而不是数据库系统作为 SQL 语句截获和处理的命令。这些主要是生活质量方面的改进,使用户无需记住复杂的查询即可获取有关数据库服务器、连接和数据库对象结构的信息。
Prisma Client 是使用 PostgreSQL 连接器处理 PostgreSQL 数据库的另一种强大方法。您可以按照我们的 PostgreSQL 入门指南进行尝试
使用 PostgreSQL 角色和权限进行身份验证和授权
PostgreSQL 使用角色和权限来验证谁正在连接到系统,并确定他们被允许执行哪些操作。
在 PostgreSQL 中,角色是特定功能、权限和“拥有”实体的分组。PostgreSQL 没有“用户”和“组”的独特概念,而是使用角色来表示这两种概念。角色可以对应于现实世界中的个人,也可以作为其他角色可以成为成员的具有特定访问权限的组来运作。
此系统在组织访问级别方面提供了极大的灵活性。身份验证方法可以根据角色定义,并且可以向特定角色授予对特定数据库实体的授权。作为其他角色成员的角色将从这些角色继承访问权限。
PostgreSQL 具有一些重要的默认设置,这些设置会影响用户登录和权限的开箱即用行为。新的安装通常配置为对等身份验证 (peer authentication),这允许用户自动验证到任何与其操作系统用户匹配的 PostgreSQL 角色。基本上,这会将用户身份验证卸载到操作系统。任何具有匹配 PostgreSQL 角色名称的操作系统用户都被假定为信任该身份。必须单独授予对数据库执行有用工作的授权。
概念
- 角色 (roles):在 PostgreSQL 中,角色是个人用户和用户组的替代和组合。用户可以验证角色身份以获取对其权限的访问权限。角色可以成为其他角色的成员以继承其权限。
- 对等身份验证 (peer authentication):对等身份验证是默认情况下为大多数 PostgreSQL 安装配置的默认身份验证机制。对等身份验证允许用户在没有其他凭据的情况下验证到与其操作系统用户名匹配的 PostgreSQL 角色。对等身份验证基于系统管理员也是数据库管理员的假设。
- 授权 (grants):PostgreSQL 中的授权是声明分配给角色的执行特定操作的权限。角色也可以“被授予”另一个角色的成员资格,从而使它们继承父角色的任何授权。
了解 PostgreSQL 对象层次结构:数据库、模式和表
在大多数情况下,PostgreSQL 在数据库对象方面遵循传统的关系型数据库命名约定。但是,PostgreSQL 与通用定义不同的一个点是它定义模式 (schema)的方式。
大多数数据库使用术语“模式 (schema)”来指代数据库中的通用数据库结构或表定义。例如,您可能会看到或 SQL,它定义了具有产品 ID、描述和计数字段以及相关约束的 product
表,称为 product
表的模式 (schema)。
但是,PostgreSQL 模式 (schema)是一个特定的数据库对象,可以在系统中创建和管理。了解 PostgreSQL 中对象的层次结构可以帮助您在了解系统和阅读文档时避免混淆。
PostgreSQL 的主要“全局”对象是数据库集群 (database cluster),它只是 PostgreSQL 服务器管理的数据库集合的名称。数据库集群包含数据库、角色和其他“全局”实体。
模式 (schema) 在数据库中定义为表、函数、数据类型和运算符的容器。对象名称在模式 (schema)内必须是唯一的,但可以在不同的模式 (schema) 中重复使用,这允许用户共享数据库而不会发生命名冲突。它们还有助于通过分段和隔离数据库中的对象来对对象进行分组或管理第三方应用程序。
表和其他对象在模式 (schema) 中创建。默认情况下,如果未命名替代模式 (schema),则在定义表和其他对象时使用名为 “public” 的模式 (schema)。实际上,这使得使用模式 (schema) 进行分段成为一种可选做法。在许多情况下,使用 PostgreSQL 模式 (schema) 会很有帮助,但如果您不需要它们,则可以忽略它们。
概念
- 数据库集群 (database cluster):在 PostgreSQL 术语中,数据库集群是由单个 PostgreSQL 服务器管理的数据库和相关对象的集合。数据库集群是由 PostgreSQL 服务器管理的环境。
- 数据库 (database):数据库是数据库集群中的一个对象,它定义了模式 (schema)、角色和其他对象。由于角色是在数据库中定义的,因此数据库是用户进行身份验证的对象。
- 模式 (schema):在 PostgreSQL 中,模式 (schema) 是数据库中的命名空间对象。模式 (schema) 包含表、数据类型、函数和运算符。对象名称在模式 (schema) 内必须是唯一的,但相同的名称可能存在于不同的模式 (schema) 中。
- 表 (table):表是 PostgreSQL 中的主要数据定义结构。表定义字段和约束以控制可以输入的数据类型。表以记录的形式在它们定义的结构中存储数据。
使用 Prisma Client 时,Prisma 模式中的数据模型等效于 PostgreSQL 中的表。
并发和隔离控制
数据库并发和隔离控制帮助系统管理多个用户尝试同时访问相同数据的情况。数据库必须有一种策略来处理这种情况,以避免不一致的读取、提交冲突的更改和竞争条件,这一点很重要。
PostgreSQL 使用称为多版本并发控制 (MVCC) 的策略来处理这些情况。MVCC 的工作原理是对关联数据的快照执行 SQL 语句。此数据快照提供事务隔离,从而确保每个事务都可以独立应用或回滚,并且它们对一致的数据集进行操作。
这种并发管理使 PostgreSQL 可以避免锁定 (locking),锁定 (locking) 是一种技术,它在操作期间向一个进程授予对数据的独占访问权。锁定 (locking) 在帮助进行隔离控制的同时,会阻止并发访问并影响性能,因为查询会等待锁被释放才能访问数据。
PostgreSQL 的 MVCC 实现允许读取和写入语句永远不会相互阻塞,这可能会对性能产生深远的影响。根据您对不同类型隔离问题的容忍度,可以使用多个级别的事务隔离。如果您想使用自己的系统管理更精细的并发范围,还可以使用表级和行级锁定。
概念
- 事务隔离 (Transaction isolation):事务隔离是一种确保事务具有原子性和一致性的质量。这意味着事务中的操作要么全部应用于数据,要么全部回滚。事务隔离还保证外部进程无法更改事务正在操作的数据,直到事务结束。
- MVCC:MVCC,或多版本并发控制,是一种通过对数据的一致快照执行操作来实现事务隔离的策略。每个事务都将收到其自己的数据副本,以在事务中使用。
- 锁定 (Locking):数据库、表或行锁定是一种策略,旨在通过在事务的生命周期内为进程提供对一定范围的数据的独占访问权来防止不准确的读取并避免冲突的写入。锁定是有效的,但由于不允许并发访问,因此会严重影响性能。
复制、负载均衡和高可用性
PostgreSQL 提供了多种解决方案,用于将工作负载分散到多台服务器上,或者在主服务器出现问题时切换到辅助服务器。
负载均衡 (load balancing)是一种策略,它涉及在多台数据库服务器上复制数据并在它们之间交替请求,以增加可以并发执行的工作量。同样,高可用性 (high availability)是一种策略,它允许辅助数据库服务器在第一个数据库服务器出现问题时接管其职责,从而减少数据不可用的时间。通过结合预写式日志 (WAL) 和复制 (replication),这两种策略在 PostgreSQL 中都是可行的。
预写式日志 (Write-Ahead Logging)是一种用于保证数据完整性的技术,方法是在实际将更改应用于数据库之前,将所有更改写入日志文件。如果在事务期间发生故障,PostgreSQL 可以通过检查日志来准确确定哪些操作已应用于数据库。然后可以回滚任何部分应用的事务,因为系统确切地知道预期的更改是什么。
WAL 对于负载均衡和高可用性非常重要,因为它与复制 (replication) 有关。复制 (replication)是在两个或多个数据库服务器之间镜像数据和所有数据库操作的过程。它是实现负载均衡和高可用性的主要方法,因为它提供了一种在服务器之间复制数据的方法。
PostgreSQL 可以支持许多不同类型的复制 (replication),每种复制在粒度、数据丢失保护、性能和复杂性方面都有权衡。复制 (replication) 架构可以是简单的,例如将数据复制到单个备用服务器,也可以是复杂的,其架构通过具有不同程度延迟的多个主机中继复制 (replication)。这些选择使您可以灵活地配置环境,以满足您对性能、扩展和数据可用性的需求。
概念
- 预写式日志 (Write-Ahead Logging):预写式日志 (Write-Ahead Logging) 或 WAL 是一种策略,旨在通过在数据库上执行预期数据库操作之前,将该操作写入持久日志,从而防止服务器故障期间的数据丢失。WAL 允许数据库通过回滚部分应用的操作来从故障中恢复。这有助于确保系统内的数据处于一致状态。
- 复制 (Replication):复制 (Replication) 是一个过程,涉及将数据和数据操作从一台服务器复制到另一台服务器。这允许单独的服务器维护同步的数据集。可以使用不同类型的复制 (replication) 来平衡不同级别的可用性、故障容忍度、性能和复杂性。
- 主服务器 (Primary server):在复制数据时,主服务器(在某些上下文中称为主服务器)是对“主”服务器的指定,该服务器可以接受写入查询并维护初始数据集和操作。
- 辅助服务器 (Secondary server):在复制数据时,辅助服务器(在某些上下文中称为备用服务器)是通过复制执行的每个操作来将其数据与主服务器同步的服务器。
结论
PostgreSQL 是一个功能非常强大的数据库,它非常灵活,足以胜任许多不同的任务。客户端-服务器模型、用户管理系统、对象层次结构以及并发和复制功能是使 PostgreSQL 能够出色运行的基础部分。了解 PostgreSQL 开发人员所做的基本设计选择可以简化您掌握该系统的过程。