26.3. 故障转移

如果主服务器失效,则后备服务器应该开始故障转移过程。

如果后备服务器失效,则不会有故障转移发生。如果后备服务器可以被重启(即使晚一点),由于可重启恢复的优势,那么恢复处理也能被立即重启。如果后备服务器不能被重启,则一个全新的后备服务器实例应该被创建。

如果主服务器失效并且后备服务器成为了新的主服务器,那么接下来旧的主服务器重启后,你必须有一种机制来通知旧的主服务器不再成为主服务器。有些时候这被称为STONITH(Shoot The Other Node In The Head,关闭其他节点),这对于避免出现两个系统都认为它们是主服务器的情况非常必要,那种情况将导致混乱并且最终导致数据丢失。

很多故障转移系统仅使用两个系统,主系统和后备系统,它们由某种心跳机制连接来持续验证两者之间的连接性和主系统的可用性。也可能会使用第三个系统(称为目击者服务器)来防止某些不当故障转移的情况,但是除非非常小心地建立它并且经过了严格地测试,额外的复杂度可能会使该工作得不偿失。

PostgreSQL并不提供在主服务器上标识失败并且通知后备数据库服务器所需的系统软件。现在已有很多这样的工具并且很好地与成功的故障转移所需的操作系统功能整合在一起,例如 IP 地址迁移。

一旦发生到后备服务器的故障转移,就只有单一的一台服务器在操作。这被称为一种退化状态。之前的后备服务器现在是主服务器,但之前的主服务器处于关闭并且可能一直保持关闭。要回到正常的操作,一个后备服务器必须被重建,要么在之前的主系统起来时使用它重建,要么使用第三台(可能是全新的)服务器来重建。在大型集簇上,pg_rewind功能可以被用来加速这个过程。一旦完成,主服务器和后备服务器可以被认为是互换了角色。某些人选择使用第三台服务器来为新的主服务器提供备份,直到新的后备服务器被重建,不过显然这会使得系统配置和操作处理更复杂。

因此,从主服务器切换到后备服务器可以很快,但是要求一些时间来重新准备故障转移集群。从主服务器到后备服务器的常规切换是有用的,因为它允许每个系统有常规的关闭时间来进行维护。这也可以作为一种对故障转移机制的测试,以保证在你需要它时它真地能够工作。我们推荐写一些管理过程来做这些事情。

要触发一台日志传送后备服务器的故障转移,运行pg_ctl promote或者创建一个触发器文件,其文件名和路径由recovery.conf中的trigger_file设置指定。如果你正在规划使用pg_ctl promote进行故障转移,trigger_file就不是必要的。如果你正在建立只用于从主服务器分流只读查询而不是高可用性目的的报告服务器,你不需要提升它。