PG池故障转移导致两个独立的主站出现networking故障

我有两个服务器与PG池build立一个Web应用程序创buildHA设置。

PGPool和postgres在两台服务器上运行,使用从服务器1到服务器2的stream式复制。每台机器上的webapp连接到PgPool,然后将请求发送到当前主机。 它被设置为在数据库连接被中断时自动进行故障转移,该数据库连接运行自定义的故障转移脚本以将服务器1降级到从服务器并将服务器2升级为主服务器。

今天早上发生的事情是2分钟内networking出现故障,这意味着两个PGPool实例都不能互相通话 – 所以每个PGPool都认为另一台机器已经closures。

服务器1 – 继续作为主服务器,断开服务器2
服务器2 – 启动故障切换,断开服务器1并使其成为主服务器

由于networking已closures,故障转移命令无法连接到服务器1以使其成为从服务器,反之亦然。 所以当networking在2分钟之后回来的时候,我所拥有的是两个都认为是主人的服务器。

PgPool似乎没有自动故障恢复命令,可以用来强制服务器1在networking重新连接时再次成为主控,这是我能想到的唯一真正的解决scheme。

我的问题是我该如何处理这种情况? 这甚至是这个设置的正确架构? 当然这是一种常见的情况,我不能理解这种情况如何解决。

编辑:这是明智的pgpool下运行在Linux下的虚拟IP – 哈? 这可以解决的事情,我已经有了公共IP的运行 – 这种方式只有一个pgpool实例被任何一台机器访问。

首先,我认为pgpool2确实有一个故障回复命令,但在这种情况下,这并不会有多大帮助。 问题是,如果两台机器都认为他们是主人,那么混乱就会产生。 更重要的是,在这里你有一个简单的例子:networking出现故障。 如果networking是分区的呢? 也就是说,两台机器都是连接的,但它们失去了连接。 在这种情况下,两台机器将成为主人,他们将服务于不同的客户,你将有一个分叉的数据库。 这是一个比较罕见的情况,但是你确定你不太可能准备冒险造成混乱?

另一种select是这样的:

+- master db | ------ pgpool ------+ | +- hot standby 

然而,在这种情况下,你有一个单点故障,pgpool,你可能不想要。 我知道只有两种方法来解决这个问题。 最简单的方法是只提升待机状态,以手动方式进行掌握,这一点适用于您的架构。 您的应用程序需要进入只读模式,直到人为干预。

第二种方法是有法定人数。 一个可以工作的架构是这样的:

  +--- pgpool standing by -+ +- master db | | | failover ip -+--- active pgpool -+----+- hot standby 1 | | | +--- pgpool standing by -+ +- hot standby 2 | +- hot standby 3 (as many standby servers as you want, so that you have read-only load balancing) 

这三个pgpools在三台不同的机器上运行,每台机器都有自己的IP地址,但是它们还提供了一个额外的故障转移IP地址,只能由活动的机器使用,并且是客户使用的。 如果活动的pgpool失败,则备用pgpool会将其结束。 这可以通过heartbeat来完成。

为了促成一个热备份掌握,法定人数(即三个中的至less两个)必须这样决定; 只有在决定后10秒后才能执行。 另外,活动的pgpool可能不会继续使用现有的master数据库超过10秒,而没有从至less另一个pgpool得到确认(这是为了防止两个备用pgpools失去与活动pgpool的连接并且高手在同一时间,推动热备用掌握,但主动pgpool继续使用老主人)。

实际上,第三个pgpool不需要参与故障转移IP,只是为了帮助法定人数。 另外,我不知道pgpool是否有足够的function来做到这一点。 也许你需要另一个守护进程。 更普遍的架构是这样的:

  +--- active pgpool -+ +- master db | | | failover ip -+ -+----------+- hot standby 1 | | | +--- pgpool standing by -+ +---+- hot standby 2 | | | +- hot standby 3 monitoring daemon 1 ---+ | | | monitoring daemon 2 ---+------+ | monitoring daemon 3 ---+ 

在这种情况下,由pgpool完成的负载平衡与主机的待机监视和升级分开。 请注意,您可以将pgpools,数据库服务器和监控守护程序放在同一台计算机上,但这两个pgpool必须位于两台不同的计算机上,并且三个监控守护程序必须位于三台不同的计算机上。 请注意,我不知道是否存在具有所有必要function的现成监视守护程序。

细节可以改变,但是我认为,如果你不使用法定人数来自动进行待机升级,那么你就是在寻求麻烦。

这甚至是这个设置的正确架构? 当然这是一种常见的情况,我不能理解这种情况如何解决。

免责声明:我没有使用pgpool,但我知道它是什么。

在集群软件中,当集群知道节点less于一半的状态时,您通常不希望发生任何可能违反并发规则的自动操作(例如,应该只在一个地方联机)。 这可以防止像您所经历的裂脑情况。 在双节点群集中,这意味着如果两个节点之间的networking互连性丢失,则不应该发生自动故障转移。 一个人应该做出故障恢复的决定,并且已经validation了正确的操作,这取决于“其他”节点处于脱机状态,或者接受可能丢失未复制的事务。 我不知道这是否可以在pgpool中configuration。

如果您的服务器位于同一个局域网(networking延迟较低,可以互相访问),则可以考虑以复制多主机模式运行pgpool。 由于需要同时更新两个数据库,您将需要一点点的开销。

在一个系统发生故障的情况下,pgpool可以继续通过主动节点提供访问。 系统恢复后,可以在pgpool中运行联机恢复,以启动其他节点。