将整个 PostgreSQL 集群复制到另一个(相同的)服务器

kon*_*ify 2 postgresql replication backup write-ahead-logging

我希望将 PostgreSQL 10 集群从server1克隆到server2,它在相同的硬件上运行相同的 Postgres 版本。目的是负载平衡和 HA。要记住的事情:

  • 数据库非常大(TB 级),网络非常好。我想避免使用中间文件。
  • 克隆实时数据库会很酷,但如果需要,我也可以关闭集群。

我考虑过的选项:

  1. pg_dump | psql 当然,但这需要重新创建索引,并且对于相同系统之间的完整副本来说似乎非常缓慢且效率低下。
  2. 使用server2作为从属设备设置流式复制,等待它与server1同步,然后重新配置两者以再次禁用复制(我不需要它)。似乎一堆毫无意义的配置工作有错误的余地。
  3. 关闭集群、rsync所有 Postgres 文件夹和文件。有这么多数据存在数据损坏的风险,我需要确保我得到了所有东西(大概只有数据目录是不够的)。
  4. 我可以pg_basebackup直接通过管道以pg_receivewal某种方式完成这项工作吗?找不到我的用例的说明。

做到这一点的最佳方法是什么?好像是很常见的情况。

jja*_*nes 5

您的选项 1pg_dump | psql确实有您描述的限制。

您的选项 2 没有多大意义。您需要从克隆开始以设置流式传输,当您拥有克隆时,您就不需要流式传输了,因为您已经有了克隆。此外,您不必“重新配置两者以再次禁用复制”。当您提升备用数据库时,它不再是备用数据库,不再需要重新配置。如果你在 master 上使用了一个命名插槽,你只需要删除它。如果您使用了临时插槽,则甚至不需要这样做。如果你想为自己创造额外的工作,你可以将“wal_level”降为“minimal”,如果你想为自己创造额外的工作,你可以将“max_wal_senders”设置为 0。所以不要做这些事情。以允许未来流式复制的方式保留主配置。

您在选项 3 中的担忧也没有任何意义。为什么 rsync'ing 数据比您可以对 TB 数据执行的任何其他操作(例如普通备份,甚至只是运行数据库)更容易受到损坏?Rsync 不会特意破坏您的数据。如果您需要的不仅仅是数据目录,那么首先取决于系统的配置方式。你有表空间吗?数据目录中的配置文件,还是其他地方。如果你做了这些事情,那么是的,你必须处理它们。当您决定放弃最简单的配置时,这就是您注册的内容。

在选项 4 中,“pg_basebackup”的输出不会通过管道传送到“pg_receivewal”。它们并非旨在以这种方式协同工作。“pg_basebackup”已经可以创建一个独立的目录,这是你想要的,所以你可以直接使用它。我想你想在你想要新服务器所在的主机上执行,pg_basebackup -D newdir -F plain -h prod_host.example.com

您目前如何备份您的数据库?进行克隆的最佳方法可能是利用您当前的备份策略。如果需要,您将如何从备份中恢复?对此的小改动应该可以让您获得克隆(以及测试您当前的备份策略是否有效)


Lau*_*lbe 5

正确的方法是采用纯格式pg_basebackup

只需确保--wal-method=stream备份将包含所有必需的 WAL 文件。

然后在备份目录上启动服务器,它将执行恢复并启动。

没必要去乱搞pg_receivewal