postgresql - 同一数据库上的两个主实例

标签 postgresql high-availability failover

我想在我们的一个项目中使用 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/

相关文章:

java - 如何将主键也用作 JPA 和 Hibernate 的外键引用?

linux - 没有误报风险的高可用性计算 : How to deal with a non-returning system call,?

支持oracle TAF功能的java连接字符串

redis - 集群故障转移

Postgresql like into if 子句

postgresql - 使用 Ansible 运行 postgresql96-setup initdb 时出错

hadoop - 自动故障转移在 Hadoop 中不起作用

hadoop - 为什么 NameNode HA 使用 JournalNode 而不是 Zookeeper 本身?

MySQL 代理和基本故障转移(检测状态)

javascript - 捕获sequelize模型中的错误