共享存储
仅冷备
PostgreSQL(与各种 PostgreSQL 供应商分支不同)不支持多主或主从共享存储操作。它只能在冷备故障转移配置中用于共享存储,即使如此,也只有在健壮的围栏/STONITH 下才安全。
尝试在多主共享存储配置中使用 PostgreSQL 将导致极其严重的数据损坏。PostgreSQL 通常对多个 postmaster 的保护(postmaster.pid,shmem 锁等)在共享存储配置中不起作用,因此围栏中的错误可能会导致严重的数据问题。
如有疑问,应使用复制。对于“绝不能丢失事务”的部署,同步复制几乎肯定更合适。
创建高度可用的热/冷 PostgreSQL 对的一种方法是使用共享存储:单个高度冗余的磁盘阵列(通常是昂贵的 SAN,但有时是高质量的 NFS 服务器)连接到两台服务器。 此主题在 https://postgresql.ac.cn/about/press/faq 和 http://www.enterprisedb.com/products/allfaq.do 中都有简要介绍。
使用 PostgreSQL 和专有集群系统之一或使用 Linux-HA 构建共享存储实现很简单。
您必须弄清楚的主要问题是:a) 您将使用哪种集群软件解决方案,从免费的 Linux 到多个专有选项不等,以及 b) 您将如何强制执行从主节点降级为从节点的节点重新连接(称为围栏)。这两个决策之间存在一些重叠;并非每个集群程序都支持每种节点围栏方法。
适合这种方法的集群软件包括来自 Veritas、RedHat 和 Linux HA 项目的产品。 Sun 甚至在 https://blogs.oracle.com/SC/entry/migrating_from_veritas_cluster_server 中将 PostgreSQL 支持列为其产品的特定优势。
一个难点是在共享 SAN 的两台服务器之间建立心跳,心跳既要足够敏感以捕获故障,又要避免过于偏执而导致无谓的故障转移(例如,当主服务器负载激增并变慢时)。务必在评估任何供应商时仔细测试这一部分。
就 PostgreSQL 的具体细节而言,您需要一个可靠的方法来确保已将现已失效的主节点与 SAN 断开连接(经典的 STONITH 或“将另一个节点击毙”问题)。您*应该*只需在执行此操作后在备份上重新启动数据库即可。这将作为标准崩溃启动,运行 WAL 重放崩溃恢复,结果应该与您在原始节点上崩溃后重新启动的结果相同。您不能让发生的事情是允许原始主节点在该过渡发生后继续写入共享 SAN 卷。
共享存储故障转移的难点始终在于解决“将另一个节点击毙问题”,以防止已停机的节点在不再是活动节点后恢复。为了很好地做到这一点,您实际上需要在硬件级别(“围栏”)上锁定现已不可用的节点,使其无法访问存储 - 禁用其存储端口是处理此问题的一种方法。弄清楚如何在可靠地集成到合适的集群管理器的方式下做到这一点,您就可以毫无疑问地使用 PostgreSQL 完成此操作。
在 http://www.clusterlabs.org/doc/crm_fencing.html 中对 Linux-HA 的围栏选项进行了描述。解决此问题的廉价方法是使用 UPS 禁用流向已停机节点的电源。完成此操作后,您可以安全地将共享存储故障转移到另一个系统。在那时,您甚至可能可以重新打开电源,前提是现在已重新启动的系统能够在新的系统启动期间重新访问存储。
典型设置
以下是一名用户(John Pierce)关于这种部署方式的写作
在我见过的 HA 集群中,大多数情况下,RAID 控制器都在 SAN 中,而不是在主机中,它们有自己的故障转移,带有共享写缓存,并且广泛使用 ECC,因此可以检测到双位内存错误之类的事件并将其视为故障。这些系统中使用的高端 SAN 通过广泛使用冗余、双端口磁盘、完全冗余的各个部分、镜像缓存等具有 5-9 的可靠性。
同样,这些类型的集群中使用的服务器具有 ECC 内存,因此应检测到内存故障,而不是以损坏数据的形式盲目传递。服务器级 CPU,尤其是 RISC CPU,在其缓存、数据总线等内部具有广泛的 ECC,因此可以检测到那里的任何故障,而不是允许它损坏数据。故障模式可能包括风扇故障(将被检测到,如果太多风扇故障,将导致服务器关闭)、电源故障(冗余 PSU,但我见过电源组合电路出现故障)。任何这些类型的故障都将导致故障转移,而不会损坏数据。
当然,还有有意进行的计划故障转移以进行操作系统维护... 您修补备用系统,故障转移到该系统并验证其良好,然后修补另一个系统。
我们在海外的一个站点有一个大型 HA 系统,由于楼上洒水系统故障导致主计算机房发生洪水,该系统发生了一次故障转移。SAN 镜像到第二个数据中心 (光纤互连) 的 SAN,备份服务器也在校园内第二个数据中心,因此一切正常地发生了故障转移。这个特定系统是大型 Sun 硬件和大型 EMC 存储,它运行的是 Oracle 而不是 Postgres。在 15 年的时间里,我们在各个站点也经历过几次大型 UPS 故障,还有 HVAC 故障。
在我对一些集群的开发实验室测试中,我使用了将我各种各样的服务器连接起来的 QLogic 5600 FC 交换机... 我使用 RHCS 进行了一次测试,它通过 telnet 支持 qlogic... 我在 qlogic 中创建了两个区域集,每个区域集对应一个状态,备用主机被阻止访问 LUN,集群管理器使用 telnet 与交换机通信。我在两个独立的以太网上运行心跳(一个是实验室 LAN 段,另一个是我将所有服务器连接到一起用于各种测试的专用交换机)。Qlogic 交换机还有另一个区域集,用于不受这些集群测试影响的各种其他服务器和存储。
我不喜欢对服务器进行电源循环,因此我宁愿不使用基于电源开关的围栏,尽管我相信我的刀片机箱的管理单元被支持为电源围栏设备。
致谢
过去在 PostgreSQL 列表中讨论过这样做的方法,包括
- http://markmail.org/message/s4gka6dotadefgll
- http://markmail.org/message/f7gsispb2e56d7k6
- http://markmail.org/message/hpjh4f4z7pxslmpf
这些讨论中的一些很好的建议尚未被纳入本次讨论。
此处的初始文本来自 pgsql-general 和 pgsql-admin 列表中的那些讨论,主要来自 Greg Smith 和 John Pierce。由 Craig Ringer 修订,其中包含更最新的信息以及关于共享存储限制的更清晰的陈述。