由于主/从数据库之间的复制滞后,如何避免读取副本中的旧记录或丢失记录?

问题描述 投票:0回答:1

我正在使用具有主设置和副本设置的AWS Aurora Postgres数据库。在我的应用程序的一部分中,系统必须在插入或更新同一表上的记录后立即从TableA中读取。由于它是从副本中读取的,因此母版和读取的副本之间会稍有延迟。因此,我并不总是获得最新的数据,有时记录可能会丢失,因为副本尚未同步主记录。

我现在要做的是在插入/更新查询之后,将应用程序此部分中的所有读取查询定向为直接从master中的TableA读取。但是,由于它从该查询中读取的次数很多,因此主实例上的负载猛增了很多。

突然,在应用程序的这一部分中,对主机进行的IOPS数量是其两倍。如果对TableA进行了100,000次插入/更新,那么现在在主实例上也将从TableA中读取另外1000,000次!同时,该副本的负载很小,但由于复制滞后,我无法将其读取操作转移到该副本上。这导致无法完全利用副本。

我可以使用任何策略来预防此问题吗?

虽然直接从母版中读取作品,但通过如此多的读取操作击打母版听起来并不正确。

我正在我的应用程序中使用Node and Sequelize。

node.js database postgresql database-replication master-slave
1个回答
1
投票

流复制实际上不是负载平衡设备。

如果要立即在备用数据库上看到数据修改,则必须

  1. 通过将备用数据库添加到主数据库上的synchronous_standby_names来使用同步流复制(但是请注意,这会降低总可用性!

  2. 在主服务器上设置synchronous_commit = remote_apply的设置

这仅在网络延迟较低且您没有大量写入事务的情况下才能很好地工作,因此对于托管数据库来说可能是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.