Postgresql 的复制反过来

Postgresql 的复制反过来

我有两台 Linux 服务器,每台都安装了 Postgresql-10。两台服务器上都有一个数据库,称为 dbexample,具有相同的架构、表和所有内容。两台服务器都从应用程序捕获数据并将其存储在其数据库 (dbexample) 中。让我告诉你,由于两台服务器都从同一个应用程序捕获数据,因此数据不会不匹配。

现在,我的问题是什么? 有一次,服务器“A”由于某种原因发生故障。 那一刻它无法从应用程序捕获数据。 但由于第二个服务器处于运行状态,因此当服务器 A 发生故障时,它一定捕获了当时的所有数据。

现在,当服务器 A 启动时,我希望将当时的所有数据从服务器 B 复制到服务器 A,以便两台服务器上的所有数据都相同。

考虑服务器 B 发生故障的相同情况,我希望情况相反,即将服务器 A 的数据复制到服务器 B。

我已经阅读了许多教程并提出了以下解决方案:

  1. 在两台服务器之间设置逻辑复制,并让它们互相成为发布者和订阅者。(但如果我没记错的话,那只能单向进行,不能反向进行)。所以请建议可能的解决方案是什么。

  2. 安排一台服务器 C 并仅恢复数据库的架构,并使服务器 A 成为发布者,服务器 C 成为其订阅者。服务器 C 成为发布者,服务器 B 成为其订阅者。服务器 B 成为发布者,服务器 A 成为其订阅者。它将像:-

A 将从 B 提取数据,

B 将从 C 提取数据,并且

C 将从 A 提取数据。

当 A 和 B 的数据库中已经有数据时,这是否可行?

请建议哪种方法更好,或者您有其他解决方案。如果我无法表达我的问题,请原谅我的语言。如有任何澄清,请向我询问。

答案1

您想要做的事情通常是通过多主设置(同时写入两个服务器)来完成的。Postgresql-10 默认没有此功能,因此您尝试做的事情始终是一种黑客行为。

通常,你需要设置一个主服务器和一个从服务器,然后使用类似 wal-shipping 的工具来复制数据(流式复制),然后使用 repmgr 之类的工具来监控。启用同步复制将确保两个服务器具有相同的信息,但您只将其写入主服务器!

什么时候替换管理器检测到主服务器发生故障时,它可以自动将从服务器提升为主服务器(反之亦然)。并且如果您使用同步复制,它们将具有完全相同的数据。Repmgr 可以自动执行故障转移。

我也会使用保持活跃在主机上有一个特定的 IP 地址,即 postgresql 主服务器,您将此 IP 配置为客户端的目标。除此之外,您还可以添加类似pgpool2自动对读取进行负载平衡并路由查询到主服务器,但请注意,有很多组件需要正确设置和管理。

如果这还不够,而且你真的只对 Master/Master 设置感到满意,那么你将需要使用一些商业解决方案,例如Postgresql BDR它可以帮你处理复杂问题。

答案2

您不需要双向复制及其额外的复杂性。

只需使用标准复制,并将 B 设置为 A 的备用。

如果 A 发生故障,则让 B 接管主服务器,然后将 A 重新配置为 B 的备用服务器,可能使用pg_rewind此方法。

如果任一节点发生故障,请根据需要重复。

相关内容