何时以及为何使用内存数据库或交易

在本文中,我将讨论何时使用内存数据库(IMDB),何时更喜欢传统的数据库管理系统(RDBMS)以及为什么。

何时以及为何使用内存数据库或交易

当我需要决定使用哪个数据库管理系统时?,我通常会根据存储数据的存储类型进行选择。 我个人将众多选项分为三类:内存、固态硬盘和硬盘。 因此,首先我选择一种或多种要使用的存储类型,然后我开始考虑我想在上面使用的一个或多个数据库。

三种数据存储类型中的每一种都有其独特的访问时间和速度,并且每一种都属于不同的价格范围。 IMDB和RDBMS都可以处理所有三种类型。 内存数据库将数据的副本存储在内存中,并将这些数据保存在固态硬盘或硬盘上。 关系数据库管理系统使用内存进行缓存、回写缓冲区和其他优化,还将数据保存到固态硬盘或硬盘。 由于两个数据库管理系统都可以使用所有三种存储类型,在决定数据库管理系统之前,我还需要决定在每种类型中保留哪些数据,以及如何在不同类型之间移动这些数据?。

让我们回忆一下每种存储类型的特征。

公羊

众所周知,随机存取存储器在顺序存取和随机存取两方面都快得惊人(它被称为“随机存取存储器”是有原因的)。 我所说的“闪电般的速度”是指随机存取时间仅为几十纳秒(1e-8秒),即e. 随机存取存储器以每秒100兆字节的速度执行随机读/写。 顺序读/写甚至更快?——?每秒1 GB或更高。 你可以在这里找到更多关于内存如何工作的信息。

固态硬盘

固态硬盘比内存慢。 随机存取时间只是毫秒(1e-5秒)的一小部分,您每秒可以随机读取大约10,000个块。 在最坏的情况下,每个块只需要一个字节,速度是每秒10 kB。 这比内存慢1000倍! 但是,顺序读/写的执行速度约为每秒200–300兆字节,这与内存相当。 关于固态硬盘的详细信息在这里和这里。

硬盘驱动器

硬盘是所讨论的三种存储类型中最低的。 随机访问时间为10毫秒(1e-3秒),比固态硬盘慢100倍。 您每秒可以随机读取/写入100个块,因此如果您需要读取随机字节,在最坏的情况下,速度仅为每秒100字节! 这是因为为了一个随机字节,需要读取整个块。 平均而言,随机写入字节甚至更慢:我们首先读取一个随机块,等待一次完整的磁盘旋转,然后用一个已更改的字节写回该块。 细节可以在这里和这里找到。

还有其他存储类型,如闪存、SAS、磁带等等,出于某些原因,我从未使用过。 SAS比固态硬盘慢,但成本几乎相同(至少考虑到邮件的购买量)。俄罗斯集团)。 另一方面,闪存比固态硬盘更贵,但在我的使用案例中,它提供的速度增益可以忽略不计。 至于磁带,在我的使用案例中,就存储容量而言,磁带驱动器比高容量硬盘驱动器更贵,但同时访问时间也更慢。 您的里程可能会有所不同,硬盘、固态硬盘和内存可能不是您的主要存储类型。

我们现在来谈谈价格吧。 老实说,在我职业生涯的某个阶段,我认为我不需要考虑价格,只需要考虑技术。 我会与系统管理员交谈,找出我的程序所需的硬件,然后我会向管理层询问。 他们会或不会分配资金,如果他们会,我会下订单,收到硬件,并开始使用它(如果没有分配资金,我不得不做任何当时可用的事情)。 那是多么美好的生活啊!

然而,在某个时候,令我惊讶的是,我发现情况可能正好相反,比如“这里有一个固定预算?——?让一切运转起来。”(我不再觉得奇怪了,但那时候就像洗了个冷水澡。)。 更具挑战性的任务遇到了“鉴于我们目前的支出模式,让一切工作更快。还有“这里的钱少了,但性能必须保持不变。”但最核心的一条是“削减成本,让一切工作更快。”“不过,在没有高级管理层参与的情况下,执行关于如何节省更多资金或从硬件中获得更多性能的想法更有趣。

回到价格上来。 乍一看,情况相当简单:平均而言,每种后续存储类型都比前一种贵十倍。 硬盘是最便宜的存储类型,固态硬盘比硬盘贵十倍,而内存比固态硬盘贵十倍。 请注意,这些都是平均数字,完全基于我自己的经验(给出我们的购买价格)。

要记住的另一件事是,存储本身并不存在?——?它需要接入服务器,而且它们不是免费的。 服务器只能保存每种存储类型的一定数量的数据。 除此之外,服务器占用了服务器机架中的单元,这也需要支付电费和租赁费(即使在您自己的数据中心,租赁服务器机架也不是免费的,必须在您的业务模式中考虑;例如,由于您没有将服务器租赁给其他人,所以会损失预期利润,等等)。

既然我们已经讨论了这三种存储类型的速度和价格关系,那么让我们来看看在每种存储类型中存储的时间和内容。

  1. 如果我需要1毫秒或更短的访问时间,我唯一的选择是内存。 固态硬盘也符合这一标准,但只是在寻道时间方面。 但是,在我的典型工作流程中,要处理单个用户请求,通常需要多个操作,而不是一个,然后,由于一些额外的要求,可能会有额外的磁盘请求。 预计到这种情况,我通常从一开始就为内存做预算。

  2. 如果我需要长达100毫秒的访问时间,我会选择固态硬盘。

  3. 如果访问时间超过100毫秒是可以接受的,我会考虑使用硬盘。 回想一下,它的寻道时间是10毫秒,但是在实际使用情况下,随机访问会导致多次寻道。 此外,磁盘正忙于做其他工作,这减少了每秒可执行的最大IOPS数、寻道次数和寻道次数。

  4. 现在让我们稍微讨论一下顺序访问。 就随机存取时间而言,硬盘比固态硬盘慢100倍,固态硬盘比随机存取存储器慢1000倍,但顺序存取时间的情况却大不相同:硬盘比固态硬盘慢2到3倍,而固态硬盘比随机存取存储器慢3到5倍。 为了更新您的内存,内存比固态硬盘贵10倍,而固态硬盘比硬盘贵10倍。

  5. 这告诉我们什么? 随机访问慢速存储的成本更高(存储越慢,成本越高),而顺序访问慢速存储的成本更低(存储越慢,成本越低)。 因此,慢速存储是为顺序访问而设计的(否则,它们早就被遗忘了)。 重申一下,如果我们需要按顺序访问大量数据集,并且对100兆字节/秒的速度感到满意,那么最具成本效益的存储就是硬盘了。 就顺序访问时间而言,它比内存慢10倍,但也便宜100倍。 这意味着就字节而言,在总容量相同的情况下,我们可以购买比内存多10倍的硬盘空间。 在大多数情况下,我可以接受100兆字节/秒,因为我还需要考虑网络接口和最终用户的互联网连接速度。 所以我把所有需要顺序访问的东西都存储在硬盘上。 重要的是要注意,我在这里只谈论我的情况。 如果你经营规模较小,价格可能有较低的优先权。

  6. 综上所述,我将我的数据分为四类(上面的第1-4项),并将每一类保存在单独的存储器中。 现在,问题是在这一切之上使用哪些数据库管理系统。

让我首先分享我对综合数据库和关系数据库的一些优点和缺点的观察:

  • 从磁盘读写的角度来看,一个内存数据库比一个关系数据库管理系统要快,即使一个托管关系数据库管理系统的机器上有这么多内存,所有的数据都可以放进去。
  • 内存数据库可以有效地将数据保存在硬盘上。 关系数据库管理系统通常不能与硬盘一起高效工作,需要一个固态硬盘(或另一种快速存储类型,如SAS或闪存)。数据库同步工具
  • 一个内存数据库通常很难扩展到多个中央处理器内核。

现在,我们可以继续在IMDB和RDBMS之间做出选择。

a. 正如我们已经讨论过的,需要在线访问的数据(小于1毫秒)必须存储在内存中。

我通常将这类数据放在内存数据库中,因为根据我的经验,对于内存驻留数据来说,这是速度最快、硬件效率最高的解决方案。 一个完全缓存数据的关系数据库管理系统要慢几十倍,如果不是几百倍的话。

举个例子,让我们来看看MariaDB的基准测试结果,它是由前MySQL开发人员设计的,目前是最高效的关系数据库之一,至少在开源市场上是这样。 基准测试是由马里亚数据库开发人员自己运行的,所以人们希望关系数据库管理系统已经过了微调,能够展示出最佳性能。 基准测试的细节可以在这里找到。 结果显示,在一台名为IBM Power8的非常昂贵的机器上,每秒钟有一百万个请求,它有20个内核和160个硬件线程(相当于板上有160个内核)。 将其与一个名为Tarantool的IMDB的基准测试结果进行比较,该数据库在一个虚拟的单核AWS服务器上执行一百万个事务。 顺便说一下,Tarantool代码是开源的,所以你可以自己使用它来复制结果,例如,在t2上。微型AWS实例。 马里亚数据库和塔兰托的基准是不同的,但目的是一样的?:?从数据库中挤出性能的每一滴。

所以差别大约是160倍。 人们可以不停地谈论Power8是否真的有并行内核(它 至少有20个内核),或者说是运行亚马逊服务的硬件,但总的来说,差别是非常明显的。 这是一个诚实的基准,从这个意义上来说,两家供应商都改进了他们的产品,以提供最佳性能。

但是,让我重申一个综合管理数据库的主要缺点之一?:通常它很难扩展到多个CPU内核。 例如,Tarantool最多使用三个内核。 如果你想从中榨取更多,你需要像在多台服务器上分配工作负载一样对其进行分割。 另一方面,如果Tarantol在单个内核上的性能优于RDBMS在整个服务器上的性能(我这里不是指Power8,而是一个带有8核或16核处理器的普通Supermicro服务器),那么就有可能让其他内核保持空闲,或者使用它们来运行单独的Tarantol实例来提供其他服务。

b. 所有不需要在线访问的数据(允许的访问时间最长为100毫秒)都存储在关系数据库管理系统或综合管理数据库或其他地方(稍后将详细介绍)?取决于许多因素。

例如,如果我已经决定将在线数据存储在IMDB中,并且我已经确定将非在线数据也存储在其中不会对系统的总拥有成本产生很大影响,那么我将把这些非在线数据存储在我的IMDB中,以便尽可能减少不同数据库的数量。 否则,如果对总体拥有成本的影响很大,我会选择关系数据库管理系统或其他东西(见第四项)。

c. 有时,看似不合逻辑的,我把非在线数据放入一个IMDB,即使里面没有在线数据。 我为什么要这么做? 这是因为当访问数据时,IMDB比RDBMS更有效地使用处理器(它执行更少的复制操作,并且具有更高级的内存数据结构,因为它针对使用内存进行了优化)。

不时地,我有一个选择?——?将1 TB的数据库存储在10台机器上,每台机器有一个内存数据库和一个200 GB的硬盘驱动器,复制系数为2;或者使用8台机器,每台机器有一个内存数据库管理系统和一个固态硬盘,每台机器有1 TB的数据库,复制系数为8(因为在这种情况下,内存数据库管理系统消耗的CPU资源是前者的4倍)。 10台配有低容量硬盘的机器可能比8台配有高容量硬盘的机器便宜(如果你想知道为什么一个内存数据库可以配硬盘,而一个关系数据库管理系统通常需要硬盘,请看我的文章)。 此外,与关系数据库管理系统相比,内存数据库的处理器可能更便宜、功能更弱:如果我在使用内存数据库时有很多机器,这不是因为单个处理器无法处理工作负载?——?通常我们只是不在一台机器上安装超过200-300 GB的内存来保持重启时间可控。

d. 之前,我提到过将数据存储在“其他地方”。“那么,除了关系数据库管理系统和综合管理数据库之外,还有什么别的选择呢? 一种选择是简单的文件系统。

例如,在我们的服务“云邮件”中。Ru,用户的文件保存在一个常规的文件系统中(XFS),副本存储在几个数据中心。 为什么会这样? 这些文件相当大(平均为4 MB),因此将它们存储在数据库管理系统中会给处理器和磁盘带来额外的工作负载。 此外,这些文件是非结构化的,并且总是作为一个整体进行读写。 在这种模式下,数据库管理系统上任何额外的工作负载都被认为是多余的,甚至是有害的。 有许多可供选择的存储类型。 例如,对历史分析数据进行大量顺序访问的理想存储是硬盘之上的Hadoop。 但我离题了,别忘了我们在这里讨论的是整合数据库和关系数据库。

e. 如果我没有在线数据,我e. 大约100毫秒的访问时间是不错的,我知道我将主要使用固态硬盘,然后RDBMS是最好的选择(除非我之前说过)。

实际上,在中等工作负载下,这通常会产生1 TB或更多的数据,并且对访问时间没有严格的要求。

f. 在这篇文章的结尾,我想谈一谈我不想做的事情:我不想在一个关系数据库管理系统中混淆在线和非在线数据。

例如,我不会将用户的配置文件和他们的身份验证历史存储在同一个带有微调缓存的关系数据库管理系统中,因此用户的配置文件(经常请求的数据)是缓存驻留的。 我宁愿用两个数据库管理系统?——?一个用于配置文件的IMDB和一个用于历史数据的RDBMS?——?这将解决冷启动问题,消耗更少的内存资源,并确保更快地访问配置文件。

谢谢,请继续关注更多文章。