PostgreSQL内存数据库

22

我想将我的PostgreSQL数据库服务器运行在内存中。原因是在我的新服务器上,我有24 GB的内存,几乎没有使用。

我知道我可以运行以下命令来创建一个ramdisk:

mdmfs -s 1024m md2 /mnt

我可以让PostgreSQL在内存中存储数据。但问题在于,如果服务器崩溃或重新启动,数据将会丢失。

基本上,我希望数据库始终加载在内存中,这样它就不必去硬盘驱动器读取每个记录,因为我有大量的内存,并且内存比硬盘驱动器更快。

是否有一种方法可以在PostgreSQL写入磁盘的同时实现这一点,以防服务器崩溃时不会丢失任何数据?或者有没有一种将所有数据缓存到内存中的方式?


1
你有没有测量过那24GB几乎没有被PostgreSQL使用? - tuinstoel
由于内存比磁盘更快,因此可能会有一些加速,但是由于PostgreSQL并不是设计为在内存中运行的,因此加速可能不像预期的那样大。例如,PostgreSQL将尝试将其内存刷新到持久存储(通常是磁盘,在这种情况下是内存),请参见Gracia-Molina和Kenneth Salem的“主内存数据库系统概述”,这里是我的笔记 - user454322
4个回答

11

我现在正在使用异步流复制技术。这意味着我的主数据库可能全部运行在内存中,而从数据库则使用传统的磁盘存储。

如果机器需要重启,需要先停止从数据库,将postgresql数据复制回ramdisk,然后依次重启主数据库和从数据库。这是一种非常有趣的可能性,与REDIS等技术相比具有冗余/热备份/备份/SQL/丰富的工具集等优势。


2
这现在可能会更加可行,使用同步复制。实现 OP 想要的操作。 - plundra
如果使用同步复制,应该使用另一个内存文件系统进行复制,否则不会有性能提升。在请求同步复制时,每个写事务的提交都将等待确认已将提交写入主服务器和备用服务器的磁盘事务日志。 - user454322
我也在考虑同样的想法。 - Abhijit Gujar

6

你看过服务器配置手册章节了吗?看完后,可以搜索postgresql内存调优


OP并不是在询问如何调整内存使用,而是在询问如何让Postgres使用系统内存,就像传统的基于磁盘的二级存储一样。 - code_dredd

3
答案是缓存。考虑为服务器添加内存,然后调整PostgreSQL以最大化内存使用。此外,文件系统缓存也会自动帮助解决这个问题。您将能够提高性能,几乎就像在内存中一样,除了第一次访问之外,而无需自己管理,并且可以拥有比物理内存更大的数据库。

3

我相信Postgres是以充分利用服务器中可用内存的方式编写的。正如你现在可能已经猜到的,除了Postgres之外,没有可靠的方法来做到这一点。

在Postgres中,事务确保所有操作都是原子性的,因此如果在向Postgres数据库写入数据时停电,您只会失去该特定操作,而不是整个数据库。


3
我认为问题所问与RamDisk在关机后消失的持久性有关,而不是Postgres事务的原子性。 - Kuberchaun
@JustBob:这个问题已经超过三年了,而最受欢迎的答案是“Google它”。如果你认为你能做得更好(那应该不难),请发表你的答案。 - Robert Harvey
4
感谢您的建设性意见。我刚发现了这个问题,并想为某个给出的答案添加一些细节,这不会伤害任何人。 - Kuberchaun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接