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

时间:2012-08-26 19:57:29

标签: mongodb nosql

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

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

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

所以... 每月5424美元

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

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

3 个答案:

答案 0 :(得分: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_cost放到2之后,我的声音非常好。

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

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

答案 1 :(得分:2)

  

“加载”是指每秒约5,000次查询。

啊,那不是那么多,甚至SQL都可以解决这个问题。因此,您已经轻松地处于大多数现代数据库可以处理的范围内。但是他们只能用右边的方式来处理这个问题:

  • 索引
  • 查询
  • 服务器硬件
  • 拆分大数据(你可能需要大量的碎片,每个碎片的数据相对较低,因此依赖于此,所以我说“可能”)
  

那将是每秒读取约100,000个对象。

现在更多的是高负荷情况。你必须以这种支离破碎的方式阅读这些内容吗?如果是这样的话(正如我所说的那样)你可能需要考虑在重复的分片上传播负载。

  

存储不是我会担心的事情,因为对象真的很小。

Mongo对磁盘分配很有侵略性,所以即使使用小对象,它仍会预先分配大量空间,这是值得考虑的事情。

  

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

哦,是亚马逊:\的费用惊悚。

  

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

现在你遇到了这一切。您可以设置自己的群集,但最终可能会为服务器,人员,管理员和您自己的维护时间花费更多的金钱和时间(或更多)。这就是为什么DynamoDB真的在这里闪耀的原因之一。对于那些希望承担服务器管理的负担和痛苦以及压力的大型设置(相信我,如果你的开发人员从现在开始将你的职位改名为服务器管理员,那真的很痛苦)。 / p>

考虑自己设置,你需要:

  • 相当数量的EC实例(取决于数据和索引大小,但我会说接近30?)
  • 服务器管理员(可能是2,也许是自由职业者?)

这两项都可以让你每年减掉100英镑,如果符合你的需要和预算,我个人会打赌管理方法。当您的需求增长超出亚马逊数据库管理员可以为您提供的服务时,请转移到您的基础架构。

修改

我应该修改成本效益是用很多黑洞完成的,例如:

  • 我不确定您拥有的数据量
  • 我不确定写作

这些都有助于我设置一个场景:

  • 大量写作(与阅读一样多)
  • 海量数据(手数)

答案 2 :(得分:0)

这是我推荐的顺序。

  1. 确定您的用例并选择正确的数据库。我们定期测试MySQL和MongoDb的各种工作负载(OLTP,分析等)。在我们测试过的所有情况下,与MongoDb相比,MySQL的性能优于MongoDb并且更便宜($ / TPS)。 MongoDb还有其他优点,但这是另一个故事...因为我们在这里谈论表现。

  2. 尝试将查询缓存在RAM中(通过配置足够的RAM)。

  3. 如果您在RAM上瓶颈,那么您可以尝试利用短暂SSD的SSD缓存解决方案。如果您的工作负载是缓存友好的,则可以您可以节省大量资金,因为短暂的SSD通常不会由云提供商收取费用。

  4. 尝试使用PIOPS / RAID或组合为您的应用程序创建足够的IOPS。