分享到

简介

Amazon Web Service 的关系型数据库服务 (RDS) 由于其灵活性和强大的功能集,是数据库托管的热门选择。开发团队可以为个人使用、暂存环境和生产工作负载配置新的数据库,并将它们无缝集成到 AWS 的其他产品套件中。

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

为什么选择 Amazon Web Service 的 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 环境中如何部署。这会影响您的设置对故障和停机的抵抗能力,包括您特定实例的故障和亚马逊基础设施的区域性中断。

让我们看看我们拥有的各种选项、它们提供的功能以及它们在哪些场景下有用。在本指南中,我们将推荐一个单一 DB 实例,因此,如果您对其他选项不感兴趣,请随时跳过。

多可用区 DB 集群

最安全、最稳健且最昂贵的选项是多可用区 DB 集群。

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

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

如果数据库停机直接导致巨额收入损失,这可能是一个不错的选择。如果您的典型数据库使用模式非常以读取为主,那么读取 IO 的增加也值得注意。如果这与您的使用案例相符,您可能还想考虑评估 Amazon Aurora,以获得类似的可用性级别,最终可能成本更低。

多可用区 DB 实例

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

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

如果您希望获得一定程度的可用性保护,而无需更高的读取吞吐量,此选项可能是一个不错的选择。您需要考虑两个数据库实例的成本,因此价格将高于单个实例。如果停机对您的运营非常昂贵,这可能是防止停机事件中出现可用性间隙的好选择。

单一 DB 实例

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

考虑到这一点,此选项也是最便宜的。部署由单个实例组成,因此没有部署额外的资源,您将为这些资源付费。

此选项与一定程度的风险相关联,但对于许多使用案例来说,风险是可以接受的,而缓解风险的成本太高。Amazon RDS 在可靠性方面有良好的记录,即使在单个 AZ 内也是如此,因此对于许多使用案例来说,短暂停机时间的可能性是可以接受的。

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

配置基本设置

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

Configure basic settings

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

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

注意:主用户名是 PostgreSQL 数据库实例中的主要管理帐户。您应该始终在配置数据库实例后创建和配置具有有限权限的其他特定于应用程序的用户名。配置您的数据库客户端和应用程序以使用这些权限较低的标识进行日常操作。仅在初始配置期间以及创建更有限且范围更窄的访问途径时使用主用户名。

然后,您可以选择设置和确认主用户名的密码。您可以为帐户选择一个强密码,最好是机器生成的密码,也可以选中自动生成密码框,让 AWS 为您自动生成一个安全密码。

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

选择 DB 实例类型

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

Choose instance class

从本质上讲,数据库的实例类型决定了数据库将部署到的虚拟机的尺寸以及可用的资源。您有几个不同的选项可以选择要选择的实例类型,以及每种类型中资源的组合。

实例类型的三个主要类别是

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

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

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

通常情况下,对于大多数关系型数据库工作负载而言,RAM 比 CPU 更重要。因此,你不应该因为担心性能低下而完全放弃可突发型实例。它们提供了一些最佳的性价比,同时仍然可以提供合理的性能。

具体来说,像 db.t3.medium 这样的实例,它提供 2 个 vCPU 和 4 GiB RAM,是许多用例的良好基线选择,如果你刚开始使用。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 SSD 是一个不错的选择。由于缓存和其他机制可以降低实际到达驱动器的操作数量,因此这个数字往往比预期要低。通常情况下,可以将其视为一种高级选择,在你积累了一定时间运行当前配置的经验后,它可能会变得适合。

选择初始存储空间

选择存储类型后,选择要分配的存储空间量。这也高度依赖于你的应用程序。但是,一般来说,人们往往会高估一开始需要的空间量。从低处开始,并记住你随时可以扩展。

配置自动扩展

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

通常情况下,从 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 选项。

配置备份、加密、监控等

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

数据库选项

第一个附加部分允许您配置 PostgreSQL 的一些其他选项。

Configure database options

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

您有时也可以选择实例的DB 参数组。 根据您之前做出的选择以及您是否在创建过程中配置了参数组,这里可能无法进行多个选择。 当存在时,它们允许您更改应用于此实例的 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

您可以从我们的指南中了解有关如何从连接详细信息构建连接 URI 的更多信息,该指南位于 PostgreSQL 连接 URI

结论

在本指南中,我们介绍了如何使用 Amazon 的 RDS 托管数据库服务创建可用于生产环境的 PostgreSQL 数据库实例。虽然有很多选项可以探索,您的选择会根据项目的需要和您的环境而有所不同,但我们尝试在这里提供一个合理的起点,以及足够的信息供您做出明智的决策。

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

作者
Justin Ellingwood

Justin Ellingwood

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