Postgres 9.0和pgpool复制:单点故障?

时间:2012-04-07 08:40:20

标签: postgresql failover pgpool

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

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

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

我读过有关多个pgpool和heartbeat工具的内容,但目前尚不清楚如何操作。

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

4 个答案:

答案 0 :(得分:8)

对于这类应用程序,我非常喜欢Amazon's Dynamo设计。链接文件相当大,但值得一读。事实上,有些应用程序已经实现了这种方法:

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

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

代理层可以在:

中实现
  • 申请(需要很多工作恕我直言);
  • 数据库;
  • 作为中间件。

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

最后注意:无论您决定采用何种方式,都需要进行已知的开发。

修改

这一切都取决于你所谓的“失败”以及你认为系统处于中断状态。

让我们看看pgpool功能。

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

  2. 复制您的所有查询都将自动复制到从属实例。这对于DML和DDL查询有意义。
    如果pgpool中断,你的复制将停止,奴隶将无法跟上master,因为在pgpool之外没有进行更改跟踪(据我所知)。

  3. 负载平衡您的只读查询将分布在多个实例中,实现良好的响应时间,允许您在系统上放置更多带宽。
    如果是pgpool如果系统能够处理这样的负载,您的查询将突然运行得慢得多。这就是master数据库将会捕获而不是失败的pgpool。

  4. 限制超出连接 pgpool会在连接无法立即处理的情况下对连接进行排队。
    如果pgpool中断,所有此类连接都将中止,这可能会中止制动数据库/应用程序协议,即应用程序旨在永远不会中断连接。

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

  6. 如果你能够面对这样的条件并且你不把它们视为失败,那么pgpool可以很好地为你服务。如果5分钟的停机会使您的公司损失数千美元,那么您应该寻求更加可靠的解决方案。

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

    • DNS,除非您希望所有客户端重新配置;
    • 重新初始化备份和故障转移过程;
    • 确保老主人不会试图为它的角色而战,以防它回来(STONITH);
    • 根据我的经验,我们是来自DBA,SysAdmin,建筑师和运营部门的人员,他们负责决定适当的策略。

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

    由于PostgreSQL具有很强的可扩展性,因此可以轻松地进行分发。

答案 1 :(得分:2)

首先,我建议检查pgBouncer而不是pgpool。接下来,您尝试达到什么级别的缩放?您可能只是选择在所有客户端系统上运行连接池(保护程序足够轻,以便工作)。

那就是说,vyegorov的回答可能是你应该在这个时代真正看到的方向。你确定你真的需要数据库吗?

修改

所以,相当明显的答案是,如果只有一个盒子运行它,pgPool会创建一个单点故障。显而易见的解决方案是跨多个盒子运行多个poolers。然后,您需要设计应用程序代码以处理数据库断开连接。听起来并不那么容易,但基本上你需要使用两阶段提交进行非幂等更改。因此,在最大程度上,您应该将您的更改视为幂等。

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

我之前的评论询问你是否真的需要数据库是由于我认为你设计了一个系统而没有详细讨论这部分内容。我有大约20年的经验来研究类似系统的“这一部分”。我希望你会发现没有开箱即用的解决方案,所涉及的问题变得非常复杂。换句话说,我建议你重新考虑你的设计。

答案 2 :(得分:2)

尝试阅读此博客(包含有关PostgreSQL和Pg​​Pool-II的大量信息):

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

搜索" WATCHDOG"在同一个博客上。有了它,您可以配置PgPool-II群集。但是,需要在同一子网上使用两台计算机,并在同一子网上使用虚拟IP。

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

答案 3 :(得分:0)

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

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

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

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