更改 AWS 的只读副本的流式复制以触发基于复制

Mit*_*pta 5 postgresql replication aws postgresql-9.3 amazon-rds

我们有一个 Postgres RDS 实例,我们为它创建了一个只读副本实例。我们面临的问题是,只要在只读副本上有长时间运行的查询(大约 30-40 分钟),它就不会完成并给出冲突错误。发生此冲突的原因是主 RDS 上有更新,该更新反映到只读副本,因为它遵循流式复制方法。正是出于这个原因,也由于新的需求,我们需要每天进行此复制过程,即我们需要基于触发器的方法(类似于每日备份方法)而不是持续更新。

我在AWS的控制台中看到,我们可以设置各种参数。我可以设置一些参数来满足我的要求吗?或者对我来说唯一的出路是删除只读副本实例并使用基于触发器的复制工具(如 Bucardo)并为此使用 EC2 实例?

我真的更喜欢这种方法,通过它我可以调整一些参数并实现我的目标,而不必删除只读副本实例。

Jos*_*idt 4

我们面临的问题是,每当只读副本上有一个长时间运行的查询(大约 30-40 分钟)时,它就不会完成并给出冲突错误。

此行为由参数max_standby_streaming_delay / max_standby_archive_delay控制。您可以在只读副本实例使用的 RDS 参数组中调整这些参数,以便有更多时间完成针对只读副本的查询。

正是出于这个原因,也由于新的要求,我们需要每天进行此复制过程,即我们需要一种基于触发器的方法(类似于每日备份方法),而不是持续更新。

如果您希望每晚刷新主数据库的快照,您可以通过每晚恢复 RDS 快照的 cron 作业来完成此操作。我不认为 RDS 有一个按钮可以自动为您执行此操作,但使用 AWS CLI编写夜间create-db-snapshot + Restore-db-instance-from-db-snapshot应该不会太难、或 boto 或任何您喜欢的 AWS 接口。您甚至可以维护一个始终指向最新实例的 Route53 条目,并让旧实例在被终止之前保留一天左右,这样针对现有实例运行的会话过夜就不会被中断。

我在AWS的控制台看到,有各种参数我们可以设置。我可以设置一些参数来实现我的要求吗?或者对我来说唯一的出路是删除只读副本实例并使用基于触发器的复制工具(如 Bucardo)并为此使用 EC2 实例?

据说现在可以将 Bucardo 连接到 RDS,因为 RDS Postgres 支持会话复制角色,但如果您想要夜间快照,我认为使用 RDS 实例快照会更好。