分享到

概述

PostgreSQL 是一个功能强大的关系型数据库,能够服务于许多不同的用例。在将它用于您的项目之前,最好先了解 PostgreSQL 的工作原理、它与其他关系型数据库的不同之处,以及可用于帮助您建模和管理数据的功能。

本指南将介绍 PostgreSQL 的架构和属性,让您大致了解数据库系统的工作方式。此概述将帮助您了解应用程序架构、用户通常与之交互的方式,以及它如何通过扩展和安全功能来支持数据完整性和增长。

PostgreSQL 的客户端/服务器架构

与许多关系型数据库系统一样,PostgreSQL 的基本架构遵循客户端-服务器模型。

主要的 PostgreSQL 程序作为服务运行,负责定义数据结构、存储数据和响应查询。此守护程序侦听来自客户端的连接,客户端可以对其自身进行身份验证,然后向服务器发送指令。服务器响应消息,指示成功、失败、查询结果或其他适当的信息。

此架构允许 PostgreSQL 系统为许多不同的客户端提供服务,这些客户端可以在本地或通过网络连接。主 PostgreSQL 进程为它接收的每个客户端连接 fork 一个新进程。因此,每个 fork 都专用于单个客户端连接,因此连接数、fork 数和数据库会话数彼此对齐。

概念

  • 服务器:在客户端-服务器架构中,服务器是一种软件,它接受来自外部客户端的连接以执行工作。它侦听请求、处理适当的信息,并将任何相关结果返回给用户。
  • 客户端:在客户端-服务器架构中,客户端是一种软件,用户通过它与服务器连接和通信。客户端将用户的请求中继到服务器,并将任何相关信息传递回去。
  • Fork:Fork 是正在运行的进程的克隆,通常用于帮助控制资源使用、权限级别和创建新的执行环境。
  • 数据库会话:数据库会话是数据库服务器和客户端之间的单个连续连接。会话有自己的上下文,该上下文在会话的生命周期内持续存在,从而允许在每个会话的基础上进行一定程度的状态和配置。

PostgreSQL 的默认客户端:psql

用户可以使用各种客户端连接到 PostgreSQL 服务器。作为 PostgreSQL 发行版一部分实现的默认命令行客户端称为 psql

psql 客户端可以连接到本地或远程数据库,并以批处理或交互方式处理查询。对于自动化用例,身份验证凭据可以存储在专用身份验证文件中,查询可以由客户端从文件中读取。

交互式 psql 会话在身份验证后将用户置于 PostgreSQL 命令提示符下。从那里,您可以将 SQL 发送到客户端,并在终端窗口中查看结果或将其通过管道传输到输出文件。

您还可以通过在 psql 客户端中实现的一系列元命令来修改数据库并管理 PostgreSQL 本身。元命令是以“\”开头的非 SQL“生活质量”快捷方式,允许您查询有关数据结构和系统的信息。

例如,您可以使用 \dt 元命令列出所有可用的表,或使用 \conninfo 元命令显示有关当前连接的信息。您可以在 psql 会话期间使用 \h\? 元命令来分别获取有关 SQL 或元命令的信息。

概念

  • 批处理:批处理是一种策略,它以组的形式而不是逐个执行一组操作。批处理通常是自动化工作流程的组成部分,因为它允许脚本和其他进程发送复合请求。
  • 交互式会话:交互式会话是用户使用临时命令与数据库界面交互的数据库会话。这与非交互模式形成对比,在非交互模式中,整套指令在没有用户干预的情况下发送到服务器。
  • 元命令:在 psql 中,元命令是由 psql 本身而不是数据库系统作为 SQL 语句截获和处理的命令。这些主要是生活质量的改进,允许用户获取有关数据库服务器、连接和数据库对象结构的信息,而无需记住复杂的查询。

使用 PostgreSQL 角色和权限进行身份验证和授权

PostgreSQL 使用角色和权限来验证谁正在连接到系统,并确定他们被允许执行哪些操作。

在 PostgreSQL 中,角色是特定能力、权限和“拥有的”实体的分组。PostgreSQL 没有“用户”和“组”的独特概念,而是使用角色来表示这两种概念。角色可以对应于现实世界中的个人,也可以作为具有某些访问权限的组来运作,其他角色可以成为该组的成员。

该系统在组织访问级别方面提供了极大的灵活性。身份验证方法可以根据角色定义,并且可以向特定角色授予对特定数据库实体的授权。作为其他角色成员的角色将从这些角色继承访问权限。

PostgreSQL 有一些重要的默认设置,这些设置会影响用户登录和权限的开箱即用行为。新安装通常配置为对等身份验证,这允许用户自动向任何与其操作系统用户匹配的 PostgreSQL 角色进行身份验证。基本上,这会将用户身份验证卸载到操作系统。任何具有匹配 PostgreSQL 角色名称的操作系统用户都被假定为信任该身份。必须单独授予对数据库执行有用工作的授权。

概念

  • 角色:在 PostgreSQL 中,角色是个人用户和用户组的替代和组合。用户可以对角色进行身份验证以获得对其权限的访问权限。角色可以成为其他角色的成员以继承其权限。
  • 对等身份验证:对等身份验证是大多数 PostgreSQL 安装默认配置的默认身份验证机制。对等身份验证允许用户在没有其他凭据的情况下,使用与其操作系统用户名匹配的 PostgreSQL 角色进行身份验证。对等身份验证基于系统管理员也是数据库管理员的假设。
  • 授权:PostgreSQL 中的授权是声明分配给角色的执行特定操作的权限。角色也可以被“授权”成为另一个角色的成员,从而使它们继承父角色的任何授权。

了解 PostgreSQL 对象层次结构:数据库、模式和表

在大多数情况下,PostgreSQL 在数据库对象方面遵循传统的关联式数据库命名约定。但是,PostgreSQL 与常用定义不同的一个点是它定义模式的方式。

大多数数据库使用“模式”一词来指代数据库中的通用数据库结构或表定义。例如,您可能会看到或 SQL,它定义了具有产品 ID、描述和计数字段以及相关约束的 product 表,称为 product 表的模式。

但是,PostgreSQL 模式是一个特定的数据库对象,可以在系统中创建和管理。了解 PostgreSQL 中对象的层次结构可以帮助您避免在了解系统和阅读文档时产生混淆。

PostgreSQL 的主要“全局”对象是数据库集群,它只是 PostgreSQL 服务器管理的数据库集合的名称。数据库集群包含数据库、角色和其他“全局”实体。

模式在数据库中定义为表、函数、数据类型和运算符的容器。对象名称在模式内必须是唯一的,但可以在不同的模式中重复使用,这允许用户共享数据库而不会发生命名冲突。它们还有助于通过对数据库中的对象进行分段和隔离来对对象进行分组或管理第三方应用程序。

表和其他对象在模式中创建。默认情况下,如果在定义表和其他对象时未命名备用模式,则使用名为 “public” 的模式。实际上,这使得使用模式进行分段成为一种可选做法。在许多情况下使用 PostgreSQL 模式很有帮助,但如果您不需要,可以忽略它们。

概念

  • 数据库集群:在 PostgreSQL 术语中,数据库集群是由单个 PostgreSQL 服务器管理的数据库和相关对象的集合。数据库集群是由 PostgreSQL 服务器管理的环境。
  • 数据库:数据库是数据库集群中的一个对象,它定义模式、角色和其他对象。由于角色是在数据库中定义的,因此数据库是用户对其进行身份验证的对象。
  • 模式:在 PostgreSQL 中,模式是数据库中的命名空间对象。模式包含表、数据类型、函数和运算符。对象名称在模式内必须是唯一的,但相同的名称可能存在于不同的模式中。
  • :表是 PostgreSQL 中的主要数据定义结构。表定义字段和约束以控制可能输入的数据类型。表将数据存储在它们定义为记录的结构中。

并发和隔离控制

数据库并发和隔离控制帮助系统管理多个用户尝试同时访问相同数据的情况。数据库必须有一种处理此问题的策略,以避免不一致的读取、提交冲突的更改和竞争条件,这一点很重要。

PostgreSQL 使用一种称为多版本并发控制 (MVCC)的策略来处理这些场景。MVCC 通过对关联数据的快照执行 SQL 语句来工作。此数据快照提供事务隔离,这确保每个事务都可以独立应用或回滚,并且它们在一致的数据集上运行。

这种并发管理使 PostgreSQL 能够避免锁定,这是一种为操作期间的单个进程提供对数据的独占访问权限的技术。锁定虽然有助于隔离控制,但会阻止并发访问并影响性能,因为查询会等待锁被释放才能访问数据。

PostgreSQL 的 MVCC 实现允许读取和写入语句永远不会相互阻塞,这可能会对性能产生深远的影响。根据您对不同类型隔离问题的容忍度,可以使用多个级别的事务隔离。如果您想使用自己的系统管理更精细的并发范围,也可以使用表级和行级锁定。

概念

  • 事务隔离:事务隔离是一种质量,可确保事务是原子且一致的。这意味着事务中的操作要么全部应用于数据,要么全部回滚。事务隔离还保证外部进程在事务期间无法更改事务正在操作的数据。
  • MVCC:MVCC,或多版本并发控制,是一种通过对数据的一致快照执行操作来实现事务隔离的策略。每个事务都将收到自己的数据副本,以在事务中使用。
  • 锁定:数据库、表或行锁定是一种策略,它通过在事务的生命周期内为进程提供对特定数据范围的独占访问权限来防止不准确的读取并避免冲突的写入。锁定是有效的,但由于不允许并发访问,因此会严重影响性能。

复制、负载均衡和高可用性

PostgreSQL 提供了多种解决方案,用于将工作负载分布在多台服务器上,或者在主服务器出现问题时切换到辅助服务器。

负载均衡是一种策略,它涉及在多台数据库服务器上复制数据并在它们之间交替请求,以增加可以并发执行的工作量。同样,高可用性是一种策略,它允许辅助数据库服务器在第一台服务器出现问题时接管其职责,从而减少数据不可用的时间量。这两种策略在 PostgreSQL 中都可以通过预写式日志 (WAL)复制的组合来实现。

预写式日志是一种用于保证数据完整性的技术,它在实际将所有更改应用于数据库之前,将所有更改写入日志文件。如果在事务期间发生故障,PostgreSQL 可以通过检查日志来准确确定哪些操作已应用于数据库。任何部分应用的事务都可以回滚,因为系统确切地知道预期的更改是什么。

WAL 对于负载均衡和高可用性非常重要,因为它与复制有关。复制是在两个或多个数据库服务器之间镜像数据和所有数据库操作的过程。它是通过提供在服务器之间复制数据的方式来实现负载均衡和高可用性的主要方法。

PostgreSQL 可以支持许多不同类型的复制,每种复制在粒度、数据丢失保护、性能和复杂性方面都有权衡。复制架构可以很简单,例如将数据复制到单个备用服务器,也可以很复杂,例如通过具有不同延迟程度的多个主机中继复制的架构。这些选择使您可以灵活地配置环境以满足您对性能、扩展和数据可用性的需求。

概念

  • 预写式日志:预写式日志 (WAL) 是一种通过在数据库上执行预期数据库操作之前将该操作写入持久日志来防止服务器故障期间数据丢失的策略。WAL 允许数据库通过回滚部分应用的操作从故障中恢复。这有助于确保系统内的数据处于一致状态。
  • 复制:复制是一个涉及将数据和数据操作从一台服务器复制到另一台服务器的过程。这允许单独的服务器维护同步的数据集。可以使用不同类型的复制来平衡不同级别的可用性、容错能力、性能和复杂性。
  • 主服务器:在复制数据时,主服务器(在某些上下文中称为主服务器)是“主”服务器的指定,它可以接受写入查询并维护初始数据集和操作。
  • 辅助服务器:在复制数据时,辅助服务器(在某些上下文中称为备用服务器)是通过复制执行的每个操作来将其数据与主服务器同步的服务器。

结论

PostgreSQL 是一个功能非常强大的数据库,它非常灵活,足以胜任许多不同的任务。客户端-服务器模型、用户管理系统、对象层次结构以及并发和复制功能是使 PostgreSQL 能够出色运行的基本组成部分。了解 PostgreSQL 开发人员所做的基本设计选择可以简化您掌握该系统的过程。

关于作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以来一直撰写关于数据库、Linux、基础设施和开发者工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。