极高的QPS - DynamoDB与MongoDB相比其他noSQL?

sPa*_*aul 9 mongodb nosql

我们正在建立一个系统,需要从第一天开始提供大量小额请求.通过"加载"我的意思是每秒约5,000次查询.对于每个查询,我们需要从noSQL数据库中检索~20条记录.将有两个批次读取 - 首先是3-4个记录,然后是16-17之后立即读取(基于第一次读取的结果).那将是每秒读取约100,000个对象.

到目前为止,我们一直在考虑使用DynamoDB,因为它很容易入手.

存储不是我会担心的东西,因为对象会非常小.我担心的是读取成本.DynamoDB每小时每小时成本为0.0113美元,最终一致(这对我们来说很好)每秒读取数.这是我们每小时11,3美元,前提是所有对象的大小都是1KB.根据16小时/天的平均使用量,这将是每月5424美元.

所以...... 每月5424美元.

我会考虑其他选择,但我担心维护问题,成本等.我之前从未使用过这样的设置,所以你的建议真的很有价值.

对于这种读/写密集型应用程序,最具成本效益(但仍然无障碍)的解决方案是什么?

Ben*_*rns 16

从上面的描述中,我假设您每秒5000次查询完全是读取操作.这基本上就是我们所说的数据仓库用例.您的可用性要求是什么?它是否必须托管在AWS和朋友上,或者您是否可以购买自己的硬件以在内部运行?你的数据是什么样的?消耗这些数据的逻辑是什么样的?

您可能会感觉到这里确实没有足够的信息来明确回答这个问题,但我至少可以提供一些建议.

首先,如果您的数据相对较小且查询很简单,请节省一些麻烦,并确保从RAM而不是磁盘查询.任何支持内存缓存/表空间的现代RDBMS都可以解决这个问题.Postgres和MySQL都有这方面的功能.在Postgres的情况下,请确保您已经适当地调整了内存参数,因为开箱即用的配置旨在运行在非常微薄的硬件上.如果必须使用NoSQL选项,根据数据的结构,Redis可能是一个不错的选择(它也主要在内存中).然而,为了说明NoSQL的哪种风格可能是最合适的,我们需要更多地了解您正在查询的数据结构以及您正在运行的查询.

如果查询归结为SELECT * FROM table WHERE primary_key = {CONSTANT}- 不要打扰使用NoSQL - 只需使用RDBMS并学习如何调整dang事物.如果您可以在自己的硬件上运行它,那么这是真的.如果连接计数很高,请使用读取从站来平衡负载.

很久以后编辑(2013年5月7日):我之前应该提到过的东西:EC2是衡量自我管理数据库节点性能的一个非常糟糕的地方.除非你付出了代价,否则你的I/O性能会非常糟糕.您可以选择为配置的IOPS支付大笔资金,将一堆EBS卷配合在一起,或者在将WAL同步到S3或类似设备时依赖短暂的存储.所有这些选择都很昂贵且难以维护.所有这些选项都有不同程度的性能.

我在最近的一个项目中发现了这个,所以我切换到了Rackspace.那里的性能大大增加,但我注意到,当我真正需要快速I/O时,我为CPU和RAM资源付出了很多.现在我主持Digital Ocean.DO的所有存储都是SSD.与其他产品相比,它们的CPU性能有点蹩脚,但我的I/O界限令人难以置信,所以我只是不关心.在将Postgres'降为random_page_cost2之后,我一直很好地哼着.

故事的道德:简介,调整,重复.问自己什么是问题,并不断验证你的假设.

另一个很长的事后编辑(2013年11月23日):作为我在这里描述的一个例子,请查看以下文章,了解使用带有InnoDB memcached插件的MySQL 5.7实现1M QPS的示例:http://dimitrik.free.fr/blog/archives/11-01-2013_11-30-2013.html#2013-11-22

  • 我担心它会比这复杂一点.可以说,如果您需要通用数据存储,您应该使用SQL数据库.NoSQL通常只有在您知道自己只想以非常特定的方式查询数据时才有意义,并且当您有一种非常特殊的加载类型时,这种加载很难将传统的RDBMS扩展到,_和_特定的NoSQL解决方案非常适合.事实证明这不是一个非常常见的场景,因此我倾向于在项目早期阶段提出反对NoSQL的建议.5K QPS对现代RDBMS来说并不是一个非常繁重的读取负载. (2认同)