繁体   English   中英

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

[英]How do in-memory databases provide durability?

更具体地说,是否有不需要辅助存储(例如HDD)的数据库来提供持久性?

注意:这是我先前的问题跟进

如果您希望持久化写入持久存储的操作是唯一的选择(您可能不想在独立的数据中心中构建具有独立电源的许多集群,而仍然祈祷它们永远不会同时发生故障)。 另一方面,这取决于您的数据的价值。 如果有必要,那么具有足够复制能力的纯内存数据库可能是合适的。 顺便说一句,即使将硬盘存储在硬盘上,硬盘也可能会失败,因此这不是理想的解决方案。 您可以查看http://www.julianbrowne.com/article/viewer/brewers-cap-theorem选择复制权衡。

Prevayler http://prevayler.org/是使用持久性存储备份的内存系统示例(代码非常简单,顺便说一句)。 持久性是通过保存在适当设备(例如HDD或SSD)上的事务日志提供的。 修改数据的每个事务都会写入日志,该日志用于在断电或数据库/系统重新启动后恢复数据库状态。 除了Prevayler,我还看到了用于持久化消息队列的类似方案。 实际上,这与“经典” RDBMS的工作方式类似,不同之处在于日志仅是写入底层存储的数据。 日志还可以用于复制,因此您可以将日志的一个副本发送到活动副本,将另一个副本发送到HDD。 当然,各种组合都是可能的。

所有数据库都需要非易失性存储以确保持久性。 内存映像不提供耐用的存储介质。 释放电源后不久,您的内存映像将失效。 同样,一旦数据库进程终止,操作系统将释放包含内存映像的内存。 无论哪种情况,都将丢失数据库内容。

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

在空间或大小至关重要的情况下,非易失性存储器(例如闪存)可以代替HDD。 但是,据报告闪存存在可写入的写入周期数问题。

在回顾了您以前的文章之后,只要您可以使最后一台服务器保持运行状态,多服务器复制就可以工作。 一旦出现问题,您就可以放松队列。 但是,可以考虑使用许多替代Oracle的方法。

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

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

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

内存数据库中的classic不能提供经典的持久性,但是根据您的要求,您可以:

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

您为什么不想使用永久性存储?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM