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

doc*_*doc 9 postgresql failover pgpool

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

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

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

我读了一些关于多个pgpool和heartbeat工具的内容,但目前尚不清楚如何做到这一点.

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

vye*_*rov 8

对于这些应用程序,我非常喜欢亚马逊的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中断的情况下,所有这些连接都将被中止,这可能会制止DB/Application协议,即Application被设计为永远不会中断连接.

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

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

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

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

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

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