如何在批处理过程中使用AWS / RDS切换数据库并避免停机?

时间:2019-06-08 10:15:44

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

为了内部使用,我们在EC2实例上有一个Web应用程序,该应用程序从RDS / Postgres数据库读取(不写入)数据。在一天的一部分中,将为此数据库生成新数据(批处理过程运行约2小时),并且将数据直接写入同一数据库,这当然会导致应用程序停机(约2小时),直到完全写入数据为止

在AWS / EC2 / RDS上管理这样的情况以不给应用程序造成停机时间,并且能够回滚到以前的版本,并且如果不切换到新版本,那当然是什么好习惯批处理过程中发生任何错误?

2 个答案:

答案 0 :(得分:0)

典型的ETL(提取,转换,加载)过程通常通过以下方式工作:

  • 数据加载到 Staging
  • 运行脚本以将表的内容清理/转换为适合报告的格式
  • 发布表格供用户使用

最后一步可以使用TRUNCATE,然后使用SELECT INTO

如果停机时间过多,那么另一种方法是让用户查询视图。然后,修改视图以指向第二组表(现在已成为“主”表)。因此,每次加载时,View都只是在表组之间交换。

答案 1 :(得分:0)

我会考虑为此使用RDS快照。您将拥有一个可写的RDS“主”实例(或者,如果可以的话,则为黄金映像),并且您将拥有一个刷新的只读RDS实例,可以从中查询。

示例过程如下:

  • 请确保您在托管区域中设置了CNAME别名记录(通过Route 53)(在VPC中启用了DNS解析),以指向您当前的只读RDS实例(指向您在RDS控制台)-TTL表示5-60秒
  • 进行ETL /加载到主服务器
  • 执行所需的任何验证活动
  • 快照主RDS实例
  • 从主快照中启动一个新的只读RDS实例
  • 更改CNAME别名记录以指向新的只读RDS实例
  • 当所有应用数据库客户端都已故障转移(请参见下文)后,终止旧的只读RDS实例
  • 可选地stop the master RDS instance to save cost-直到下一次加载

为此,您需要使用CNAME进行应用数据库连接池设置,并确保连接定期老化-理想情况下,连接寿命不超过每隔几分钟,以最大程度地减少切换时间。另外请注意某些应用程序运行时中的DNS缓存。从历史上看,例如Java默认情况下会具有一些较长的缓存(您可以覆盖)。

您也可以使它自动化。一种选择是Codepipeline。

然后,您“回滚”的能力取决于您保留快照多少天。要进行回滚,您需要从给定的快照创建RDS实例并更改CNAME。

您的其他选项可能使用的是RDS Read Replica。但是我不确定是否可以在加载期间停止并(重新)启动PostgreSQL的复制过程(如MySQL)。而且我还怀疑复制跟上进度会导致头疼(也许某些DDL语句无法正常复制或按预期复制)。