具有共享磁盘的多个 Postgres 服务器(一个写入器,多个读取器)

具有共享磁盘的多个 Postgres 服务器(一个写入器,多个读取器)

场景如下:

  1. 一个分片磁盘 (Gluster)
  2. 多个 Postgres 服务器

要求:

  1. 使用共享磁盘存储数据库文件
  2. 使用提供最高效率的配置

到目前为止的调查结果

  1. 可以使用共享磁盘来存储数据,如下所示文档但它还说“另一个问题是,当主服务器运行时,备用服务器永远不应访问共享存储”。这​​意味着所有服务器(主服务器除外)都处于闲置状态,这对我们来说几乎是不可接受的。

  2. 由于我们使用的是共享磁盘,因此不应该有复制。已在此找到文档某些配置(原始模式和主/从模式)已经足够好了。但另一个问题是,它们可能会导致上述问题。

问题:

  1. 网上有很多文档,让我对它们的要求和功能感到困惑。我的理解正确吗?
  2. 如果是这样,是否有可能实现这个设计(使用 pgpool 或任何其他工具)
  3. 如果有的话,请指出工具和/或关键词,以便我可以找到更多信息。

注意(对于那些希望尽可能多地关闭问题的人)- 我以前也遇到过这种情况。有人说我在寻找基于观点的答案。事实上我不是。我正在寻找的是技术名称或某种关键字,不管是什么。这样我就可以通过使用它们来搜索更多信息。有时你需要知道一些关键字才能搜索和找到信息。

提前致谢。

答案1

无法从同一个数据目录运行多个 PostgreSQL 服务器,即使除一个之外的所有服务器都是只读的。绝对 100% 不支持。无法做到。现在放弃。

也许有一天会有人添加这样的功能,但这需要主要的对 PostgreSQL 的更改,因为 Pg 严重依赖共享内存和信号进行进程间同步。此外,shared_buffers包含尚未写出的“脏”缓冲区;这些可以延迟写出,因为 PostgreSQL 知道所有后端都将从那里读取,并且只有在数据不在时才转到磁盘shared_buffers

它是可能如果对 PostgreSQL 进行少量修改,则可行全部服务器是只读的,但我没有调查它,因为这是一个非常无趣的用例。

您看到的有关共享存储的引用是仅有的用于故障转移,而不是并发操作。手册中非常明确地指出,您需要确保有适当的隔离措施来防止多个数据库服务器同时访问存储,否则将导致严重损坏。

您将不得不依赖复制或使用其他支持共享存储的 DB 引擎(并处理由此产生的性能影响)。

但另外一点:数据库通常受到 I/O 限制。如果您现在拥有两台能够处理 1000tps 的服务器,而不是一台能够处理 2000tps 的服务器,那么共享存储不会给您带来任何好处。或者,考虑到共享存储系统同步的开销(没有低延迟总线,例如 Infiniband/Myrinet),更像是两台各能够处理 200tps 的服务器。

相关内容