如何在网站上使用分布式PostgreSQL数据库?

我想主办一个网站,后端将是一个PostgreSQL数据库服务器。 我想有多个Web服务器,在不同的数据中心冗余。 然后,我会循环DNS每个Web服务器来分配负载。

要做到这一点,我应该也有多个数据库,并使用某种复制? 或者,有一个数据库并让每个Web服务器通过互联网指向它会更好吗?

更新1

这个想法被提出,多个Web服务器应该有多个数据库服务器,以消除单点故障。 我真的希望在每个数据中心都有一个重复的设置。 我会在每个数据中心都有一个Web服务器和一个数据库服务器。 我不确定这是否可能,所以我保持开放的想法,只有一个数据库服务器,或所有数据库在一个位置。 但理想情况下,每个数据中心都有自己的。

我最近也试图找出一个类似的项目。 我所发现的并不那么容易。 谈到复制,有几种开源和商业的select。 但是,其中大部分不支持多种主 – 主解决scheme,其中很多都难以维护和设置。

根据您的networking应用程序的设置以及您需要多less冗余,您可以select其他方法。 最简单的一个可能是做一个热备份(该function已经包含在8.3版本中),但是如果发生崩溃,则会导致停机。

我看过的其他复制解决scheme包括:

  • Slony聚
  • PgCluster
  • Bucardo这
  • Londiste

在这些之中,我发现Bucardo是最有趣的,因为它支持master-master(不是多个),而且似乎很容易设置。

Slony有点难以设置,并且在更新表时也需要大量的维护(DDL更改不会被复制),而且也只是一个主 – 从,这意味着只能写入一个数据库。

PgCluster似乎没有被维护,并没有给文档和网站留下真正的印象(该网站自2005年以来没有更新)。

通过DNS进行全局循环可能会导致您的连接不可持续。 如果您的代码不能识别节点,您应该期望在任何复制的数据库上进行写入。

您可以使用一些解决scheme来执行多主复制设置。 我以前使用过PgCluster,取得了很好的成绩。 在Postgres-R上也有一个有趣的项目。

记住一致性是你的敌人在这里。 如果您写入一个节点,然后从另一个节点读取,则您的请求可能会超出您对其他数据库的提交。

如果大部分查询都是读取,则可以设置正常的复制scheme,然后让代码写入中央主数据库。 这是更多的工作,但它使一致性问题更容易处理。 你可以使用像Slony这样的东西来做“正常的”复制。

编辑:我同意关于PgCluster难以build立和有不好的文档的意见! 我没有链接到他们的网站,因为我写这个。