将多个大型数据导入AWS RDS Postgres使其变慢

时间:2018-01-10 04:42:00

标签: postgresql amazon-web-services import amazon-rds

在我们当前的应用程序中,我们将日常备份添加到我们的s3存储桶中。这些备份是每天和每个表格的CSV格式。

我们的要求是从s3导入某个日期范围的数据,假设我们需要查看2015年1月1日到2015年7月31日的数据,我们将数据从s3下载到ec2实例并导入到新创建的postgres DB

但随着时间的推移,进口变得非常缓慢。以下是我在导入过程中执行的步骤:

  1. 使用m3-XLarge和600GB空间以及通用SSD存储类型创建RDS postgres-9.6实例。
  2. 关闭副本和多AZ实例。
  3. 导入没有外键且没有索引的架构。
  4. 将表格设置为UNLOGGED并关闭autovacuum。
  5. 使用COPY命令导入。

    psql -h <HOST_NAME> -d <database_name> -U <user_name> -c "\COPY TABLE_NAME FROM '<exact_path_of_the_file>' CSV DELIMITER ',' HEADER"

  6. 导入开始时,它很容易在2分钟内消耗2GB的文件。但在导入数据一个月后,导入变得非常缓慢。对于导入相同大小的文件,时间增加到30分钟(我比较2个不同日期的同一个表的文件大小)。

    我尝试将文件拆分为较小的块并进行导入,但没有看到导入时间的任何改进。

    我从RDS监测中观察到的是,交换空间从0增加到50 ......不知道这是否正常。任何改进导入的输入都会有所帮助。

    提前致谢。

    [PS:所有步骤都在shell命令中]

1 个答案:

答案 0 :(得分:0)

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Storage.html#USER_PIOPS

  

请求的IOPS速率与存储量的比率   分配很重要,取决于您的数据库引擎。对于   例如,对于Oracle,比率应该在1:1和50:1之间。您可以   首先配置一个具有1,000 IOPS和200的Oracle数据库实例   GiB存储(比例为5:1)。然后,您可以使用扩展到2,000 IOPS   200 GiB的存储空间(比例为10:1)。您可以扩展到30,000 IOPS   存储量为6 TiB(6144 GiB)(比例为5:1),您可以进行缩放   必要时进一步提升。

Postgres具有相同的比率(1:50),iops也不是字节ps,它的操作,所以当你给8K piops时,它不是每秒8KB或MB。我建议你将piops增加到40K,导入数据然后减少它。