9

我的应用程序使用 Postgresql 9.0,由一个或多个与全局数据库交互的站组成:它就像一个普通的客户端服务器应用程序,但为了避免任何额外的硬件,所有站都包括客户端和服务器:一个主站被提升为行动也作为服务器,任何其他行为作为它的客户端。该解决方案使我具有可扩展性:用户最初可能需要一个站点,但它可以决定将来扩展到更多站点,而在初始阶段没有无用的单独服务器。

如果主站出现故障,我会尽量避免所有其他人停止工作;要做到这一点,最好的解决方案可能是将主数据库连续复制到一个或多个站点上未使用的数据库。

搜索我发现 pgpool 可用于满足我的需要,但从所有示例和教程看来,故障点似乎从主数据库移动到运行 pgpool 的服务器

我读了一些关于多个 pgpool 和心跳工具的东西,但不清楚如何去做。

考虑到我的架构,哪里不存在分离和专门的服务器,有人可以给我一些提示吗?如果发生故障转移,似乎 pgpool 会自动执行所有操作,我是否可以认为故障转移情况可以由标准用户处理而无需管理员干预?

4

4 回答 4

8

对于这类应用程序,我真的很喜欢Amazon 的 Dynamo设计。链接的文档很大,但值得一读。事实上,有些应用程序已经实现了这种方法:

也许其他人,但我不知道。Cassandra 从 Facebook 开始,Voldemort 是 LinkedIn 使用的。使事物分布式并在数据分布中添加冗余,您将远离传统的主从复制方法。

如果您想继续使用 PostgreSQL,那么实施这种方法应该没什么大不了的。您将需要实现一个额外的层(代理),它将根据预先配置的选项决定如何检索/保存数据。

代理层可以实现在:

  • 应用程序(需要大量的工作恕我直言);
  • 数据库;
  • 作为中间件。

您可以在中间件层使用PL/Proxy,该项目起源于 Skype。它已深度集成到 PostgreSQL 中,所以我会说它是选项 2 和 3 的组合。PL/Proxy 将要求您使用函数对数据库进行各种查询。如果您遇到性能问题,可以使用PgBouncer 。

最后一点:无论您决定采用哪种方式,都需要进行已知数量的开发。

编辑:

这完全取决于您所说的“故障”以及您认为系统处于中断状态的原因。

让我们看看pgpool的特性。

  1. 连接池PostgreSQL 每个会话使用一个进程(fork)。显然,如果您有一个非常繁忙的站点,您将达到操作系统限制。为了克服这个问题,使用了连接池。它们还允许您均匀地使用资源,因此通常最好在数据库之前使用 pooler 。
    如果 pgpool 中断,您将面临大量无法访问您的数据库的客户端。如果您将它们直接指向数据库,避免使用 pooler,您将面临性能问题。

  2. 复制您的所有查询都将自动复制到从属实例。这对 DML 和 DDL 查询有意义。
    如果 pgpool 中断,您的复制将停止并且从属服务器将无法赶上主服务器,因为在 pgpool 之外没有进行任何更改跟踪(据我所知)。

  3. 负载平衡您的只读查询将分布在多个实例中,从而实现良好的响应时间,从而使您可以在系统上增加更多带宽。
    在 pgpool 中断的情况下,如果系统能够处理这样的负载,您的查询将突然运行得更慢。这是在 master 数据库将追赶而不是失败的 pgpool 的情况下。

  4. 限制超出的连接pgpool 会将连接排队,以防它们无法立即处理。
    在 pgpool 中断的情况下,所有此类连接都将被中止,这可能会破坏 DB/应用程序协议,即应用程序被设计为永远不会中止连接。

  5. 并行查询在多个节点上执行单个查询以减少响应时间。
    在 pgpool 中断的情况下,将无法进行此类查询,从而导致处理时间更长。

如果你可以面对这样的情况并且你不认为它们是失败的,那么 pgpool 可以很好地为你服务。如果 5 分钟的中断将使您的公司损失数千美元,那么您应该寻求更可靠的解决方案。

中断的成本越高,故障转移系统的调整就应该越精细。通常,它不仅仅是用于实现故障转移自动化的单一工具。在每次失败中,您都必须进行调整:

  • DNS,除非您想要所有客户端的重新配置;
  • 重新初始化备份和故障转移程序;
  • 确保老主人不会试图为它的角色而战,以防万一它回来(STONITH);
  • 根据我的经验,我们是来自 DBA、系统管理员、架构师和运营部门的人,他们决定适当的策略。

最后,在我看来,pgpool 是一个很好的工具,我确实使用它。但它并非设计为一个完整的故障转移解决方案,并非没有额外的思考、采取的措施、编写的脚本。因此,我提供了分布式数据库的链接,它们提供了更高级别的可用性。

并且由于它的可扩展性,PostgreSQL 可以很容易地分发。

于 2012-04-07T20:28:30.390 回答
2

首先,我建议查看pgBouncer而不是 pgpool。接下来,您试图达到什么级别的扩展?您可能只是选择在所有客户端系统上运行连接池(bouncer 足够轻,可以正常工作)。

也就是说,vyegorov 的答案可能是您在当今时代真正应该关注的方向。你确定你真的需要一个数据库吗?

编辑

因此,相当明显的答案是,如果您只有一个机器运行 pgPool,它会产生单点故障。显而易见的解决方案是跨多个盒子运行多个池化程序。然后,您需要设计您的应用程序代码来处理数据库断开连接。这听起来并不容易,但基本上您需要使用两阶段提交来进行非幂等更改。因此,您应该尽最大可能使您的更改具有幂等性。

根据您的评论,我猜您可能在处理数据库复制方面的经验有限?pgPool 执行基于语句的复制。这里有权衡。好处是它很容易设置。缺点是不能保证复制数据库上的数据是相同的。它也(我相信但最近没有检查过)与 2pc 不兼容。

我之前的评论询问您是否真的需要一个数据库,这是因为我认为您已经设计了一个系统,但没有详细介绍这部分的这一部分。我在处理类似系统的“这部分”方面拥有大约 2 年的经验。我希望您会发现没有开箱即用的解决方案,并且所涉及的问题变得非常复杂。换句话说,我建议你重新考虑你的设计。

于 2012-04-24T00:37:18.540 回答
2

尝试阅读这个博客(包含大量关于 PostgreSQL 和 PgPool-II 的信息):

https://www.itenlight.com/blog/2016/05/21/PostgreSQL+HA+with+pgpool-II+-+Part+5

在同一个博客上搜索“看门狗”。使用它,您可以配置 PgPool-II 集群。但是,需要同一子网上的两台机器,并且需要同一子网上的虚拟 IP。

希望这对任何尝试相同事情的人有用(即使这个答案已经很晚了)。

于 2016-11-16T11:36:52.057 回答
0

PGPool 肯定会成为单点故障,但它比 Postgres 实例小得多。

虽然我还没有尝试过,但应该可以有两台安装了 PGPool 的机器,但只能在一台机器上运行。然后,如果主服务器不可用,您可以使用 Linux-HA 在备用主机上重新启动 PGPool,并在主服务器恢复时可选择再次将其故障恢复。您还可以同时使用 Linux-HA 移动单个虚拟 IP,以便您的客户端可以连接到单个 IP 以获取其 Postgres 服务。

postgres 服务器的死亡将使 PGPool 向备份 Postgres 发送查询(必要时将其提升为 master)。

PGPool 服务器的死机将导致短暂的中断(可配置,但可能在 <1 分钟的范围内),直到 PGPool 在备用服务器上启动、声明 IP 地址并发送无偿 ARP。当然,客户端必须足够聪明才能重新连接而不会死亡。

于 2013-08-01T04:11:08.440 回答