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

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

我想托管一个网站,后端将是 PostgreSQL 数据库服务器。我想拥有多个 Web 服务器,位于不同的数据中心以实现冗余。然后我将轮询 DNS 每个 Web 服务器以分配负载。

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

更新 1

有人提出,多个 Web 服务器应该有多个 DB 服务器,以消除单点故障。我非常希望在每个数据中心都设置一个副本。我会在每个数据中心都设置一个 Web 服务器和一个 DB 服务器。我不确定这是否可行,所以我对只有一个 DB 服务器或将所有 DB 都放在一个位置的想法持开放态度。但理想情况下,每个数据中心都应该有自己的 DB 服务器。

答案1

我最近也尝试为一个类似的项目解决这个问题。但我发现这并不容易。谈到复制,有几种开源和商业替代方案。然而,它们中的大多数都不支持多个主主解决方案,而且其中很多都很难维护和设置。

您可以选择其他方式,具体取决于您的 Web 应用程序的设置方式以及所需的冗余度。最简单的方法可能是进行热备份(该功能已包含在 8.3 版中),但如果发生崩溃,您将会遇到停机时间。

我研究过的其他复制解决方案包括:

其中,我发现 Bucardo 最有趣,因为它支持主主模式(但不支持多主模式),而且设置起来似乎相当容易。

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

PgCluster 似乎无人维护,其文档和网站也没有给人留下深刻的印象(网站自 2005 年以来就没有更新过)。

答案2

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

您可以使用以下方式进行多主复制设置几个解决方案。我以前用过 PgCluster,效果不错。还有一个有趣的项目Postgres-R

请记住,一致性是您的敌人。如果您写入一个节点,然后从另一个节点读取,您的请求可能会击败您对另一个数据库的提交。

如果大部分查询都是读取,则可以设置正常的复制方案,然后让代码将数据写入中央主数据库。这需要做更多工作,但可以使一致性问题更容易处理。您可以使用类似斯洛尼进行“正常”复制。

编辑:我同意关于 PgCluster 难以设置且文档质量差的评论!我没有链接到他们,因为在我写这篇文章时他们的网站已经关闭了。

相关内容