当前位置: 首页 > 知识库问答 >
问题:

内存中数据库如何持久化数据

胡鸿羲
2023-03-14

我在研究内存数据库的概念。有关这方面的文章说,

内存数据库系统是一种将数据完全存储在主存中的数据库管理系统。

他们讨论了这个概念的优点和缺点。

我的问题是如果这些数据库管理系统将数据完全存储在主存储器中,

停电后所有数据都消失了吗???

还是有办法保护数据???

共有1个答案

平光明
2023-03-14

大多数内存数据库系统都提供持久性,至少作为一种选择。这是通过事务日志实现的。正常关闭时,会保存内存中的数据库映像。下次重新打开时,将加载上一个保存的映像,此后,提交到内存中数据库的每个事务也将附加到事务日志文件中。如果系统异常终止,可以通过重新加载原始数据库映像并从事务日志文件中重播事务来恢复数据库。

数据库仍然全部在内存中,因此必须有足够的可用系统内存来存储整个数据库,这使得它不同于只有一部分缓存在内存中的持久数据库。因此,消除了缓存命中或未命中的不可预测性。

将事务附加到日志文件通常可以同步或异步完成,这将具有非常不同的性能特征。如果未从文件系统缓冲区中刷新已提交的事务并且系统意外关闭(即内核恐慌),异步事务日志记录仍有可能丢失已提交的事务。

内存中的数据库事务日志记录保证只产生一个文件I/O来将事务附加到日志文件。不管事务大小,它仍然只是对持久介质的一次写入。此外,写入总是连续的(总是附加到日志文件),因此即使在旋转介质上,性能影响也尽可能小。

不同的介质会对性能产生较大或较小的影响。HDD的容量最大,其次是SSD,然后是内存层闪存(如FusionIO PCIExpress卡),NVDIMM内存的影响最小。

NVDIMM内存可用于存储内存中的数据库,或存储用于恢复的事务日志。NVDIMM的最大内存大小小于常规内存大小(而且更昂贵),但如果内存中的数据库大小约为GB,则此选项可以100%保留内存中数据库的性能,同时还可以在持久介质上提供与常规数据库相同的持久性。

本白皮书中对具有事务日志记录的内存数据库与HDD、SSD和FusionIO的性能进行了比较:http://www.automation.com/pdf_articles/mcobject/McObject_Fast_Durable_Data_Management.pdf

本文中的NVDIMM:http://www.odbms.org/wp-content/uploads/2014/06/IMDS-NVDIMM-paper.pdf

这些论文由我们(McObject)撰写,但与供应商无关。

 类似资料:
  • 目的 配置 NFS 共享为 OpenShift 节点提供存储,并且配置 OpenShift 持久卷以绑定至数据库 Pod。 环境 openshift v3.11.16/kubernetes v1.11.0 步骤 配置 NFS 共享持久卷1. 登录到 NFS 服务器 # ssh nfs.example.com2. 创建 config-nfs.sh 脚本,内容如下 #!/usr/bin/sh exp

  • 我的应用程序有3个组件, 1) 一种面向用户的组件,接收请求并将其存储到数据库中。2)一个后端组件,从数据库中读取数据,进行处理并将其发送到外部系统。3) 存储用户输入的数据库 我如何测试流程是这样的:用户输入数据- 注意:我尝试使用ddl auto:update,但它不起作用。

  • 本文向大家介绍内存型数据库Redis持久化小结,包括了内存型数据库Redis持久化小结的使用技巧和注意事项,需要的朋友参考一下 因为Redis是内存型数据库,所以为了防止因为系统崩溃等原因导致数据丢失的问题,Redis提供了两种不同的持久化方法来将数据存储在硬盘里面,一种方法是快照(RDB),它可以将存在于某一个时刻的所有数据都写入到硬盘里面,另外一种方法是只追加文件(AOF),它会在执行写命令时

  • 主要内容:一、数据持久化,二、持久化的形式,三、源码分析,四、总结一、数据持久化 redis做为一种内存型数据库,做持久化,个人感觉略有鸡肋的意思。似乎有一种,别人有,自己不有也不行的感觉。以目前Redis主流的应用方式,如果仔细分析,基本上都是在内存中即可完成,对持久化没要求或者说不大。再举一个反例,如果内存中有几百G甚至更多的数据,真要是整体当机,恢复的时间基本就是灾难。 目前基本应用仍然是以关系型数据库或者其它数据库(如Hadoop,Mysql等)为持久化

  • 我的docker组合文件有三个容器,web、nginx和Postgres。Postgres看起来是这样的: null

  • null 假设我有100张唱片。缓存只能保存40条记录(最常用)和100条记录在磁盘文件(不在任何其他数据库中)。 所以,如果从这100条记录中请求任何东西,我就不必去实际的数据库(例如Sybase db)? 如果在100条记录中找到了密钥,但它不存在于内存缓存中(40条记录),则获取该密钥,放入内存缓存中,并使用驱逐策略将其他密钥交换到磁盘文件中(但在磁盘上,我总是有100条记录) 如果缓存和磁