分享到

引言

Amazon Web Services 的关系型数据库服务 (RDS) 因其灵活性和强大的功能集而成为流行的数据库托管选项。开发团队可以为个人使用、staging 环境和生产工作负载预置新数据库,并将其与 AWS 的其他产品套件无缝集成。

在本指南中,我们将讨论如何使用 Amazon 的 RDS 配置一个生产级的 PostgreSQL 数据库。我们将详细介绍创建过程中的重要选项,讨论权衡,并配置一个专为早期生产部署设计的可靠、健壮的数据库设置。

为何选择 Amazon Web Services 的 RDS?

在开始之前,让我们简要谈谈为什么 AWS 的关系型数据库服务可能适合许多团队。

RDS 作为一项服务于 2009 年首次发布,是针对 MySQL 数据库的可配置、托管服务。PostgreSQL 支持于 2013 年添加,使该平台有充足时间在新功能发布和更多用例得到考虑后稳定和成熟。

使 RDS 成为一个有吸引力的选项的一些核心功能包括:

  • 部署到不同的物理位置(多可用区):在物理上独立的数据库中心创建活动或备用副本,以在发生基于位置的中断时提高可用性和可靠性
  • 与 AWS IAM 安全模型集成:利用现有的访问控制和身份功能,在数据库和客户端应用程序之间配置身份验证授权基于角色的访问策略
  • 可配置的备份、加密和监控:使用平台集成的备份、可观测性工具和加密,以降低并集中管理数据库的运营成本。
  • 按使用量计费:成本与数据库的功能和使用量直接挂钩,减轻了长期容量规划的不确定性。

考虑到这些优势,让我们开始设置一个 PostgreSQL 数据库实例,逐步完成整个过程。

开始数据库创建过程

首先,使用您的 AWS 凭证登录到您的 Amazon Web Services 控制台。如果您尚未注册 AWS,可以现在按照他们的注册流程进行。

在 AWS 控制台主页,在服务搜索栏中输入 rds 以找到 RDS 服务

Search for AWS RDS

点击服务下的 RDS 以进入 Amazon RDS 主页

Main RDS page

向下滚动直到您看到创建数据库部分,然后点击创建数据库

Create database button

您将被带到数据库创建页面,在那里您可以选择所需的配置。

Database creation page

在本指南的其余部分,我们将介绍可用的不同选项,并为生产级配置提供建议。

配置标准 PostgreSQL 部署选项

RDS 创建过程的第一部分决定了您希望如何配置数据库,以及新数据库的基本属性,如数据库引擎、部署类型和基本配置。我们开始吧。

配置创建方法

在 RDS 上预置新数据库的第一步是选择创建方法

Choose standard create

虽然简易创建方法可以帮助您选择一些合理的默认设置,但它无法提供您在为环境配置重要数据库时可能需要的灵活性。标准创建选项提供了更多选项,并且仍然是一个相对简单的过程。

选择标准创建,以便您对创建过程拥有完全控制权。

选择 PostgreSQL 引擎和版本

接下来,选择数据库引擎

Choose PostgreSQL engine

在本指南中,我们将配置一个 PostgreSQL 数据库,因此我们将选择 PostgreSQL 选项。Amazon 的 Aurora 是一个 PostgreSQL 兼容的替代选项,提供 Amazon 自有的扩展和管理功能。然而,在本指南中,我们将专注于 PostgreSQL 原生部署。

选择您希望使用的 PostgreSQL 版本。默认选择的版本通常是安全的,但您可能也希望选择最新版本以获取新功能,或者根据与应用程序库的兼容性选择旧版本。

选择生产模板

接下来,您将被要求选择一个模板

Choose production template

模板旨在提供与典型部署场景匹配的预选选项。由于我们正在预置生产数据库,请选择生产模板。

设置数据库可用性

下一节包括您在部署方面需要做出的第一个重要决定:数据库的可用性和持久性

Choose single DB instance

本节精确地决定了您的数据库在 AWS 环境中的部署方式。这会影响您的设置对故障和中断的抵抗能力,包括您的特定实例故障和亚马逊基础设施的区域中断。

让我们看看我们拥有的各种选项、它们提供什么以及它们适用于哪些场景。对于本指南,我们将推荐使用单个数据库实例,因此如果您对其他选项不感兴趣,可以随意跳过。

多可用区数据库集群

最安全、最健壮且最昂贵的选项是多可用区数据库集群。

这会配置一个 PostgreSQL 集群,包含一个主数据库实例和两个只读备用副本,每个副本部署在不同的物理位置。此选项有助于在发生故障时防止数据库中断,同时通过副本提高可用读取吞吐量。

话虽如此,此选项也非常昂贵,因为您必须为部署到不同可用区的三个独立数据库实例付费。

如果您的数据库停机时间直接导致收入的显著损失,这可能是一个不错的选择。如果您的典型数据库使用模式是读取密集型的,那么读取 IO 的增加也值得注意。如果这与您的用例匹配,您可能还需要考虑评估 Amazon Aurora,以获得类似级别的可用性,最终成本可能更低。

多可用区数据库实例

此选项将您的数据库部署为一个活动主实例以及一个在不同可用区中的备用副本。备用副本将保持最新状态,以便在主实例发生中断时,可以触发故障转移,并且备用副本可以承担主实例的职责。

与上面讨论的多可用区数据库集群不同,多可用区数据库实例只有一个备用副本。此外,备用副本只能用于其备用容量。它不支持只读工作负载。

如果您希望获得一定的可用性保护,而无需更高的读取吞吐量,此选项可能是一个不错的选择。您将不得不承担两个数据库实例的成本,因此价格会高于单个实例。如果停机时间对您的运营来说非常昂贵,这可能是一个很好的选项,可以在发生中断时防止可用性中断。

单个数据库实例

单个数据库实例是在一个可用区内对单个数据库的标准部署。这不提供额外的可用性,意味着您的数据库可用性直接取决于数据库实例的正常运行时间。如果它出现问题,您的数据库及其管理的所有数据将无法访问,直到服务恢复。

考虑到这一点,此选项也是最经济的。部署只包含一个实例,因此没有额外部署的资源需要您付费。

此选项存在一定风险,但对于许多用例而言,这种风险是可接受的,并且缓解风险的成本过高。Amazon RDS 在可靠性方面有着良好的记录,即使在单个可用区内也是如此,因此对于许多用例来说,短期停机的可能性是可接受的。

在本指南中,我们将选择单个数据库实例,因为它通常足以满足对停机时间不极其敏感的生产部署。但是,如果您的收入和声誉与数据库的正常运行时间密切相关,那么考虑不同的选择可能更明智。

配置基本设置

下一节允许您配置部署的基本设置

Configure basic settings

首先,您可以通过设置数据库实例标识符来命名您的数据库实例。选择一个独特的名称,这将有助于您在 AWS 控制台中显示数据库时了解其角色和用途。

接下来,配置您的数据库实例的凭证。首先设置您的 PostgreSQL 数据库的主用户名。默认情况下,大多数 PostgreSQL 客户端工具假定主用户名为 postgres,因此如果合适,您可以保留该用户名。

注意:主用户名是 PostgreSQL 数据库实例中的主要管理账户。在预置数据库实例后,您应始终创建并配置具有有限权限的额外应用程序专用用户名。配置您的数据库客户端和应用程序使用这些权限较低的身份进行日常操作。仅在初始配置时和创建更多受限、范围更窄的访问途径时使用主用户名。

然后,您可以选择为主用户名设置并确认密码。您可以选择一个强密码(最好是机器生成的),或者勾选自动生成密码框,让 AWS 自动为您生成一个安全密码。

如果您选择自己的密码,请将其保存在安全的地方,因为以后将无法找回。同样,如果您自动生成密码,您将只能在创建后第一次在 AWS 控制台中访问凭证时获取该密码。请务必安全地记录该密码,因为之后将无法再次找回。

选择数据库实例类型

您需要做出的下一个主要决定是您的数据库实例类型

Choose instance class

本质上,数据库的实例类型决定了您的数据库将部署到的虚拟机大小以及可用的资源。您可以选择不同类型的实例,以及每种类型中资源的组合。

实例类型的三大主要类别是:

  • 标准型:这些包括您可能熟悉的 AWS EC2(弹性计算云)实例中的“m”系列。基本上,它们是平衡良好的通用实例,旨在提供合理的 CPU 与内存比。
  • 内存优化型:这些包括 EC2 的“r”和“x”实例类型。此类别中的实例具有更高的内存与 CPU 比率,对于涉及一次性将大型数据集加载到内存中的数据库操作非常有用。
  • 突发型:这些实例的性能通常比其他类型稍低,但对于许多应用程序而言仍能占据优势。它们提供较低的基准 CPU 性能,但允许在峰值时突发更高性能。这使您可以在支付较低平均使用量的同时,仍能偶尔处理额外的工作负载。

您选择的实例类型以及所需的具体资源配置高度依赖于您的应用程序使用模式。但是,我们可以提供一些通用指导来帮助您做出选择。请记住,如果您的需求发生变化,您始终可以在以后扩展数据库。

选择数据库实例类型的通用建议

通常,对于大多数关系型数据库工作负载,RAM 往往比 CPU 更重要。因此,您不必因为担心性能低下而完全排除突发型实例。它们提供了一些最佳的性价比,同时仍能提供合理的性能。

具体来说,如果您刚开始,像 db.t3.medium 这样的实例(提供 2 个 vCPU 和 4 GiB 内存)对于许多用例来说是一个很好的基线选择。CPU 应该能够处理中等水平的活动,同时应对请求峰值。假设硬件性能适合您的项目,您可能会遇到的第一个限制是 2,086 Mbps 的网络上限,因此在做出决定时请记住这一点。

如果您需要为具有相当流量的标准数据库提供更高水平的 CPU 性能,您可能需要考虑一个具有 2-4 个 vCPU 和 8-16 GiB RAM 的标准实例。根据宣传,m6g 实例的性价比比旧的 m5 实例高出 40%,因此在选择标准实例时,它们通常是更好的选择。考虑到这一点,db.m6g.largedb.m6g.xlarge 实例是此实例类型不错的起始选择。

内存优化型数据库实例主要适用于您知道需要将大量数据集加载到内存中的情况。这可能是因为您的表包含许多记录,或者您经常查询大量列。如果您大量使用 PostgreSQL 的 JSON 列,这可能是值得考虑的。话虽如此,通常最好从更标准的配置开始,如果发现这些资源不足,再更改实例类型。

配置存储选项

接下来,您需要为数据库实例配置存储

Choose storage options

选择存储类型

RDS 提供三种不同类型的存储,适用于不同场景

  • 通用型 SSD (gp2):这是一种标准的固态硬盘选项。您的存储设备可用的 IOPS(每秒输入/输出操作数)直接与您分配的空间大小相关。基准 IOPS 设置为每 GiB 分配 3 IOPS,并能在短时间内突发到 3,000 IOPS。
  • 预置 IOPS SSD (io1):此选项允许您将存储空间量与分配给数据库的 IOPS 解耦。
  • 磁介质:磁介质存储使用传统的旋转磁盘而不是 SSD。

通常,几乎总是最好从通用型 SSD 选项开始。这允许您设置所需的空间量并将数据库部署在 SSD 上。磁介质选项很少是好的选择,因为它速度较慢且限制在 1000 IOPS。

如果您已经进行了相当严格的应用程序性能分析,并且对您的环境在各种工作负载下产生的 IOPS 量有了很好的了解,那么预置 IOPS SSDs 是一个不错的选择。由于缓存和其他可以降低实际访问驱动器操作量的机制,这个数字也往往低于预期。通常,将此视为一种高级选择,一旦您有了长期运行精确配置的经验,它可能就会变得合适。

选择初始存储空间

选择存储类型后,选择要分配的存储量。这同样高度依赖于您的应用程序。然而,一般来说,人们倾向于高估初期所需的空间量。建议从较小量开始,并记住您始终可以进行扩展。

配置自动扩缩

接下来,选择是否启用自动扩缩。此选项允许您的存储空间随使用情况自动扩缩。这通常是个好主意,因为它允许您以更实惠的价格从较小的初始分配开始,然后随着数据增加自动增加存储空间。您可以配置最大扩缩量,以确保您不会扩缩到超出您接受范围的大小。

通常,初始分配从 20 到 100 GiB 之间就足够了(通常取决于什么能为您提供足够的 IOPS),然后将您的最大存储阈值设置为您愿意支付的最大大小。

确定连接策略

配置存储后,您需要做出的下一个重要决定是关于数据库的连接性

Choose connectivity strategy

本节包含许多不同的选项,如果您不熟悉 AWS 的安全和网络模型,可能会感到困惑。

我们在此为适合生产环境的部署推荐的通用策略是为每个可用选项创建新实例,而不是重用现有选项。如果您将数据库部署到应用程序已在运行的现有环境中,您可能需要调整此策略,但对于新部署而言,此通用规则提供了最隔离和最安全的方法。

配置 VPC

当被要求选择部署数据库的虚拟私有云 (VPC) 时,通常最好将其部署到新的 VPC 或包含将访问它的应用程序的 VPC 中。通常不建议部署到默认 VPC,因为它意味着您的数据库将受您对默认网络环境所做的任何调整的影响。

选择子网组

接下来,您需要选择子网组。这定义了您的数据库可能部署在 VPC 中的 IP 范围。通常,在这里也创建一个新组是个好主意。

决定是否允许公共访问

您必须做出的最重要选择之一是是否允许公共访问您的数据库实例。这主要取决于您的安全要求以及您为数据库配置特殊访问权限的能力。

最安全的方法是关闭公共访问。这只允许您的数据库被部署在与您的数据库相同网络环境中的实例访问(或通过其访问)。要从外部访问您的数据库,您需要配置一个跳转主机或一个具有外部访问权限的互联网网关,以验证并将外部连接路由到您的数据库。如果您不熟悉基础设施配置或网络规则管理,这可能是一项重要的任务。

另一种方法是允许公共访问。这将使您的数据库实例可以从公共互联网访问。它的安全性较低,因为任何人都可以尝试连接到您的数据库,但它确实允许从外部连接进行更简单的访问模式。如果您选择此选项,请确保您的所有数据库密码都非常强大且频繁轮换。您可能会在日志中看到外部尝试访问您的服务,因此密码强度至关重要。

选择是否启用公共访问比最初看起来更复杂。如果您启用公共访问,您仍然可以将访问权限锁定到一组特定的外部 IP 地址,并提供其他配置点来过滤掉不合法的连接尝试。一般来说,最好选择您长期能够支持的最安全配置。

选择 VPC 安全组

VPC 安全组控制连接到其中部署的实例的访问规则。这些基本上是类似防火墙的访问控制策略,有助于限制可以连接到数据库实例的连接类型。

创建一个新的 VPC 安全组,除非您已经为生产数据库用途配置了一个。选择一个有助于您记住安全组在 AWS 控制台中显示时的重点和角色的名称。

选择可用区和端口

您可以选择当前区域内的可用区来部署数据库实例。如果您没有偏好,可以随意选择“无偏好”。

如果您打开“附加配置”选项,您可以选择更改 PostgreSQL 监听的端口。更改此项可以帮助减轻开放实例连接日志中的一些“噪音”,但它不会提供任何显著的安全改进,并且可能使连接更加繁琐。

设置数据库身份验证

接下来,您需要选择要用于数据库实例的身份验证类型

Choose database authentication

选项包括:

  • 密码认证:使用 PostgreSQL 原生能力的标准密码认证。
  • 密码和 IAM 数据库认证:同时使用 PostgreSQL 的原生密码能力和AWS IAM 角色进行认证。作为使用数据库密码的替代方案,您可以选择使用 IAM 认证令牌对数据库实例进行认证。
  • 密码和 Kerberos 认证:同时使用 PostgreSQL 的原生密码功能以及使用AWS Directory Service创建的 AWS 托管式 Microsoft Active Directory 实例。如果您的组织已在使用 AWS 托管式 AD 实例,这允许您通过票据使用 Kerberos 风格的认证。

一般来说,除非您需要更复杂的配置,否则仅使用密码认证是合理的。如果您深度依赖 AWS 生态系统并为基础设施的许多其他部分使用基于 IAM 的认证,那么 IAM 数据库选项可能很有吸引力。除非您已经将 Kerberos 服务用于其他目的,否则不值得选择 Kerberos 选项。

配置备份、加密、监控等

如果您展开附加配置部分,您将有机会配置一些其他选项。我们将在本节中介绍这些选项。

数据库选项

第一个附加部分允许您为 PostgreSQL 配置一些额外选项

Configure database options

如果您愿意,可以选择让 RDS 自动为您的部署创建一个初始数据库。这通常是不必要的,因为您运行的任何迁移或其他设置脚本通常都会在实例中创建必要的数据库结构。

您有时还可以为您的实例选择一个数据库参数组。这里可能无法进行多项选择,这取决于您之前所做的选择以及您是否在创建过程之外配置了参数组。如果存在,它们允许您更改应用于此实例的 PostgreSQL 参数。

PostgreSQL 不支持选项组,因此该下拉菜单将不处于活动状态。

备份

接下来您可以配置与自动数据库备份相关的选项

Configure backups

如果您想启用自动备份,请勾选启用自动备份框。这将告诉 AWS 自动为您的数据库实例拍摄每日时间点快照,您可以使用这些快照进行恢复。值得注意的是,虽然本页未提及,但备份将存储在 AWS 的简单存储服务 (S3) 中,您将需要为它们消耗的空间付费。

默认情况下,备份保留窗口设置为 7 天,这意味着您将能够恢复过去 7 天内拍摄的数据库快照。如果您正在使用此功能,您可能希望将保留期增加到 14 天,以便有更多时间发现不必要的更改。但请记住,增加保留期将导致额外的存储成本增加。

如果您对备份发生时间有任何偏好,可以选择一个合适的时间窗口,否则,保留“无偏好”是安全的。

勾选“将标签复制到快照”以便更容易在 S3 中找到相应的快照。

如果您需要额外的保护,您还可以选择备份复制,将您的更改自动复制到不同的 AWS 区域。这将允许您从不同区域快速恢复,但会增加您的 S3 存储成本和数据传输成本。

加密

接下来,您可以为数据库实例配置磁盘上的加密

Configure encryption

为实例启用加密以增加安全性几乎总是一个好主意。

通常,您可以使用默认的 AWS KMS 密钥进行此操作,除非您有其他要求,例如加密到由不同 AWS 账户使用的密钥。

性能分析

接下来,为您的实例配置性能分析

Configure performance insights

性能分析是一项功能,可帮助您调试 RDS 实例中的性能问题。默认情况下,分析数据将免费保留 7 天。您也可以选择将数据长期存储 2 年,但这会根据您的 CPU 实例类型产生额外费用

同样,您可以将此加密的默认 AWS KMS 密钥保持选中状态,除非您有特殊要求。

监控和日志

接下来,您可以配置数据库的监控日志

Configure monitoring

一般来说,启用监控有助于您更好地了解数据库实例及其性能。

至于导出日志,通常默认禁用它是安全的,除非您需要它。您的应用程序日志通常会根据需要显示特定于数据库的信息,但如果您觉得有帮助,可以随时启用 PostgreSQL 日志导出。日志将导出到AWS CloudWatch Logs

维护和删除保护

维护删除保护部分完成了附加配置

Configure maintenance

通常认为自动升级 PostgreSQL 的次要版本是安全的。次要版本不应包含破坏性更改,并且升级应相对无缝地执行。如果您有偏好,请选择一个升级窗口。

为您的生产数据库启用删除保护总是一个好主意。这通过要求您在成功处理删除之前恢复此选项,从而防止您意外删除数据库实例。对于大多数用例来说,没有合理的理由选择退出此选项。

完成配置

我们终于完成了配置过程。在页面底部,您可以看到已配置数据库实例的每月成本估算

Estimated cost

请特别注意估算下方的文字,其中重申显示的成本计算不包括备份存储、IO 或数据传输的成本。如果不考虑并限制这些额外成本,它们可能会相当可观,因此在继续之前,请确保您接受这些额外费用。

准备好后,点击页面底部的创建数据库

Create the database

您的数据库实例将根据您的配置进行预置。这可能需要几分钟才能完成,具体取决于您选择的实例大小和启用的选项。

当您的实例准备就绪时,它将显示在 RDS 控制面板的数据库部分

New database instance

查看自动生成密码

如果您配置了 AWS 自动生成密码,您将在屏幕顶部看到类似这样的通知

Auto generate notice

点击查看凭证详情以获取密码

View password

请注意,这是您唯一一次可以访问此密码,如果您丢失了它,则必须重新生成。

查看其他连接信息

对于其余连接信息,点击实例名称。

连接与安全选项卡中,您可以在左侧找到数据库的端点和端口号

Endpoint and port

在此示例中,我们的端点名称(主机 URL)是 production-db1.cddm7tgh3j5j.us-east-1.rds.amazonaws.com,我们的数据库正在监听 PostgreSQL 的标准端口:5432。

要找到您配置的主用户名(如果您未修改,则为 postgres),请访问配置选项卡,并在可用性标题下查找主用户名字段

Master username

如果您配置了初始数据库,也可以在该选项卡左侧找到其名称。

有了这些信息,您就可以连接到您的 PostgreSQL 实例了。例如,要连接到此处显示的实例,您可以使用以下连接 URI

postgresql://postgres:Pa38iSJWm8qtq90LnmZ8@production-db1.cddm7tgh3j5j.us-east-1.rds.amazonaws.com:5432/postgres

您可以从我们关于PostgreSQL 连接 URI的指南中了解更多如何根据连接详情构建连接 URI。

总结

在本指南中,我们介绍了如何使用亚马逊的 RDS 托管数据库服务创建生产级的 PostgreSQL 数据库实例。尽管有很多选项可供探索,并且您的选择将根据项目和环境的需求而异,但我们试图在这里提供一个合理的起点,并提供足够的信息,以便您做出明智的决定。

随着您的需求变化,请记住您可以扩展数据库实例以适应新的使用模式。利用从监控信息和扩展日志中收集的数据来决定您的数据库需求如何演变。

关于作者
Justin Ellingwood

贾斯汀·埃林伍德

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