PostgreSQL
如何在 RDS 上配置 PostgreSQL 数据库
简介
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 服务
单击服务下的 RDS 转到 Amazon RDS 主页
向下滚动,直到看到创建数据库部分,然后单击创建数据库
您将进入数据库创建页面,您可以在其中选择所需的配置。
在本指南的剩余部分,我们将介绍可用的不同选项,并为生产就绪的配置提供建议。
配置标准 PostgreSQL 部署选项
RDS 创建过程的第一部分确定您希望如何配置数据库,以及新数据库的基本属性,例如数据库引擎、部署类型和基本配置。让我们开始吧。
配置创建方法
在 RDS 上预置新数据库的第一步是选择创建方法
虽然简易创建方法可以帮助您选择一些合理的默认设置,但它没有提供在为您的环境配置重要数据库时可能需要的灵活性。标准创建选项提供了更多选项,并且仍然是一个相对较短的过程。
选择标准创建,以便您完全控制创建过程。
选择 PostgreSQL 引擎和版本
接下来,选择数据库引擎
对于本指南,我们将配置 PostgreSQL 数据库,因此我们将选择 PostgreSQL 选项。Amazon Aurora 是另一种与 PostgreSQL 兼容的选项,它提供了 Amazon 自己的扩展和管理功能。但是,在本指南中,我们将重点关注 PostgreSQL 原生部署。
选择您希望使用的 PostgreSQL 版本。默认选择的版本通常是安全的选择,但您可能还希望选择最新版本以获得更新的功能,或者根据与您的应用程序库的兼容性选择较旧的版本。
选择生产模板
接下来,您将被要求选择模板
模板旨在提供与典型部署场景匹配的预选选项。由于我们正在预置生产数据库,请选择生产模板。
设置数据库可用性
下一节包含您需要在部署方面做出的第一个主要决定:数据库的可用性和持久性
本节确定您的数据库在 AWS 环境中将如何部署。这关系到您的设置在多大程度上能够抵抗故障和中断,包括您的特定实例和 Amazon 基础设施中的区域性中断。
让我们看一下我们拥有的各种选项、它们提供的功能以及它们适用的场景。对于本指南,我们将推荐单数据库实例,如果您对其他选项不感兴趣,请随意跳过。
多可用区数据库集群
最安全、最可靠且最昂贵的选项是多可用区数据库集群。
此配置配置一个 PostgreSQL 集群,该集群由一个主数据库实例以及两个只读备用副本组成,每个副本都部署到不同的物理位置。此选项有助于防止在发生故障时数据库中断,同时通过副本增加可用的读取吞吐量。
话虽如此,此选项也非常昂贵,因为您将不得不为部署到不同可用区的三个单独的数据库实例付费。
如果您的数据库停机时间直接等同于重大收入损失,那么这可能是一个不错的选择。如果您的典型数据库使用模式非常读取密集型,那么读取 IO 的增加也值得注意。如果这与您的用例匹配,您可能还需要考虑评估 Amazon Aurora,以获得类似的可用性级别,最终可能会降低成本。
多可用区数据库实例
此选项将您的数据库部署为活动主实例以及位于不同可用区的备用副本。备用副本将保持最新,以便在主实例中断时,可以触发故障转移,并且备用副本可以承担主实例的职责。
与上面讨论的多可用区数据库集群相比,多可用区数据库实例只有一个备用副本。此外,备用副本只能用于其备用容量。它不支持只读工作负载。
如果您想要一些可用性保护,而不需要更高的读取吞吐量,则此选项可能是一个不错的选择。您将不得不考虑两个数据库实例的成本,因此价格将高于单个实例。如果停机时间对您的运营来说非常昂贵,那么这可能是防止在发生中断时可用性中断的一个好选择。
单数据库实例
单数据库实例是在一个可用区内标准部署的单个数据库。这不提供额外的可用性,这意味着您的数据库的可用性直接与数据库实例的正常运行时间相关。如果它出现问题,您的数据库及其管理的所有数据都将无法访问,直到服务恢复。
考虑到这一点,此选项也是最便宜的。部署由单个实例组成,因此没有您需要付费的额外资源被部署。
此选项与一定程度的风险相关联,但对于许多用例来说,风险是可以接受的,并且减轻风险的成本太高。Amazon RDS 在可靠性方面拥有良好的记录,即使在单个可用区内也是如此,因此对于许多用例来说,短时间的停机时间是可以接受的。
对于本指南,我们将选择单数据库实例,因为它通常足以满足对停机时间不极其敏感的生产部署。但是,如果您的收入和声誉与数据库的正常运行时间密切相关,那么考虑其他选择可能是明智之举。
配置基本设置
下一节允许您配置部署的基本设置
首先,您可以通过设置数据库实例标识符来命名您的数据库实例。选择一些独特的名称,这将帮助您了解数据库在 AWS 控制台中显示时的角色和用途。
接下来,配置数据库实例的凭证。首先为您的 PostgreSQL 数据库设置主用户名。默认情况下,大多数 PostgreSQL 客户端工具都假定主用户名为 postgres
,因此如果合适,您可以保留该用户名。
注意:主用户名是 PostgreSQL 数据库实例中的主要管理帐户。在预置数据库实例后,您应始终创建和配置具有有限权限的其他应用程序专用用户名。配置您的数据库客户端和应用程序以使用那些权限较低的身份进行日常操作。仅将主用户名用于您的初始配置以及创建更有限和范围更窄的访问途径。
然后,您可以选择设置并确认主用户名的密码。您可以为该帐户选择一个强密码(最好是机器生成的密码),或者您可以选中自动生成密码框,让 AWS 自动为您生成安全密码。
如果您选择自己的密码,请将密码保存在安全的地方,因为您以后将无法检索它。同样,如果您自动生成密码,您将只能在创建后首次在 AWS 控制台中访问凭证时访问密码。请务必安全地记录密码,因为您以后将无法再次检索它。
选择数据库实例类
您需要做出的下一个主要决定是您的数据库实例类
本质上,数据库的实例类决定了数据库将部署到的虚拟机的大小以及可用的资源。您可以选择几种不同类型的实例,以及每种类型中资源的组合。
实例类的三个主要类别是
- 标准:这些包括您可能从 AWS 的 EC2(弹性计算云)实例中熟悉的“m”类。基本上,这些是平衡良好、通用实例,旨在具有合理的 CPU 与内存比率。
- 内存优化:这些包括 EC2 “r”和“x”实例类。此类别中的实例具有较高的内存与 CPU 比率,这对于涉及一次将大型数据集加载到内存中的数据库操作非常有用。
- 突发容量:这些实例通常比其他实例的性能略低,但对于许多应用程序来说,仍然可以占据一个最佳位置。它们提供较低的基准 CPU 性能,但允许更高的性能突发以适应峰值。这使您可以为较低的平均使用量付费,同时仍然能够处理不时增加的工作负载。
您选择的实例类以及您需要的特定资源排列高度依赖于您的应用程序的使用模式。但是,我们可以提供一些一般指导,以帮助您进行选择。请记住,如果您的需求发生变化,您始终可以在以后扩展数据库。
选择数据库实例类的一般建议
总的来说,对于大多数关系数据库工作负载,RAM 往往比 CPU 更重要。因此,您不应因为担心性能低而一定 Discount 突发容量类。它们在提供合理性能的同时,还提供了一些最佳价值。
具体来说,像 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.large
和 db.m6g.xlarge
实例是此实例类类型的良好起始选择。
内存优化的数据库实例主要在您知道您将不得不将大型数据集加载到内存中时才有用。这可能是因为您的表包含许多记录,或者因为您经常查询大量列。如果您大量使用 PostgreSQL 的 JSON 列,这可能是需要考虑的事情。话虽如此,最好从更标准的配置开始,如果发现这些资源不足,则更改实例类。
配置存储选项
接下来,您需要为数据库实例配置存储
选择存储类型
RDS 提供三种不同类型的存储,它们适用于不同的场景
- 通用 SSD (gp2):这是标准的固态硬盘选择。您的存储设备可用的 IOPS(每秒输入/输出操作)直接与您分配的空间大小相关。基线 IOPS 设置为 3 IOPS/GiB 分配,能够突发到 3,000 IOPS 短时间。
- 预置 IOPS SSD (io1):此选项允许您将存储空间量与分配给数据库的 IOPS 解耦。
- 磁性:磁性存储使用传统的旋转磁盘而不是 SSD。
一般来说,几乎总是最好从通用 SSD 选项开始。这允许您设置所需的空间量并在 SSD 上部署数据库。磁性选项很少是一个好的选择,因为它速度较慢且限制为 1000 IOPS。
如果您已经执行了相当强大的应用程序分析,并且对您的环境在各种工作负载下生成的 IOPS 量有一个很好的了解,那么预置 IOPS SSD 是一个不错的选择。由于缓存和其他可以减少实际命中驱动器的操作次数的机制,这往往也低于预期数量。通常,将其视为一种高级选择,一旦您有长时间运行确切配置的经验,它可能会变得合适。
选择初始存储空间
选择存储类型后,选择要分配的存储量。这也高度依赖于您的应用程序。然而,一般来说,人们往往会高估他们一开始需要的空间量。从低开始,记住您可以随时向上扩展。
配置自动扩展
接下来,选择是否启用自动扩展。此选项允许您的存储空间随着使用量自动扩展。这通常是一个好主意,因为它允许您从较小的初始分配开始,以获得更实惠的价格,然后随着数据的增加自动增加存储空间。您可以配置最大扩展量,以确保最终扩展不会超出您的舒适范围。
一般来说,从 20 到 100 GiB 的任何地方开始作为您的初始分配(通常取决于什么为您提供足够的 IOPS)通常就足够了,然后将您的最大存储阈值设置为您愿意支付的最大大小。
决定连接策略
配置完存储后,您需要做出的下一个重要决定是关于数据库的 连接性
本节包含许多不同的选项,如果您不熟悉 AWS 的安全和网络模型,可能会感到困惑。
对于适合生产环境的部署,我们在此推荐的通用策略是创建每个可用选项的新实例,而不是重用现有选项。如果您要将数据库部署到应用程序已在运行的现有环境中,则可能需要调整此策略,但一般规则为新部署提供了最隔离和安全的方法。
配置 VPC
当要求您选择要部署数据库的虚拟私有云 (VPC) 时,通常最好将其部署到新的 VPC 或包含将访问它的应用程序的 VPC。通常不建议部署到默认 VPC,因为这意味着您的数据库将受到您对默认网络环境所做的任何调整的影响。
选择子网组
接下来,您需要选择子网组。这定义了 VPC 内数据库可能部署的 IP 范围。通常,最好也在此处创建一个新组。
决定是否允许公共访问
您需要做出的最重要的选择之一是是否允许公共访问您的数据库实例。这很大程度上取决于您的安全要求以及您配置对数据库的特殊访问的能力。
最安全的方法是关闭公共访问。这将仅允许您的数据库被部署在与您的数据库相同的网络环境中的实例(或通过这些实例)访问。要从外部访问您的数据库,您需要配置一个 跳转主机 或一个 互联网网关,它们具有外部访问权限,可以验证外部连接并将它们路由到您的数据库。如果您不熟悉配置基础设施或管理网络规则,这可能是一项重要的任务。
另一种方法是允许公共访问。这将使您的数据库实例可以从公共互联网访问。安全性较低,因为任何人都可以尝试连接到您的数据库,但它确实允许从外部连接进行更简单的访问模型。如果您选择此选项,请确保您的所有数据库密码都非常强并且经常轮换。您可能会在日志中看到外部尝试访问您的服务,因此密码强度至关重要。
是否启用公共访问的选择比最初看起来更复杂。如果您启用公共访问,您仍然可以将访问锁定到一组特定的外部 IP 地址,并提供其他配置点来过滤掉非法的连接尝试。总的来说,最好选择您在长期内最有可能支持的最安全配置。
选择 VPC 安全组
VPC 安全组控制用于连接到内部部署实例的访问规则。这些基本上是类似防火墙的访问控制策略,有助于限制可以与您的数据库实例建立的连接类型。
创建一个新的 VPC 安全组,除非您已经为生产数据库目的配置了一个。选择一个名称,以便在 AWS 控制台中显示安全组时,帮助您记住安全组的重点和作用。
选择可用区和端口
您可以选择当前区域内的可用区,您想在其中部署数据库实例。如果您没有偏好,请随意选择“无偏好”。
如果您打开“附加配置”选项,您可以选择更改 PostgreSQL 将监听的端口。更改此端口可能有助于减轻开放实例连接日志中的一些冗余信息,但它不会提供任何显著的安全改进,并且可能会使连接更加繁琐。
设置数据库身份验证
接下来,您需要选择要用于数据库实例的 身份验证 类型
选择如下:
- 密码身份验证:使用 PostgreSQL 原生功能的标准密码身份验证。
- 密码和 IAM 数据库身份验证:同时使用 PostgreSQL 的原生密码功能和 AWS IAM 角色进行身份验证。作为使用数据库密码的替代方案,您可以选择使用 IAM 身份验证令牌对数据库实例进行身份验证。
- 密码和 Kerberos 身份验证:同时使用 PostgreSQL 的原生密码功能和使用 AWS Directory Service 创建的 AWS 托管 Microsoft Active Directory 实例。如果您的组织已经使用 AWS 托管 AD 实例,这允许您通过票证使用 Kerberos 风格的身份验证。
一般来说,除非您需要更复杂的配置,否则仅使用密码身份验证是合理的。如果您在 AWS 生态系统和基础设施的许多其他部分中大量投资于基于 IAM 的身份验证,那么 IAM 数据库选项可能很有吸引力。除非您已经将 Kerberos 服务用于其他目的,否则不值得选择 Kerberos 选项。
配置备份、加密、监控等
如果您展开 附加配置 部分,您将有机会配置一些附加选项。我们将在本节中介绍这些选项。
数据库选项
第一个附加部分允许您为 PostgreSQL 配置一些附加选项
如果您愿意,可以选择让 RDS 为您的部署自动创建初始数据库。这通常是不必要的,因为您运行的任何迁移或其他设置脚本通常会在实例中创建必要的数据库结构。
您有时还可以为您的实例选择数据库参数组。此处的多个选项可能不可用,具体取决于您之前所做的选择以及您是否在创建过程之外配置了参数组。如果存在,它们允许您更改应用于此实例的 PostgreSQL 参数。
PostgreSQL 不支持选项组,因此该下拉菜单将不会处于活动状态。
备份
接下来,您可以配置与自动数据库备份相关的选项
如果您想启用自动备份,请选中启用自动备份框。这将告诉 AWS 自动拍摄数据库实例的每日时间点快照,您可以使用这些快照进行还原。值得注意的是,虽然此页面上未提及,但备份将存储在 AWS 的 Simple Storage Service (S3) 中,并且您需要为它们占用的空间付费。
默认情况下,备份设置为 7 天的保留期,这意味着您将能够还原过去 7 天内拍摄的数据库快照。如果您正在使用此功能,您可能需要将保留期增加到 14 天,以便给自己更多时间来发现不需要的更改。但请记住,增加保留期会因额外的存储而产生更高的成本。
如果您对备份发生的时间有任何偏好,您可以选择适当的时间窗口,否则,将其保留为“无偏好”是安全的。
保持选中“将标签复制到快照”以更轻松地在 S3 中找到合适的快照。
如果您想要额外的保护,您还可以选择备份复制,以将您的更改自动复制到不同的 AWS 区域。这将使您能够从不同的区域快速还原,但会增加您的 S3 存储成本和数据传输成本。
加密
接下来,您可以为数据库实例配置磁盘 加密
几乎总是建议为您的实例启用加密以获得额外的安全性。
一般来说,您可以为此使用默认的 AWS KMS 密钥,除非您有其他要求,例如加密到由其他 AWS 账户使用的密钥。
性能见解
接下来,为您的实例配置 性能见解
性能见解是一项功能,可帮助您调试 RDS 实例中的性能问题。默认情况下,见解数据将免费保留 7 天。您可以选择 2 年的长期存储,但这会产生 额外费用,具体取决于您的 CPU 实例类型。
同样,除非您有特殊要求,否则您可以为此加密保留默认的 AWS KMS 密钥。
监控和日志
接下来,您可以配置数据库的 监控 和 日志
一般来说,启用监控有助于您更好地了解数据库实例及其性能。
至于导出日志,除非您需要,否则默认情况下禁用它是安全的。您的应用程序日志通常会在需要时浮出特定于数据库的信息,但如果您觉得有用,您可以随时启用 PostgreSQL 日志导出。日志将导出到 AWS CloudWatch Logs。
维护和删除保护
维护 和 删除保护 部分完成了附加配置
通常认为自动升级 PostgreSQL 的次要版本是安全的。次要版本应该没有重大更改,并且升级应该相对无缝地执行。如果您有偏好,请选择升级窗口。
始终建议为您的生产数据库启用删除保护。这可以防止您意外删除数据库实例,因为它要求您在成功处理删除之前撤消此选项。对于大多数用例,没有合理的理由选择退出此选项。
完成
我们终于到达了配置过程的结尾。在页面底部,您可以看到配置的数据库实例的每月成本估算
特别注意估算下方的文本,该文本重申显示的成本计算不包括备份存储、IO 或数据传输的成本。如果未考虑和限制这些额外成本,则可能会很大,因此请确保您在继续之前对额外收费的想法感到满意。
准备就绪后,单击页面底部的 创建数据库
您的数据库实例将根据您的配置进行预置。这可能需要几分钟才能完成,具体取决于您选择的实例大小和您启用的选项。
当您的实例准备就绪后,它将显示在 RDS 仪表板的 数据库 部分
查看自动生成的密码
如果您配置 AWS 自动生成密码,您将在屏幕顶部看到这样的通知
单击查看凭证详细信息以查看密码
请注意,这是您唯一一次访问此密码的机会,如果您丢失了密码,则必须重新生成它。
查看其他连接信息
对于其余的连接信息,请单击实例名称。
在连接性与安全性选项卡中,您可以在左侧找到数据库的端点和端口号
在此示例中,我们的端点名称(主机的 URL)是 production-db1.cddm7tgh3j5j.us-east-1.rds.amazonaws.com
,我们的数据库正在 PostgreSQL 的标准端口 5432 上监听。
要查找您配置的主用户名(如果您没有修改,则为 postgres
),请访问配置选项卡,并在可用性标题下查找主用户名字段
如果您配置了初始数据库,您还可以在同一选项卡的左侧找到初始数据库的名称。
使用此信息,您可以连接到您的 PostgreSQL 实例。例如,要连接到此处显示的实例,您可以使用以下连接 URI
postgresql://postgres:Pa38iSJWm8qtq90LnmZ8@production-db1.cddm7tgh3j5j.us-east-1.rds.amazonaws.com:5432/postgres
您可以在我们的 PostgreSQL 连接 URI 指南中了解有关如何从连接详细信息构建连接 URI 的更多信息。
结论
在本指南中,我们介绍了如何使用 Amazon 的 RDS 托管数据库服务创建适合生产环境的 PostgreSQL 数据库实例。虽然有很多选项可供探索,并且您的选择会因项目和环境的需求而异,但我们尝试在此处提供一个合理的起点,并提供足够的信息供您做出明智的决定。
随着您的需求变化,请记住您可以扩展数据库实例以适应新的使用模式。使用您从监控信息和扩展日志中收集的数据来决定您的数据库需求如何发展。
一旦您在 Amazon RDS 上配置了 PostgreSQL 实例,您就可以使用 Prisma Client 连接并管理它。通过在 PostgreSQL 数据库连接器 设置中设置 url
参数以指向您的 RDS 实例,来配置对数据库实例的访问。