内存数据库如何提供持久性?

问题描述 投票:2回答:4

更具体地说,是否有任何数据库不需要二级存储(例如HDD)来提供耐用性?

注意:这是一个follow up of my earlier question

database in-memory-database durability
4个回答
4
投票

如果您希望持久化转换写入持久存储只是真正的选择(您可能不希望在独立数据中心内构建具有独立电源的许多集群,并仍然祈祷它们永远不会同时失败)。另一方面,它取决于您的数据的价值。如果它是可有可无的,那么具有足够复制的纯内存数据库可能是合适的。 BTW甚至HDD可能会在您存储数据后失败,所以这里不是理想的解决方案。您可以查看http://www.julianbrowne.com/article/viewer/brewers-cap-theorem以选择复制权衡。

Prevayler http://prevayler.org/是支持持久存储的内存系统的一个例子(代码非常简单BTW)。通过持久存储在适当设备(例如HDD或SSD)上的事务日志提供持久性。每个修改数据的事务都写入日志,日志用于在电源故障或数据库/系统重启后恢复DB状态。除了Prevayler,我已经看到类似的方案用于持久化消息队列。这确实类似于“经典”RDBMS的工作原理,除了日志只是写入底层存储的数据。日志也可用于复制,因此您可以将一份日志副本发送到另一台硬盘的实时副本。当然可以有各种组合。


1
投票

所有数据库都需要非易失性存储以确保持久性。内存映像不提供持久的存储介质。断电后不久,您的记忆图像就会失效。同样,一旦数据库进程终止,操作系统将释放包含内存中映像的内存。在任何一种情况下,都会丢失数据库内容。

在将任何更改写入非易失性存储器之前,它们并不是真正持久的。这可能包括将所有数据更改写入磁盘,或编写正在完成的更改的日志。

在空间或大小关键实例中,诸如闪存的非易失性存储器可以代替HDD。但是,据报道闪存存在可写入的写周期数的问题。

在查看了以前的帖子后,只要您可以保持最后一台服务器正常运行,多服务器复制就可以正常工作。一旦它发生故障,你就会失去你的队列。但是,可以考虑使用Oracle的一些替代方案。

PDA通常使用备用电池的内存来存储其数据库。电池耗尽后,这些数据库不耐用。备份很重要。


1
投票

内存意味着所有数据都存储在内存中以供访问。读取数据时,可以从磁盘或内存中读取数据。对于内存数据库,它总是从内存中检索。但是,如果服务器突然关闭,数据将丢失。因此,据说内存数据库缺乏对ACID耐久性部分的支持。但是,许多数据库实现不同的技术来实现持久性。这些技术如下所列。

  • 快照 - 在给定时刻记录数据库的状态。对于Redis,数据会在每两秒钟后持久保存到磁盘以确保持久性。
  • 事务日志记录 - 对数据库的更改记录在日志文件中,这有助于自动恢复。
  • NVRAM的使用通常采用静态RAM的形式,由电池供电。在这种情况下,数据可以在从最后一致状态重启后恢复。

0
投票

内存数据库中的经典无法提供经典的持久性,但根据您的要求,您可以:

  • 使用memcached(或类似的)在足够节点的内存中存储数据不太可能丢失
  • 将您的oracle数据库存储在基于SAN的文件系统上,您可以为其提供足够的RAM(比如3GB),整个数据库都在RAM中,因此磁盘搜索访问权限永远不会将您的应用程序存储下来。然后,SAN负责将缓存内容延迟写回到磁盘。这是一个非常昂贵的选择,但它在需要高性能和高可用性并且可以负担得起的地方很常见。
  • 如果您买不起SAN,请安装ram磁盘并在其上安装数据库,然后使用数据库级复制(如logshipping)来提供故障转移。

您不想使用持久存储的任何原因?

© www.soinside.com 2019 - 2024. All rights reserved.