我正在尝试建立分布式处理环境, 所有数据都位于一个共享网络驱动器中。 我不会写任何东西,只是从中读取, 所以我们也在考虑对网络驱动器进行写保护。
我记得当我使用MSSQL时, 我可以将数据库备份到DVD并直接将其作为只读数据库加载。
如果我可以在Postgres做类似的事情, 我应该能够给它一个像只读DVD的抽象, 一切都会很好。
Postgres是否可以这样, 如果没有,任何替代方案? (MySQL?sqlite甚至?)
或者如果那不可能有某种方法来指定共享文件系统? (让它知道其他进程也从中读取?)
由于各种原因,无法使用并行dbms, 我需要两个并行运行的DB进程...
非常感谢任何帮助。 谢谢!
答案 0 :(得分:3)
写保护数据目录将导致PostgreSQL无法启动,因为它需要能够写postmaster.pid
。 PostgreSQL还需要能够编写临时文件和表空间,设置提示位,管理可见性映射等等。
理论上可以修改PostgreSQL服务器以支持在只读数据库上运行,但是现在不支持AFAIK。不要指望它能起作用。您需要克隆每个实例的数据目录。
如果您出于性能原因要运行多个PostgreSQL实例,那么让它们争夺共享存储将无论如何都会适得其反。如果DB足够小以适应RAM,那就没关系......但是在这种情况下,将它克隆到每台机器也很容易。如果数据库不够大,无法缓存在RAM中,那么两个数据库实例都会出现I / O瓶颈,并且不会比不受存储争用影响的单个数据库执行任何更好的(可能稍差)。
你有可能通过以下方式让它工作:
...至少如果你先强制提示位设置和VACUUM FREEZE
共享表空间中的所有内容。它不受支持,它没有经过测试,它可能无法工作,运行私有实例没有任何好处,我肯定不会这样做,但如果你真的坚持你可以尝试它。崩溃,错误的查询结果和其他奇怪的行为并非不可能。
答案 1 :(得分:0)
我从来没有尝试过,但是如果您的所有用途都是只读的,那么可能会使用数据目录运行postgres,该数据目录主要位于RO文件系统上。您需要确保禁用autovacuum。我认为即使读取活动也可能会生成xlog变异,因此您可能需要将pg_xlog
目录符号链接到可写文件系统上。有时读取查询会溢出到磁盘以获得大量排序或其他临时要求,因此您还应将base/pgsql_tmp
链接到可写磁盘区域。
正如Richard指出的那样,数据堆中有可见性提示位。可能希望在将数据库放在RO文件系统之前尝试VACUUM FULL FREEZE ANALYZE
。
答案 2 :(得分:0)
“Postgres是否可以这样,如果没有,有任何替代方案吗?(MySQL?sqlite甚至?)”
我正在试图弄清楚我是否可以使用postgres执行此操作,以便从sqlite移植到系统。我可以确认这对于只读NFS共享上的sqlite3数据库文件可以正常工作。 Sqlite确实可以很好地用于此目的。
完成sqlite后,只要有更新,我们就会使用新的sqlite文件切换到新目录。我们不会插入使用中的数据库。我不确定插入是否会造成任何问题(使用任一数据库)。如果另一个数据库实例安装了dir读写,则在OS级别缓存只读数据可能会出现问题。这是我希望能够做到的事情。