分享到

概述

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

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

PostgreSQL 的客户端/服务器架构

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

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

这种架构允许 PostgreSQL 系统服务于许多可以通过本地或网络连接的不同客户端。主 PostgreSQL 进程为每个接收到的客户端连接派生一个新进程。因此,每个派生进程都专用于一个客户端连接,从而使连接、派生进程和数据库会话的数量相互一致。

概念

  • 服务器:在客户端-服务器架构中,服务器是接受外部客户端连接以执行工作的软件。它监听请求,处理相应的信息,并向用户返回任何相关结果。
  • 客户端:在客户端-服务器架构中,客户端是用户用于连接和与服务器通信的软件。客户端将用户的请求转发给服务器,并将任何相关信息传回。
  • 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 角色。对等认证基于系统管理员也是数据库管理员的假设。
  • 授权(grants):在 PostgreSQL 中,授权是分配给角色以执行特定操作的权限声明。角色也可以被“授予”成为另一个角色的成员,从而继承父角色的任何授权。

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

大部分情况下,PostgreSQL 在数据库对象命名方面遵循传统关系型数据库的约定。然而,PostgreSQL 与常见定义不同的一点在于它定义“模式”(schema)的方式。

大多数数据库使用“模式”一词来指代数据库中的通用数据库结构或表定义。例如,你可能会看到定义了包含产品 ID、描述和计数字段以及相关约束的 product 表的 SQL,这被称为 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 可以支持多种不同类型的复制,每种都有在粒度、数据丢失保护、性能和复杂性方面的权衡。复制架构可以是直接的,例如将数据复制到单个备用服务器;也可以是复杂的,例如通过多个主机以不同程度的延迟进行复制。这些选择为你提供了配置环境的灵活性,以满足你对性能、扩展和数据可用性的需求。

概念

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

结论

PostgreSQL 是一个功能极其强大的数据库,其灵活性足以在许多不同任务中表现出色。客户端-服务器模型、用户管理系统、对象层次结构以及并发和复制功能是使 PostgreSQL 良好运行的基础部分。了解 PostgreSQL 开发人员所做的基础设计选择可以帮助你更轻松地高效使用该系统。

关于作者
Justin Ellingwood

Justin Ellingwood

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