我啥时候应该考虑使用内存数据库,需要注意啥问题?

Posted

技术标签:

【中文标题】我啥时候应该考虑使用内存数据库,需要注意啥问题?【英文标题】:When should I consider using a in memory database and what are the issue to look out for?我什么时候应该考虑使用内存数据库,需要注意什么问题? 【发布时间】:2010-12-08 07:10:37 【问题描述】:

我只是认为现在在您的数据库服务器上有足够的 RAM 来缓存您的完整数据库是很常见的为什么memory database 的专家(例如TimesTen,另请参阅@987654323 @) 几年前风靡一时但没有被更多使用?

似乎随着时间的推移,非基于磁盘的数据库的使用越来越少,例如,现在大多数应用程序都建立在传统的理性数据库之上。我原本预计会出现相反的情况,因为许多服务器的 RAM 已接近免费。

我在问这个问题,因为我刚刚阅读了 stack-overflow-architecture 并且页面上说

这很重要,因为 Stack Overflow的数据库差不多 完全在 RAM 中,连接仍然 成本太高了。

但我认为如果使用“指针”和“集合”而不是普通的 btree,这将不是问题。 Btree 非常聪明地获得了磁盘访问速度的限制,例如,它们交换 CPU 使用率以减少磁盘使用率。但是我们现在有这么匹配的 ram。

但我们仍然需要数据库,就像你自己做的那样

锁定 死锁检测 事务记录 正在恢复 等

很难。

@S.Lott,鉴于我们都花了很长时间选择索引、避免连接和调查数据库性能问题。一定会有更好的办法。几年前,我们被告知“内存数据库”是更好的方法。所以在我开始使用一个 etc 之前,我想知道为什么其他人没有更多地使用它们。

(我自己不太可能使用 TimesTen,因为它价格昂贵 ($41,500.00 / Processor),而且我不喜欢与 Oracle 销售人员交谈 - 我宁愿花时间编写代码。)

另请参阅:

Alternative to the TimesTen in memory database Has anyone published a detailed comparison between different in-memory RDBMSs?

更新:

很久前我问过这个问题,现在 Microsoft SQL Server 有“In-Memory OLTP”,这是一个集成到 SQL Server 引擎中的内存优化数据库引擎。它并不便宜,但对于某些工作负载来说似乎非常快

【问题讨论】:

"没有被更多使用?"超过什么?你有一些指标、数字或调查吗?我不明白这个问题。你有一个应该使用但不是的具体例子吗?或者这只是一个讨论话题?你需要了解什么?你有什么编程问题? 内存够用吗?即使是小型应用程序也可以轻松使用 100GB 的磁盘空间。我很少使用为单个应用程序提供这么多内存的服务器。 【参考方案1】:

没有人真正回答“我什么时候应该考虑使用内存数据库以及需要注意什么问题?”这个问题。所以我会试一试。

在以下情况下,您应该考虑使用内存数据库: 1. 目标系统有数据要管理,但没有持久化媒体 2. 持久化数据库根本无法满足性能要求

对于 #1,请考虑机顶盒 (STB) 中的电视指南。低端机顶盒(即没有 DVR 功能的机顶盒)没有持久存储,也不需要持久存储。但包含 400 个频道、14 天的电视指南的数据库并非易事。这里也有性能要求,因为数据从转发器轮播高速到达,这是“捕获它或等到轮播再次出现”的情况。但没有必要坚持。我们都看到了这一点;当您在家中断电时,当它重新出现在电视指南上时,会显示“很快就会可用”,因为它正在从转发器或电缆前端进行自我配置。网络路由器具有相同的特性:没有持久存储,需要速度快,并且可以从外部来源(网络上的对等路由器,在这种情况下,重新填充路由表)提供数据库。

#2 的例子数不胜数:军事系统、高频交易系统等中的实时定位。

关于问题的第二部分,“需要注意的问题”:有很多。

如果您需要只有内存数据库才能提供的性能,请确保您评估的是真正的内存数据库。缓存持久性数据库是不一样的。在 RAM 驱动器中投入持久性数据库是不一样的。使用固有地执行事务日志记录的内存数据库(如 TimesTen)是不一样的(即使您登录到 /dev/null)。

确保您评估的是数据库系统,而不仅仅是缓存(例如 memcache)。数据库系统将支持具有 ACID 属性的事务、多个索引选项、支持并发访问等等。

关于 ACID:内存数据库系统不缺少“D”(持久性)。它只需要结合上下文来考虑。持久数据库中的事务只有在其存储的介质是持久的时才是持久的。内存数据库也是如此。无论哪种情况,如果您关心耐用性,最好有一个备份。

【讨论】:

【参考方案2】:

很可能没有成熟的内存数据库产品可以完全替代经典数据库。

关系数据库是一个非常古老的概念。尽管有许多方法可以推进和开发新技术,例如。面向对象的数据库,关系数据库并没有真正改变它们的概念。不要期望事情变化太快,因为数据库在过去十年或十五年甚至更长时间内没有太大变化。

我认为,技术的发展并没有人们想象的那么快。新概念的成熟和确立需要几十年的时间。首先是数据库技术,成熟度比其他任何事情都重要。

十年或二十年后,数据库可能与今天不同。如果内存数据库是未来——今天没有人能说清楚——他们只是需要更多的时间来开发。

【讨论】:

【参考方案3】:

趋势似乎是积极缓存并使用数据库填充缓存。无论数据库位于何处,连接仍然很昂贵,因此首选似乎是执行一次连接并将结果缓存在Memcached 或Velocity 之类的位置。

仍然有内存数据库并且它们被使用,但这取决于您想要使用它们的上下文。例如,SQLite 在测试数据层时经常用作内存数据库。

【讨论】:

【参考方案4】:

最重要的原因是货物文化,以及IT知识水平非常低。无论使用哪种持久性解决方案,大多数应用程序都可以很好地运行,而且随着计算机每年的速度越来越快,没有足够的人能感受到痛苦并能够查明问题。

微软和甲骨文通过他们的数据库产品赚了太多钱,以至于他们(在政治上)有可能想出更好的方法。

使用关系数据库的开发成本不透明,因此管理层不知道存在问题,更不用说解决方案了。

【讨论】:

【参考方案5】:

嗯,内存数据库在本质上通常缺乏 ACID(原子性、一致性、隔离性、持久性)中的 D(持久性)。这可以通过“混合”方法在一定程度上克服,但是在某些时候必须将某些东西(数据本身或事务日志)保存在某处以提供持久性方面。这通常会降低内存数据库解决方案的性能或引入其他不受欢迎的属性

相比之下,今天的大多数 RDBMS 都具有 ACID 的完整补充,并且在它们背后有数十年的发展。这导致基于磁盘的数据库系统具有非常高的性能,尤其是现代 RDBMS 系统经过多年的改进和优化(您的 BTree 示例只是众多示例之一)。

另一个因素是我们作为应用程序开发人员通过caching 等机制减少数据库负载的能力,从而从应用程序的数据层压缩更多感知性能。事实上,缓存本身在最近几年已经有了广泛的发展,现在分布式缓存很常见(例如,看看users of memcached 的数量)。

具有讽刺意味的是,现代缓存系统在很多方面都在慢慢变形为类似于真正的内存数据库系统的东西。内存数据库,就像面向对象的数据库一样,在很大程度上是“新的孩子”,所以看看所有这些及时去哪里会很有趣。甲骨文现已收购 TimesTen,据this wikipedia article 称,微软正在考虑很快进入内存数据库市场。这是传统 RDBMS 领域的两个现代“大玩家”,他们正在认真对待内存数据库系统。

【讨论】:

Time10 使用事务日志来提供持久性,我认为它还可以节省检查点以加快重新加载。因此,自己编写很难。 “微软正在考虑很快进入内存数据库市场”——你有这个链接吗? Erlang 拥有 Mnesia 内置数据库,能够进行仅内存(也可仅用于磁盘或混合)操作,并通过多个节点的复制提供持久性。值得一试,也许你以后可以使用它。 @Ian - Re:Microsoft - 我只有***的文章,但是,它又链接到这里:intelligent-enterprise.informationweek.com/channels/… @CraigTP,我刚刚阅读了智能企业的文章,在我的阅读中,它适用于大多数只读数据仓库系统,例如大立方体。【参考方案6】:

这也是一个选项:http://www.memsql.com/

我没有亲自使用过它,但它应该类似于内存中 mysql 的直接替代品。

【讨论】:

【参考方案7】:

各种便携式 SQL 版本,工作效率相同,主要针对移动设备设计。

SQLite

SQL Server Compact Edition

这些只是大玩家,可能还有其他选择,但大玩家在发布它时会处理最低要求.. :)

并且在内存数据库中,如果出现波动或断电,您会不断备份数据,您可能会丢失全部数据。与其他将作为其在辅助内存 (HDD) 中处理的一样,与内存 DB 相比,丢失的可能性为 10%。

我希望这可能会有所帮助:)

【讨论】:

【参考方案8】:

数据库最典型的用例是持久性,这使得大多数内存数据库不适合。使用内存数据库的一个普遍原因是出于测试目的。但这需要您使用既可以设置为内存中的数据库,也可以设置为其他数据库。

该领域的热门选择似乎是适用于 .Net 开发人员的 RavenDB 和适用于 Java 开发人员的 OrientDB。因为两者都可以用作内存数据库,并且根据配置“其他”,所以您可以根据您的配置使用其中一种(.Net 中的 app.config、Java 中的 Maven 或 Ant 设置)。

【讨论】:

【参考方案9】:

数据处理需求变得越来越复杂,产品生态系统也在不断发展以满足这些新需求。基于磁盘的 RDBMS、内存缓存和内存数据库用于满足不同的需求。你应该选择适合你需要的东西 -

传统的 RDBMS:您的 MySQL 集群足够快,易于维护,并且您喜欢 ACID 合规性的可靠性。

内存中分布式缓存:您的应用程序需要进行快速读取和写入,而不必过多担心一致性或复杂事务。

内存中 RDBMS:

    速度):您的应用程序需要比基于磁盘的数据库更快地处理数据/请求。 (复杂性):您需要使用连接和聚合进行复杂的事务性读取和写入,并且喜欢使用 SQL 的强大功能。 (可扩展性):您需要在不停机的情况下水平扩展数据库。 (可维护性):您需要数据库来提供高可用性、复制、负载平衡和灾难恢复,而不会增加您的维护工作量。 (警告):您的数据应该适合内存(通常以 TB 为单位)。

【讨论】:

以上是关于我啥时候应该考虑使用内存数据库,需要注意啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该在 INSERT 期间使用 /*+ APPEND */

我啥时候应该在课堂上使用“this”?

我啥时候应该使用装饰器?

我啥时候应该使用 Vuex?

我啥时候应该使用一对一的关系?

我啥时候应该使用“隐藏文本框”,啥时候应该使用(html 5)“数据属性”?