您将花多少钱在托管数据库上
#aws #开源 #database #memgraph

每个现代应用程序都需要一个具有基本数据存储功能或强大分析功能的合适数据库。有多种选择可供选择,选择数据库可能是一个复杂的冒险。只需从专有或开源选择开始,事情就会变得非常凌乱。但是,在筛选了多个数据库选项及其功能之后,您可能会将其范围缩小到数据库的一些可能的候选人。无论您的候选名单,开源或专有数据库都在哪个数据库中,运行该数据库系统总是会附带一些费用。在决策中的某个时候,在决定选择之间,成本将是最重要的因素之一。问题在于,近似拥有数据库的真实未来成本可能很难。

成本可能来自各种来源,例如许可,培训,功能,支持和托管数据库等。每个提到的成本都很重要,应该独立考虑,因为它可以与供应商到供应商不同。但是,这是构成所有权成本的成本的积累。一个费用通常被忽略 - 托管。从数据库到数据库可能会有很大的不同。

如果您要租用完整的VM,并且数据量的增长速度并没有迅速增长,那么托管数据库的成本始终存在且恒定。由于通常以较短的时间范围支付托管费用,例如每月支付,因此随着时间的推移,它们可以增加款项。特别是了解所有权成本和托管成本,可以为您提供数据库成本的全部视图。

如果您具有高度互连和递归数据,并且要对其进行分析,则必须找到一个适当的图形数据库。在此博客文章中,我们将比较运行MEMGRAPH和NEO4J图形数据库的托管成本。

memgraph和neo4j是兼容的数据库。使用螺栓协议和Cypher进行查询,这意味着您可以轻松地在它们之间切换基础架构。两个供应商都有数据库的免费社区和付费企业版。 There are some differences between editions,例如Memgraph Community Edition具有高可用性的复制,而Neo4J社区则没有。要了解托管成本的差异,让我们看看社区版如何比较正面。

近似托管数据库的成本

工程师开始考虑数据库系统的所有权成本并比较供应商时,他们通常专注于服务器资源使用情况。工程师喜欢跟踪每个CPU周期,在这里和那里花费的Megabyte以及整体数据库性能。因此,重要的指标是 CPU时间,RAM,网络磁盘存储。网络和磁盘存储也可以贡献成本,但是在此博客文章中,我们将讨论中小型数据集,在这种情况下,这两个参数起着较小的作用。

CPU时间是在数据库上运行计算的成本。由于您可能仅适用于数据库租用完整的云虚拟机,因此CPU时间不会太多。但是自performance can limit your use case以来,总体数据库性能将很重要。为了打击数据库效率低下和更高的负载,您必须增加CPU计数或CPU功率。在Memgraph vs. Neo4j: A Performance Comparison.

中已经讨论了每个数据库的性能

RAM使用情况可以大大塑造实例的整体价格。通常,您希望尽可能少地使用CPU和RAM,因为它们的大量使用可能会产生很多成本。让我们假设您目前有一个未指定的数据集,并且您需要在最受欢迎的云VM供应商AWS中托管Memgraph和Neo4J。

Amazon AWS EC2 T3实例在广泛的通用工作负载方面具有计算,内存和网络资源的平衡,包括大规模的微服务,中小型数据库以及关键的业务应用程序。 AWS上还有其他类型的实例,具有不同的目的,例如CPU优化,内存优化和存储优化,可以更好地适合您的用例,但是由于它们是出于演示目的而选择的T3实例,因为它们是为了演示目的很普遍。

让我们假设您在此基础架构上预测运行数据库已有三年了,然后您可能需要扩大规模。这将是在写作时运行三年租金实例的按需成本:

image alt

请记住,AWS提供了预订,可以预订,这可能是规定的租金价格的一半,但这只是成本的敏捷性。在MEMGRAPH和NEO4J之间进行选择时,它们的内存使用情况将定义实例需要多大以及最终需要花费多少钱。

MEMGRAPH和NEO4J内存体系结构之间的差异

在进入内存使用差异之前,重要的是要了解两个系统的运行方式。由于Neo4J和Memgraph是架构上不同的系统,因此它们使用内存的使用方式完全不同。

memgraph 是本机C ++数据库,并将所有数据存储在RAM内存中。磁盘上没有存储数据,并且所有查询均在RAM中的数据上执行。 MEMGRAPH支持持久性,这意味着,如果服务器失去电源,则在崩溃之前不会丢失MEMGRAPH中存在的数据。通过定期快照作为磁盘上的备份,可以实现持久性。根据设计,Memgraph可以更好地执行需要在最短的时间范围内执行的实时计算。但是由于这个原因,Memgraph受您的机器可用RAM的限制。如果您的数据集不适合RAM,则可以使用Memgraph。这就是为什么要事先进行calculate the approximate size of your dataset并找出how to control memory

neo4j 故事更为复杂,因为它基于JVM。 JVM执行所有RAM分配,JVM开销与Neo4J标准配合。由于NEO4J包含在JVM中,因此了解完整的内存使用情况并不像Memgraph那样简单。最重要的是,Neo4J将所有数据存储在磁盘上,但它也将数据加载为RAM作为缓存。这意味着查询可以同时使用RAM和磁盘的数据。从RAM查询数据将导致性能更快,同时查询来自磁盘的数据将导致性能退化。

可用于缓存的内存存储是由Neo4J配置中的page cache属性定义的。它使您能够定义可以在RAM中存储多少图形数据。 Neo4J不受总RAM的限制,而是受到总磁盘存储的限制,但是没有RAM的Neo4J的性能下降会很明显。

为了提高性能,Neo4J将尝试将尽可能多的数据加载到RAM缓存,执行所谓的热身过程。documentation recommends将90%的实例可用内存提供给页面缓存。这是NEO4J一侧的优化,将有助于提高Neo4J的整体性能。

即使在盘中和内存存储之间存在许多差异,但选择主要取决于您的用例和要求。

基准明亮托管费用

现在,您知道内存使用是托管成本的重要因素,以及Memgraph和Neo4J如何与内存一起使用,您如何实际决定选择哪个数据库?最好的选择是使用较少内存的选择,因此使您可以使用较小的实例。为了找出内存测量值,我们在包含斯洛文尼亚社交网络的数据库上执行了工作负载,POKEC有三种不同的尺寸,小,中和大型:

  • small- 10,000个顶点,121,716边缘
  • medium-100,000顶点,1,768,515边缘
  • large-1,632,803顶点,30,622,564边缘

由于生产环境中数据集的大小从数千到数万亿个节点和边缘不等,因此这些数据集都在较小的位置,因为它们用于演示目的。在Memgraph存储引擎中,小型数据集大约需要40 MB的RAM,中等400MB的RAM,并且大数据集需要大约4GB的RAM。

内存是从Cypherl文件导入数据集的过程中的,并执行两个查询。当工作负载在Linux计算机上执行时,脚本每50毫秒示例Memgraph和Neo4J RSS使用情况,并跟踪内存使用情况

请记住,工作负载是使用Neo4J和Memgraph的开箱即用的社区版本运行的,数据库还配置了。

执行的两个查询是k-hop查询和一个聚合查询。扩展或K-HOP查询是任何图形分析工作负载中最有趣的查询之一。扩展查询从目标节点开始,然后返回所有已定义的啤酒花数量的连接节点。这是一个分析性查询,执行和使用很多相当便宜:

MATCH (s:User {id: $id})-->(n:User) RETURN n.id

聚合查询非常密集。它需要匹配数据库中的所有节点,并获得特定节点属性的最小,最大值和平均值。

MATCH (n) RETURN min(n.age), max(n.age), avg(n.age)

那么,Memgraph和Neo4J在执行这些任务方面做得如何?如果您认为这是一个内存图形数据库,则必须使用比Neo4J(盘中图形数据库)更多的RAM,您会感到惊讶。

下图显示了在小数据集上执行扩展1查询期间的内存使用情况。相同的查询在12个并发客户端上运行了10.000次。

memory-graph-usage

您可以从线图中看到,Memgraph执行了这些10.000查询的速度,并且内存更少。与Neo4J相比,Memgraph在一小部分时间内执行了此工作负载,Linechart并不是可视化数据的最佳方法。

有趣的是,由于JVM和工作负载的执行,NEO4J内存使用方式如何增加和下降,因为JVM试图在执行过程中分配最佳的内存量。重要的是要注意,Neo4J并未使用所有内存执行此工作负载,这意味着JVM将内存供未来使用,这是基于JVM的应用程序的常规行为。因此,很难解释实际的内存使用量,而Neo4J也无法缓解该过程。

下图显示了在小数据集上执行10.000集合查询期间的内存使用。

memory-graph-usage

请注意,在整个工作负载执行过程中,Memgraph的内存使用方式在300 MB处是相当恒定的,而在运行期间,Neo4J的内存使用量再次使用各种内存。同样,JVM在执行查询时分配了额外的内存,最后,它在5.3 GB左右解决。

neo4j内存使用情况可以减少以将RAM用于JVM,并为其他组件(例如交易,查询缓存等)提供一些额外的RAM。但是,事实证明,这种修改的成本是性能和稳定性降解。在测试过程中,我们对Neo4J内存使用配置进行了一些实验,并且有限的NEO4J内存使用情况更加积极地进行了一些崩溃。对数据库进行微调的能力非常适合将软件配置为完美的条件,但是它可以提高工程成本,因为您需要投入工程时间才能正确理解系统并微调数据库配置。 memgraph是完全自我管理的,这是由恒定的内存使用显示。

总的来说,Neo4J在执行小数据集上执行工作负载时消耗的内存更多,这是基于JVM的系统的预期,但这可以随数据集的规模而变化。要了解在AWS实例上操作数据库的最坏情况,应考虑峰值内存使用。峰值内存使用情况将显示该实例在最坏情况下应使用的RAM量。

这是小数据集的峰值内存使用率:

memory-graph-usage-small-dataset

在数据导入过程中,memgraph Peak存储器的使用率为235 MB,而在聚合查询期间,Neo4J为5 345 MB。

在这种特殊情况下,memgraph可能可能适合t3.nano实例,但这将是一个非常大的挤压,并且该实例只能用于数据库,不能在实例上运行其他软件。这意味着MEMGRAPH适用于T3.Micro,三年租金的价格为299美元。另一方面,Neo4J可以适合T3.LARGE,三年租金的价格为2.369美元。这是三年租金的$ 2.070美元的差额

让我们看看中型数据集中发生了什么:

memory-graph-usage-medium-dataset

在这种情况下,在数据导入过程中,Memgraph的峰值内存使用率为1.2 GB,而在聚合查询期间,Neo4J为6.3 GB。相对于这些峰值值,Memgraph可能适合T3.SMALL,三年租金的费用为599美元。另一方面,Neo4J可以适合T3.LARGE,三年租金的价格为2.369美元。三年租金的差额为1.770美元。

memory-graph-usage-large-dataset

使用大型数据集,Memgraph的峰值内存使用率为6.07 GB,而数据导入期间为17.9 GB,在数据导入方面也是17.9 GB。导入过程由许多串行交易组成,这对于两个数据库来说都是由内存的压力。在这种特殊情况下,MEMGRAPH适用于T3.LARGE,三年租金的价格为2.369美元。另一方面,Neo4J可以适合T3.2XLARGE,三年租金的价格为9,586美元。三年租金的差额为7.217美元。

您可以看到,在某些情况下,memgraph可能比neo4j更有效。通过将峰值存储器使用与AWS实例定价节省的峰值使用与MEMGRAPH相关联可能是重要的。这取决于少数因素,例如数据集大小,RAM限制性CTIOS,性能目标,实例类型等。

结论

数据库托管是总拥有成本的有趣成本,在决定选择哪个数据库之前,应考虑到它。如您所见,Memgraph是一个关于内存使用情况的相当稳定的数据库,这可能会导致潜在的大量成本节省。最重要的是,Memgraph也更快,这可以导致整体响应速度更快。

我们很想看看您想通过Memgraph开发哪种类型的应用程序。用Memgraph进行test drive,请查看我们的documentation,以了解其工作原理的坚果和螺栓,或者阅读更多blogs,以查看使用Memgraph的大量用例。如果您对我们的工程师有任何疑问或想与其他Memgraph用户互动,请加入Discord上的Memgraph社区!

Read more about Neo4j and Memgraph on memgraph.com