Azure Databases for PostgreSQL 简介

已完成

Azure Database for PostgreSQL 提供了多服务器版本。

作为在运行和管理本地 PostgreSQL 安装方面具有多年经验的数据库开发人员,你需要了解 Azure Database for PostgreSQL 支持和缩放其功能的方式。

在此单元中,你将了解 Azure Database for PostgreSQL 的定价、版本支持、复制和缩放选项。

Azure Database for PostgreSQL

Azure Database for PostgreSQL 服务实现的是 PostgreSQL 的社区版本。 该服务提供典型的 PostgreSQL 系统使用的常用功能,包括地理空间支持和全文搜索。

Microsoft 针对 Azure 平台改编了 PostgreSQL,并与许多 Azure 服务紧密集成。 Azure Database for PostgreSQL 服务由 Microsoft 完全托管。 Microsoft 处理软件的更新和修补程序,并提供 99.99% 可用性的 SLA。 这意味着可以使用该服务仅专注于正在运行的数据库和应用程序。

你可以在此服务的每个实例中部署多个数据库。

定价层

在创建 Azure Database for PostgreSQL 服务的实例时,可以通过选择“定价层”来指定要分配的计算和存储资源。 定价层结合了虚拟处理器核心数、可用存储量和各种备份选项。 分配的资源越多,成本就越高。

Azure Database for PostgreSQL 服务使用存储来保存数据库文件、临时文件、事务日志和服务器日志。 你可以选择指定希望在接近当前容量时增加可用存储。 如果不选择此选项,存储空间不足的服务器将继续运行,但将以只读方式运行。

Azure 门户将定价层分为三大范围:

  • 基本,适用于小型系统和开发环境,但具有可变的 I/O 性能。
  • 常规用途,提供可预测的性能,最高可达 6000 IOPS(具体取决于处理器核心数和可用的存储空间)。
  • 内存优化,最多使用 32 个经内存优化的虚拟处理器核心,并可提供高达 6000 IOPS 的可预测性能。

Microsoft 还在预览版中提供了一个 “大容量存储”选项,该选项可预配高达 16 TB 的存储,并支持高达 20,000 IOPS。

你可以微调所需的处理器核心数和存储量。 创建数据库后,可以增加和减少处理资源(存储只能增加,不能减少),并根据需要在“常规用途”和“内存优化”定价层之间进行切换。 只需为所需部分付费。

Image showing the pricing tiers in the Azure portal

注意

如果更改处理器核心数,Azure 会基于此计算分配创建新的服务器。 服务器运行时,客户端连接将切换到新服务器。 此切换过程最多可能需要一分钟。 在此时间间隔期间,无法建立新的连接,并且所有正在进行中的事务都将回滚。

如果仅更改备份选项的存储大小,则不会中断服务。

定价层和分配的处理资源确定了该服务将支持的最大并发连接数。 例如,如果选择“常规用途”定价层并分配 64 个虚拟核心,则该服务支持 1900 个并发连接。 基本层具有两个虚拟核心,可处理多达 100 个并发连接。 Azure 本身需要其中五个连接来监视服务器。 如果超过可用连接数,客户端将收到错误“FATAL: 抱歉,已有太多客户端”。

价格可能会更改。 请访问 Azure Database for PostgreSQL 定价页了解最新信息。

服务器参数

在本地安装的 PostgreSQL 中,可在 postgresql.conf 文件中设置服务器配置参数。 使用 Azure Database for PostgreSQL 通过“服务器参数”页修改配置参数。 并非本地安装的 PostgreSQL 的所有参数都与 Azure Database for PostgreSQL 相关,因此“服务器参数”页仅会列出适用于 Azure 的那些参数。

Image showing the Server parameters page in the Azure portal

对标记为“动态”的参数所做的更改会立即生效。 静态参数需要重启服务器。 使用门户中的“概述”页上的“重启”按钮来重启服务器:

Image showing the Overview page in the Azure portal with the Restart button highlighted

高可用性

Azure Database for PostgreSQL 是一种高度可用的服务。 它包含内置的故障检测和故障转移机制。 如果某处理节点由于硬件或软件问题而停滞,则将切换一个新节点来替换该节点。 当前使用该节点的所有连接都将被删除,但这些连接会对新节点自动开启。 故障节点正在执行的所有事务都将回滚。 因此,应始终确保将客户端配置为检测并重试失败的操作。

支持的 PostgreSQL 版本

当前,Azure Database for PostgreSQL 服务支持 PostgreSQL 版本 11 至版本 9.5。 在创建服务实例时可以指定要使用的 PostgreSQL 版本。 Microsoft 的目标是在新版本的 PostgreSQL 可用时更新该服务,并将保持与前面两个主版本的兼容性。

Azure 会自动管理 PostgreSQL 的次要版本(而不是主版本)之间的数据库升级。 例如,如果你有使用 PostgreSQL 版本 10 的数据库,则 Azure 可以自动将该数据库升级到版本 10.1。 如果要切换到版本 11,则必须从当前服务实例的数据库中导出数据,创建一个新的 Azure Database for PostgreSQL 服务实例,然后将数据导入到该新实例中。

协调器和工作器节点

数据在工作器节点之间进行分片和分配。 协调器中的查询引擎可以并行执行复杂查询,将处理定向到适当的工作器节点。 根据正在处理的数据所在的分片来选择工作器节点。 然后,协调器会先收集工作器节点中的结果,然后再将它们发送回客户端。 较简单的查询可以仅使用单个工作器节点来执行。 客户端也连接到协调器,并且从不直接与工作器节点通信。

可以根据需要在服务中增加和减少工作器节点的数量。

分配数据

通过创建分布式表,可以在工作器节点之间分配数据。 分布式表会拆分为多个分片,每个分片都分配给工作器节点上的存储。 你可以通过将列定义为分布列来指示如何拆分数据。 根据此列中的数据值对数据进行分片。 设计分布式表时,请务必仔细选择分布列;应使用包含大量非重复值的列,这些值通常用于对相关行进行分组。 例如,在用于存储有关客户订单信息的电子商务系统表中,客户 ID 可能是一个合理的分布列。 给定客户的所有订单将保存在同一分片中,但是所有客户的订单将分布在多个分片中。

你还可以创建引用表。 这些表包含查找数据,例如城市名称或状态代码。 引用表会完整复制到每个工作器节点。 引用表中的数据应是相对静态的;每次更改都需要更新该表的所有副本。

最后,可以创建本地表。 本地表不分片,但存储在协调器节点上。 本地表用于保存包含联接不太可能需要的数据的小型表。 示例包括用户名及其登录详细信息。

将数据复制到 Azure Database for PostgreSQL

只读副本适用于处理读取密集型工作负载。 客户端连接可以分布在多个副本中,从而减轻了单个服务实例的负担。 如果客户端位于世界的不同区域,则可以使用跨区域复制来将数据置于靠近每组客户端的位置,从而减少延迟。

你还可以将副本用作灾难恢复应变计划的一部分。 如果主服务器不可用,则仍然可以连接到副本。

注意

如果主服务器丢失或删除,则所有只读副本将改为读写服务器。 但是,这些服务器将彼此独立,因此对一个服务器中的数据所做的任何更改都不会复制到其余的服务器。

建立副本

只读副本包含原始服务器(称为主服务器)中保存的数据库的副本。 可使用 Azure 门户或 CLI 创建主服务器的副本。

Image showing the Replication page for the Azure Database for PostgreSQL service

创建只读副本时,Azure 会创建新的 Azure Database for PostgreSQL 服务实例,然后将数据库从主服务器复制到新服务器。 副本以只读模式运行。 任何修改数据的尝试都将失败。

副本滞后时间

复制不是同步的,对主服务器中的数据所做的任何更改都可能需要一段时间才会显示在副本中。 连接到副本的客户端应用程序必须能够处理此级别的最终一致性。 借助 Azure Monitor,可以通过使用“跨副本最大滞后时间”和“副本滞后时间”指标来跟踪复制的滞后时间。

监视和管理

你可以使用熟悉的工具(例如 pgAdmin)连接到 Azure Database for PostgreSQL,以管理和监视数据库。 但某些与服务器相关的功能(如执行服务器备份和恢复)无法使用,因为服务器由 Microsoft 管理和维护。

Image showing the pgAdmin tool connected to Azure Database for PostgreSQL

用于监视 Azure Database for PostgreSQL 的 Azure 工具

Azure 提供了大量的服务,可用于监视服务器和数据库的性能以及排查问题。 使用这些服务可以查看 PostgreSQL 如何利用分配的 Azure 资源。 可以使用此信息来评估是否需要缩放系统,修改数据库中表和索引的结构,以及直观呈现运行时统计信息和其他事件。 提供的服务包括:

  • Azure Monitor。 借助 Azure Database for PostgreSQL 提供的指标,可以跟踪 CPU 和存储利用率、I/O 速率、内存占用率、活动连接数以及复制滞后时间等项:

    Image showing the Azure Monitor with metrics for Azure Database for PostgreSQL

  • 服务器日志。 Azure 为每个 PostgreSQL 服务器提供日志。 可以从 Azure 门户下载它们:

    Image showing the server logs for an instance of the Azure Database for PostgreSQL service

  • 查询存储和 Query Performance Insight。 Azure Database for PostgreSQL 会存储针对服务器上的数据库运行的查询的相关信息,并将其保存到 query_store 架构中名为 azure_sys 的数据库中。 可以查询 query_store.qs_view 视图以查看此信息。 默认情况下,Azure Database for PostgreSQL 不会捕获任何查询信息,因为这会产生少量开销,但可以通过将 pg_qs.query_capture_mode 服务器属性设置为“ALL”或“TOP”来启用跟踪。

    Image showing the server server parameters page for Azure Database for PostgreSQL

    你还可以配置查询存储以捕获花费时间等待的查询的相关信息。 查询在以下情况下可能必须等待:另一个查询释放对表的锁定;或者因为该查询正在执行大量 I/O;或者因为内存不足。 在 query_store.runtime_stats_view 视图中可查看此信息。

    如果你更愿意直观呈现这些统计信息而不是运行 SQL 语句,请在 Azure 门户中使用 Query Performance Insight:

    Image showing Query Performance Insight

  • 性能建议。 Azure 门户中还提供了性能建议实用程序,用于检查应用程序正在运行的查询。 它还可查看数据库中的结构,并就如何组织数据以及是否应考虑添加或删除索引给出建议。

客户端连接性

Azure Database for PostgreSQL 在防火墙后面运行。 若要访问服务和数据库,必须针对客户端连接的 IP 地址范围添加防火墙规则。 如果需要从 Azure 内部(例如使用 Azure 应用服务运行的应用程序)访问服务,则还必须启用对 Azure 服务的访问。

配置防火墙

要配置防火墙,最简单的方法是在 Azure 门户中使用服务的“连接安全性”设置。 为每个客户端 IP 地址范围添加规则。 还可以使用此页强制执行到服务的 SSL 连接。

Image showing the firewall configuration for Azure Database for PostgreSQL

单击工具栏中的“添加客户端 IP”,添加桌面计算机的 IP 地址。

如果已配置只读副本,则必须向每个副本添加防火墙规则,以使其可供客户端访问。

客户端连接库

如果要编写自己的客户端应用程序,则必须使用相应的数据库驱动程序来连接到 PostgreSQL 数据库。 这些库中有许多都依赖于编程语言。 它们由独立的第三方维护。 Azure Database for PostgreSQL 支持适用于 Python、PHP、Node.js、Java、Ruby、Go、C# (.NET)、ODBC、C 和 C++ 的客户端库。

客户端重试逻辑

如前所述,某些事件(例如高可用性恢复期间的故障转移以及扩展 CPU 资源)可能会导致短暂的连接丢失。 任何正在进行的事务都将回滚。 Azure Database for PostgreSQL 会自动将已连接的客户端重定向到正常工作的节点,但是该客户端当时正在执行的所有操作都将返回错误。 此事件应视为暂时性异常。 应用程序代码应准备好捕获这些异常并重试。

Azure Database for PostgreSQL 中支持的 PostgreSQL 功能

Azure Database for PostgreSQL 支持 PostgreSQL 数据库常用的大多数功能,但也有一些例外。 如果需要不受支持的功能,则需要改编数据库和应用程序代码以删除此依赖项,或者考虑在虚拟机中运行 PostgreSQL。 在后一种情况下,你必须负责管理和维护服务器。

Azure Database for PostgreSQL 中支持的扩展

许多 PostgreSQL 功能都封装在扩展中。 扩展是存储在服务器上的 SQL 对象和代码构成的包,可使用 CREATE EXTENSION 命令将它们加载到数据库中。 Azure Database for PostgreSQL 当前提供了许多常用扩展,包括:

  • 数据类型
  • 函数
  • 全文搜索
  • 索引(bloom、btree_gist 和 btree_gin)
  • Plpgsql 语言
  • PostGIS
  • 许多管理功能

使用 dblink 和 postgres_fdw 包将一个 PostgreSQL 服务器连接到另一个 PostgreSQL 服务器,从而使一个服务器中的代码可以访问另一个服务器中保存的数据。 在 Azure Database for PostgreSQL 中,只能在使用 Azure Database for PostgreSQL 创建的服务器之间进行连接。 无法创建到其他位置(例如本地或虚拟机)中托管的 PostgreSQL 服务器的出站连接。

注意

支持的扩展列表不断接受审查,并且可能会更改。 你将生成以下查询支持的扩展列表。 请注意,不能创建自己的自定义扩展并将其上传到 Azure Database for PostgreSQL:

SELECT * FROM pg_available_extensions;

Azure Database for PostgreSQL 包括 TimescaleDB 数据库作为可选扩展。 该数据库包含时间导向型分析函数以及支持时序工作负载的其他功能。 若要使用此数据库,请在 shared_preload_libraries 服务器参数中选择“TIMESCALEDB”选项,然后重启服务器。

针对存储过程和触发器的语言支持

若要支持除 plpgsql 之外的其他语言,通常需要单独编译存储过程或触发器代码,然后将编译后的库上传到服务器。 主要是出于安全原因,无法使用 Azure Database for PostgreSQL 执行此操作。 如果有用其他语言编写的代码,则必须将其移植到 plpgsql。