我想在我们的一个项目中使用 Windows Server 2012 R2 中的 Postgresql,实现 24/7 的正常运行时间。
我想询问社区,我是否可以在 2 个不同的服务器 A 和 B 中拥有 2 个主实例,并且它们将在位于 lan 中的共享文件存储中的同一个数据库上“工作”。服务器 A 上的一个主实例总是在线,当它由于某种原因离线时(我想),powershell 脚本将识别出 postgresql 服务已停止,并将在服务器 B 中启动该服务。相同的脚本将持续检查是否只有一个服务器 A 和 B 中的服务正在努力避免冲突。
我想问一下这是否可行或者是否有更好的方法适合我的配置。 (我无法使用复制,因为当服务器 A 关闭时,服务器 B 处于只读模式,这是我不想要的)
最佳答案
如果您设法在同一数据目录上启动两个 PostgreSQL 实例,将会发生严重的数据损坏。
通常有一个 postmaster.pid
文件可以防止这种情况发生,但是访问同一文件系统的另一台计算机上的 PostgreSQL 服务器进程会在喷出一些日志消息后愉快地取消链接,认为这是因车祸而落下。
因此,使用这样的解决方案确实是如履薄冰。
您没有想到的另一个问题是应该检查服务器是否仍在运行的脚本。如果该脚本失败怎么办?例如,因为两个服务器之间的网络连接已关闭,但服务器仍然正常运行?这种“裂脑”场景将导致您的设置数据损坏。
另外一句警告:由于您似乎使用的是 Windows(Powershell?),因此当您谈论共享存储时,您可能会想到 CIFS 文件系统。 Windows“网络共享”不是一个可靠的文件系统 - 上次我检查时,它不尊重 _commit
.
创建可靠的故障转移集群比您想象的要困难,我建议您在尝试推出自己的解决方案之前检查现有的解决方案。
关于postgresql - 同一数据库上的两个主实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44923535/