目前我有一个站点,有一个Postgres数据库服务器。它只适用于特定数量的用户(少于十个用户),但它需要最大的正常运行时间。
我想要数据库的自动故障转移。
所以我在想:一个服务器运行PGPool II,一个运行Postgres作为主服务器,一个运行Postgres作为从服务器。但是,如果PGPool运行的地方突然失去了动力(或者死亡,或者其他什么),那么就会有一个单一的故障点,整个过程就会崩溃。
如果把这件事外包给别人是不可能的,有解决办法吗?
发布于 2013-10-22 08:31:26
有一件事是可以肯定的,那就是必须至少有两台机器运行pgpool。你如何做到这一点取决于-没有一个普遍适用于所有情况的解决方案。如果您拥有的是一个web应用程序,那么您还必须在至少两台机器中运行web应用程序,这样您就可以制作如下内容:
+----------+ +---------+
| pgmaster | | pgslave |
+----------+ +---------+
| |
+----------+-------------+-----------+
| |
+-----|----+ +-----|----+
| pgpool | | pgpool |
| | | | | |
| webapp | | webapp |
+-----|----+ +-----|----+
| |
internet internet(在这种情况下,您还需要在客户端进行某种类型的故障转移-我已将其标记为“internet”)。
另一方面,如果您确实需要的不是一个高度可用的web应用程序(或类似的服务),而是一个高度可用的postgresql (任何客户端都可以随时与其连接),那么另一个选择是
+----------+ +---------+
| pgmaster | | pgslave |
+----------+ +---------+
| |
+----------+-------------+-----------+
| |
+-----|----+ +-----|----+
| pgpool | | pgpool | (standby)
+-----|----+ +-----|----+
| |
Failover
IP address
|
client在这种情况下,pgpool也可以与数据库位于同一台机器中。重要的是,如果IP地址故障转移可能是keepalived,则需要某种类型的故障转移,但可用的确切解决方案取决于您正在使用的数据中心的较低级别的网络详细信息(例如,keepalived不能在Hetzner中工作,因为它们有一种不同的切换故障转移IP的方式)。还请注意,在这种情况下,连接的客户端可能会在故障转移的情况下断开连接,但它们将能够立即重新连接。
还请注意,还有其他困难,其中之一是您不能排除网络分区的可能性,在这种情况下,两台PostgreSQL机器都将工作和连接,但它们将以某种方式失去彼此之间的连接,因此每个机器都会认为对方已经死了,因此每台机器都将决定成为主导者。为了解决这个问题,我知道了三种解决方案: 1) STONITH,它需要特殊的硬件;2) Quorums,它需要特殊的软件(例如corosync/定时器);3)手动故障转移(管理员得到通知,系统被破坏,直到他们决定如何修复它)。然而,如果您使用我上述提议的方案,那么设置法定人数可能并不太困难,但是使用三位pgpools而不是两位;但我不记得pgpool是否支持这一点。
底线:高可用性可能是困难和昂贵的。仔细研究是否有可能完全避免这样做。如果你做不到,准备多学习,多设计,多重新设计,并意识到这将需要很多时间。
https://serverfault.com/questions/547690
复制相似问题