为了内部使用,我们在EC2实例上有一个Web应用程序,该应用程序从RDS / Postgres数据库读取(不写入)数据。在一天的一部分中,将为此数据库生成新数据(批处理过程运行约2小时),并且将数据直接写入同一数据库,这当然会导致应用程序停机(约2小时),直到完全写入数据为止
在AWS / EC2 / RDS上管理这样的情况以不给应用程序造成停机时间,并且能够回滚到以前的版本,并且如果不切换到新版本,那当然是什么好习惯批处理过程中发生任何错误?
答案 0 :(得分:0)
典型的ETL(提取,转换,加载)过程通常通过以下方式工作:
最后一步可以使用TRUNCATE
,然后使用SELECT INTO
。
如果停机时间过多,那么另一种方法是让用户查询视图。然后,修改视图以指向第二组表(现在已成为“主”表)。因此,每次加载时,View都只是在表组之间交换。
答案 1 :(得分:0)
我会考虑为此使用RDS快照。您将拥有一个可写的RDS“主”实例(或者,如果可以的话,则为黄金映像),并且您将拥有一个刷新的只读RDS实例,可以从中查询。
示例过程如下:
为此,您需要使用CNAME进行应用数据库连接池设置,并确保连接定期老化-理想情况下,连接寿命不超过每隔几分钟,以最大程度地减少切换时间。另外请注意某些应用程序运行时中的DNS缓存。从历史上看,例如Java默认情况下会具有一些较长的缓存(您可以覆盖)。
您也可以使它自动化。一种选择是Codepipeline。
然后,您“回滚”的能力取决于您保留快照多少天。要进行回滚,您需要从给定的快照创建RDS实例并更改CNAME。
您的其他选项可能使用的是RDS Read Replica。但是我不确定是否可以在加载期间停止并(重新)启动PostgreSQL的复制过程(如MySQL)。而且我还怀疑复制跟上进度会导致头疼(也许某些DDL语句无法正常复制或按预期复制)。