如何在批处理过程中使用AWS/RDS切换数据库并避免停机? [英] How to switch databases using AWS/RDS on a batch process and avoid downtime?

查看:9
本文介绍了如何在批处理过程中使用AWS/RDS切换数据库并避免停机?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

在AWS/EC2/RDS上,管理这样的情况会是什么好做法,既不允许应用程序停机,又能够回滚到以前的版本,当然,如果批处理过程中发生任何错误,也不会切换到新版本?

RDS

我会考虑使用推荐答案快照。您将拥有一个可写的RDS"主"实例(或黄金映像,如果您愿意的话),并且您将拥有一个从中进行查询的刷新的只读RDS实例。

示例流程可能如下所示:

  • 确保您在托管区域(启用了vPC中的DNS解析)中设置了CNAME别名记录(通过路由53),以指向您当前的只读RDS实例(指向您在RDS控制台中看到的名称)-TTL,比方说5-60秒
  • 对主服务器执行ETL/Load
  • 执行所需的任何验证活动
  • RDS主实例快照
  • 从主快照启动新的只读RDS实例
  • 将CNAME别名记录更改为指向新的只读RDS实例
  • 当所有APP数据库客户端都已故障转移(见下文)时,终止旧的只读RDS实例
  • 可选stop the master RDS instance to save cost-直到下一次加载
要实现这一点,您需要为您的应用程序数据库连接池设置使用CNAME,并确保连接定期过期-理想情况下,连接寿命不超过每隔几分钟,以便最大限度地减少中断时间。还要注意某些应用程序运行时的DNS缓存。例如,从历史上看,Java默认情况下会有一些相当长时间的缓存(您可以覆盖它们)。

您也可以自动执行此操作。一种选择是代码管线。

您的"回滚"能力取决于您将快照保留了多少天。要执行回滚,您需要从给定的快照创建一个RDS实例并更改CNAME。

您的其他选项可能使用RDS Read Replica。但我不确定您是否可以在加载期间停止并(重新)启动PostgreSQL的复制过程-就像MySQL一样。我还怀疑,赶上来的复制可能会导致头痛(也许某些DDL语句也不能优雅地或按预期进行复制)。

这篇关于如何在批处理过程中使用AWS/RDS切换数据库并避免停机?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆