目前我有一个网站,一个Postgres数据库服务器。 它只适用于一定数量的用户(less于十个),但需要尽可能多的正常运行时间。
我想为数据库的某种自动故障转移。
所以我想的是:一台运行PGPool II的服务器,一台运行Postgres作为主服务器,一台运行Postgres作为从服务器。 但是,如果PGPool在哪里运行突然失去能力(或者死亡,或者其他),那么就有一个单一的故障点,整个事件就会消失。
有没有解决scheme,假设把这个外包给别人是不可能的?
有一点可以肯定的是,至less有两台机器运行pgpool 。 如何实现这一点取决于 – 没有解决scheme普遍适用于所有情况。 如果你有什么是一个Web应用程序,那么你也必须至less在两台机器上运行Web应用程序,所以你可以这样做:
+----------+ +---------+ | pgmaster | | pgslave | +----------+ +---------+ | | +----------+-------------+-----------+ | | +-----|----+ +-----|----+ | pgpool | | pgpool | | | | | | | | webapp | | webapp | +-----|----+ +-----|----+ | | internet internet
(在这种情况下,您还需要在客户端进行某种故障切换 – 我标记为“Internet”的那一个)。
另一方面,如果你真的需要,而不是一个高度可用的Web应用程序(或类似的服务),而是一个高度可用的postgresql(任何客户端可以随时连接),那么另一种方法是
+----------+ +---------+ | pgmaster | | pgslave | +----------+ +---------+ | | +----------+-------------+-----------+ | | +-----|----+ +-----|----+ | pgpool | | pgpool | (standby) +-----|----+ +-----|----+ | | Failover IP address | client
在这种情况下, pgpool也可以和数据库在同一台机器上。 重要的是,如果IP地址故障转移需要某种forms的keepalived ,但是可用的确切解决scheme取决于您正在使用的数据中心的较低层networking细节(例如, keepalived无法在Hetzner中工作,如他们有切换故障转移IP的不同方式)。 另外请注意,在这种情况下,连接的客户端可能会在故障切换的情况下断开连接,但是他们将能够立即重新连接。
还要注意的是,还有其他的困难,其中之一就是你不能排除networking分区,在这两个PostgreSQL机器上都能正常工作和连接,但是它们会以某种方式失去彼此的连接,所以每个人都会想另一个已经死了,所以每个人都会决定做主人。 为了解决这个问题,我知道了三个解决scheme:1)STONITH,它需要特殊的硬件; 2)需要特殊软件的法定人数(如corosync / pacemaker); 3)手动故障转移(pipe理员会得到通知,系统被中断,直到他们决定如何修复)。 但是,如果你使用我上面提出的scheme,设置一个法定人数不会太困难,但是用三个pgpool而不是两个; 但我不记得是否pgpool支持。
底线:高可用性可能是困难和昂贵的。 仔细检查完全避免的可能性。 如果你做不到,就要做好准备,多学习,多devise,重新devise,注意要花很多时间。