如何无缝升级 AWS RDS postgres 数据库的主要版本?

jon*_*ton 15 postgresql amazon-rds

今天早上我参与了升级 AWS RDS 上的 PostgreSQL 数据库。我们想从 9.3.3 版迁移到 9.4.4 版。我们已经在临时数据库上“测试”了升级,但是临时数据库要小得多,并且不使用多可用区。事实证明,这个测试是相当不充分的。

我们的生产数据库使用多可用区。过去我们做过次要版本升级,在这种情况下,RDS会先升级standby,然后将其提升为master。因此,故障转移期间发生的唯一停机时间约为 60 秒。

我们假设主要版本升级也会发生同样的情况,但是我们错了。

关于我们设置的一些细节:

  • db.m3.large
  • 预配置 IOPS (SSD)
  • 300 GB 存储空间,其中使用了 139 GB
  • 我们有未完成的 RDS 操作系统升级,我们希望批量进行此升级以最大程度地减少停机时间

以下是我们执行升级时记录的 RDS 事件:

在此处输入图片说明

数据库 CPU 在大约 08:44 和 10:27 之间达到最大值。RDS 拍摄升级前和升级后的快照似乎占用了大部分时间。

AWS文档不警告这样的反响,尽管从阅读他们很显然,我们在处理一个明显的缺陷是,我们没有创建的副本生产的多AZ建立数据库,并尝试将其升级为试运行

总的来说,这非常令人沮丧,因为 RDS 给我们的关于它正在做什么以及可能需要多长时间的信息非常少。(再次,进行试运行会有所帮助......)

除此之外,我们想从这次事件中吸取教训,所以这里是我们的问题:

  • 在RDS做大版本升级时出现这种情况正常吗?
  • 如果我们想在未来以最少的停机时间进行主要版本升级,我们将如何进行?是否有某种巧妙的方法可以使用复制使其更加无缝?

小智 5

这是一个很好的问题,
在云环境中工作有时会很棘手。

您可以使用pg_dumpall -f dump.sql命令,它将您的整个数据库转储为 SQL 文件格式,您可以从头开始重建它指向其他端点。psql -h endpoint-host.com.br -f dump.sql简称使用。

但是要做到这一点,您将需要一些具有合理磁盘空间的 EC2 实例(以适合您的数据库转储)。此外,您需要安装yum install postgresql94.x86_64才能运行转储和恢复命令。

请参阅PG Dumpall DOC 中的示例。

请记住,为了保持数据的完整性,建议(在某些情况下是强制性的)在此维护窗口期间关闭连接到数据库的系统。

另外,如果你需要加速的东西,可以考虑使用pg_dump,而不是pg_dumpall通过采取并行(优势-j njobs)参数,当你决定参与这一进程的CPU数量,例如-j 8将使用到8个CPU。默认情况下,pg_dumpallor的行为pg_dump仅使用 1。使用pg_dump替代的唯一优势pg_dumpall是您需要为您拥有的每个数据库运行该命令,并转储分隔的角色(组和用户)。

请参阅PG Dump DOCPG Restore DOC 中的示例。


Dmi*_*sev 2

AWS 还建议进行逻辑复制,以最大程度地减少主要版本升级期间的停机时间。

对于从 PostgreSQL 10.x 升级到更高版本,可以使用本机复制,对于旧版本,您可以使用 pglogic(也可以在最新版本上使用pglogic)——RDS 支持这两种解决方案。

  1. 设置所需版本的新空 RDS 实例
  2. 从现有实例转储模式分为 3 个部分(全局对象、pre-datapost-data
  3. 将全局和预数据应用到您的新实例
  4. 使用发布/订阅设置逻辑复制
  5. post-data数据库同步后应用架构更改,以强制引用完整性
  6. 关闭正在写入旧数据库的应用程序
  7. 等待复制完成
  8. 使用新的连接字符串重新启动应用程序

步骤 6-8 取决于应用程序,当然,您可能有其他工具来停止应用程序堆栈中的写入。

您可以在此 YouTube 视频中找到详细信息和示例:

https://www.youtube.com/watch?v=S8kX250UIVo