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