5

我正在尝试建立一个分布式处理环境,所有数据都位于一个共享网络驱动器中。我不会给它写任何东西,只是从中读取,所以我们也在考虑对网络驱动器进行写保护。

我记得当我使用 MSSQL 时,我可以将数据库备份到 DVD 并将其作为只读数据库直接加载。

如果我可以在 Postgres 中做类似的事情,我应该能够像只读 DVD 一样给它一个抽象,一切都会好起来的。

在 Postgres 中是否有可能发生这样的事情,如果没有,还有其他选择吗?(MySQL?甚至是sqlite?)

或者,如果这不可能,是否有某种方法可以指定共享文件系统?(让它知道其他进程也在从中读取?)

由于各种原因,无法使用并行 dbms,我需要两个并行运行的 DB 进程......

任何帮助是极大的赞赏。谢谢!!

4

3 回答 3

3

对数据目录进行写保护会导致 PostgreSQL 无法启动,因为它需要能够写入postmaster.pid. PostgreSQL 还需要能够编写临时文件和表空间、设置提示位、管理可见性映射等等。

理论上,可以修改 PostgreSQL 服务器以支持在只读数据库上运行,但目前不支持 AFAIK。不要指望它会起作用。您需要为每个实例克隆数据目录。

如果出于性能原因要运行多个 PostgreSQL 实例,让它们争夺共享存储无论如何都会适得其反。如果数据库足够小以适合 RAM 就可以了……但在这种情况下,只需将其克隆到每台机器上也很容易。如果数据库不够大,无法缓存在 RAM 中,那么两个数据库实例都会出现 I/O 瓶颈,并且不太可能比不受存储争用影响的单个数据库更好(可能略差于)。

您有可能通过以下方式使其工作:

  • 将常量数据移动到一个新的表空间到只读共享存储上
  • 对数据库进行基本备份,减去新分离的共享数据表空间
  • 复制数据库的基本备份以读取/写入将运行数据库的每个主机上的私有存储
  • 挂载共享存储并将表空间链接到 Pg 期望的位置
  • 起始页

...至少如果您首先强制提示位设置和VACUUM FREEZE共享表空间中的所有内容。它不受支持,没有经过测试,它可能无法工作,运行私有实例没有任何好处,我肯定不会这样做,但如果你真的坚持你可以尝试。崩溃、错误的查询结果和其他奇怪的行为并非不可能。

于 2012-11-09T01:00:58.900 回答
0

我从未尝试过,但如果您的所有使用确实是只读的,则可以使用主要位于 RO 文件系统上的数据目录运行 postgres。您需要确保禁用 autovacuum。我认为即使读取活动也可能会产生 xlog 突变,因此您可能必须将pg_xlog目录符号链接到可写文件系统上。有时读取查询会因大型排序或其他临时要求而溢出到磁盘,因此您还应该链接base/pgsql_tmp到可写磁盘区域。

正如理查德指出的那样,数据堆中有可见性提示位。可能想VACUUM FULL FREEZE ANALYZE在将它放在 RO 文件系统之前先在 db 上尝试一下。

于 2012-11-08T19:43:03.957 回答
0

“在 Postgres 中这样的事情是否可能,如果没有,还有其他选择吗?(MySQL?甚至是 sqlite?)”

我试图弄清楚我是否也可以使用 postgres 来执行此操作,以便从 sqlite 移植系统。我可以确认这适用于只读 NFS 共享上的 sqlite3 数据库文件。Sqlite 确实可以很好地用于此目的。

使用 sqlite 完成后,只要有更新,我们就会切换到包含新 sqlite 文件的新目录。我们永远不会插入到正在使用的数据库中。我不确定插入是否会造成任何问题(对于任一数据库)。如果另一个数据库实例以读写方式挂载了目录,则在操作系统级别缓存只读数据可能会成为问题。这是我最希望能够做到的事情。

于 2014-01-27T17:04:53.220 回答