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

我试图避免如果主站掉线,所有其他站都停止工作;为此,最好的解决方案是将主数据库连续复制到一个或多个站上未使用的数据库。

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

我读了一些有关多个pgpool和心跳工具的信息,但不清楚如何做到这一点。

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

最佳答案

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

  • mongoDB
  • Cassandra
  • Project Voldemort

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

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

    代理层可以通过以下方式实现:
  • 应用程序(需要大量的工作恕我直言);
  • 数据库;
  • 作为中间件。

  • 您可以在中间件层(源于Skype的项目)上使用PL/Proxy。它已与PostgreSQL深度集成,因此我将其结合为选项2和3。PL/Proxy将要求您使用函数对数据库进行所有类型的查询。
    万一您遇到性能问题,可以使用PgBouncer

    最后说明:您决定采取的任何方式,都需要已知的开发量。

    编辑:

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

    让我们看一下pgpool功能。
  • 连接池 PostgreSQL在每个 session 中使用单个进程(分支)。显然,如果您的站点非常繁忙,则会遇到操作系统限制。为了克服这个问题,使用了连接池。它们还允许您平均使用资源,因此通常最好在数据库之前使用池化程序。如果pgpool中断,您将面临大量无法访问数据库的客户端。如果将它们直接指向数据库(避免使用合并程序),则会遇到性能问题。
  • 复制您的所有查询将自动复制到从属实例。这对于DML和DDL查询具有意义。万一pgpool中断,您的复制将停止并且从属将无法跟上master,因为在pgpool之外没有进行任何更改跟踪(据我所知)。
  • 负载平衡您的只读查询将分散在多个实例上,从而获得不错的响应时间,使您可以在系统上分配更多带宽。如果pgpool中断,则如果系统能够运行,查询的速度将突然变慢。处理这样的负载。在这种情况下,主数据库将 catch 而不是失败的pgpool。
  • 限制超出的连接 pgpool将在无法立即处理的情况下将连接排队。如果pgpool中断,则所有此类连接都将中止,这可能会破坏DB/Application协议(protocol),即应用程序被设计成永远无法获取连接异常终止。
  • 并行查询在多个节点上执行单个查询以减少响应时间。如果pgpool中断,将无法进行此类查询,从而导致处理时间更长。

  • 如果您可以很好地应对此类情况,并且不将其视为失败,那么pgpool可以很好地为您服务。而且,如果中断5分钟会使您的公司损失数千美元,那么您应该寻求一个更可靠的解决方案。

    中断的成本越高,故障转移系统应该越优化。
    通常,它不仅仅是用于实现故障转移自动化的单个工具。
    在每次失败中,您都必须进行以下调整:
  • DNS,除非您希望所有客户端都重新配置;
  • 重新初始化备份和故障转移过程;
  • 确保旧主人在返回时不会尝试为自己的角色而战斗(STONITH);
  • 以我的经验,我们由来自DBA,SysAdmin,架构师和运营部门的人员来决定适当的策略。

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

    由于PostgreSQL具有很好的可扩展性,因此可以不费吹灰之力就可以发布PostgreSQL。

    关于postgresql - Postgres 9.0和pgpool复制: single point of failure?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10053049/

    10-11 03:00