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


13

今天早上,我参与了在AWS RDS上升级PostgreSQL数据库的工作。我们想从9.3.3版升级到9.4.4版。我们已经在登台数据库上“测试”了升级,但是登台数据库小得多,并且不使用多可用区。事实证明,该测试还远远不够。

我们的生产数据库使用多可用区。过去,我们已经进行了次要版本升级,在这种情况下,RDS将首先升级备用数据库,然后将其升级为主数据库。因此,在故障转移期间仅发生的停机时间约为60秒。

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

有关设置的一些详细信息:

  • db.m3.large
  • 预置IOPS(SSD)
  • 300 GB的存储空间,其中已使用139 GB
  • 我们的RDS OS升级非常出色,我们想批量进行此升级,以最大程度地减少停机时间

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

在此处输入图片说明

数据库CPU在大约08:44到10:27之间已用尽。RDS似乎大部分时间都被RDS占用了,以进行升级前和升级后快照。

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

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

除此之外,我们想从这次事件中学习,所以这里是我们的问题:

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

升级后,我们注意到postgres试图对具有数百万条记录的某些表进行顺序扫描,而该表应该使用索引(从而导致查询超时)。一本ANALYZE更新统计信息的手册解决了该问题。如果有人对此有任何见识,那也将很棒。
jonleighton '16

Answers:


4

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

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

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

请参阅PG Dumpall DOC上的示例。

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

另外,如果您需要加快处理速度,请在确定进程中涉及的CPU数量时考虑利用parallelism()参数来pg_dump代替pg_dumpall-j njobs例如,-j 8直到8个CPU。缺省情况下,pg_dumpall或的行为pg_dump仅使用1。使用pg_dump代替的唯一优点pg_dumpall是,您将需要为拥有的每个数据库运行命令,并转储单独的ROLES(组和用户)。

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


要使用并行功能,您需要使用:pg_dump -h host -U user -W pass -Fc -f output_file.dmp -j 8 database_name
Vinnix

...并使用并行性进行恢复:pg_restore -h host -d database_name -U user -W pass -C -Fc -j 8 output_file.dmp
Vinnix

您不能仅从生产环境的快照中创建新的rds实例吗?
学习者
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.