极高的QPS-DynamoDB vs MongoDB vs其他noSQL?

极高的QPS-DynamoDB vs MongoDB vs其他noSQL?,mongodb,nosql,Mongodb,Nosql,我们正在建立一个系统,从第一天起就需要处理大量的小请求。“加载”是指每秒约5000次查询。对于每个查询,我们需要从noSQL数据库中检索约20条记录。将有两次批读取-首先读取3-4条记录,然后立即读取16-17条记录(基于第一次读取的结果)。这意味着每秒要读取约100000个对象 到目前为止,我们一直在考虑使用DynamoDB实现这一点,因为它非常容易开始 存储不是我会担心的事情,因为对象将非常小。 我担心的是阅读的成本。DynamoDB每秒每100次最终一致(这对我们来说很好)读取的成本为每小

我们正在建立一个系统,从第一天起就需要处理大量的小请求。“加载”是指每秒约5000次查询。对于每个查询,我们需要从noSQL数据库中检索约20条记录。将有两次批读取-首先读取3-4条记录,然后立即读取16-17条记录(基于第一次读取的结果)。这意味着每秒要读取约100000个对象

到目前为止,我们一直在考虑使用DynamoDB实现这一点,因为它非常容易开始

存储不是我会担心的事情,因为对象将非常小。 我担心的是阅读的成本。DynamoDB每秒每100次最终一致(这对我们来说很好)读取的成本为每小时0.0113美元。如果所有物体的大小都达到1KB,我们每小时的价格是11,3美元。根据每天16小时的平均使用量,每月的费用为5424美元

所以每月5424美元

我会考虑其他选择,但我担心维修问题,费用等。我从来没有与这样的设置之前,所以你的建议将是非常有价值的。< /P> 对于这种读/写密集型应用程序,哪种解决方案最具成本效益(但仍然没有麻烦)

“加载”是指每秒约5000次查询

啊,这不算多,连SQL都能处理。因此,您已经处于大多数现代DBs能够处理的范围之内。但是,他们只能通过正确的方式处理此问题:

  • 索引
  • 询问
  • 服务器硬件
  • 分割大数据(可能需要大量碎片,每个碎片的数据量相对较低,具体取决于此处,所以我说“可能”)
这意味着每秒要读取约100000个对象

现在,这更像是一个高负载场景。你一定要以这种支离破碎的方式来阅读这些吗?如果是这样的话(如我所说),您可能需要考虑在复制的碎片上分散负载

存储不是我会担心的事情,因为对象将非常小

Mongo在磁盘分配方面具有攻击性,因此即使使用小型对象,它仍然会预先分配大量空间,这是需要牢记的

所以$每月5424人

哦,是的,亚马逊的计费刺激
:\

我会考虑其他选择,但我担心维修问题,费用等。我从来没有与这样的设置之前,所以你的建议将是非常有价值的。< /P> 现在你遇到了所有的困难。您可以设置自己的集群,但最终可能会为服务器、人员、管理员和您自己的维护时间付出那么多的金钱和时间(或者更多)。这就是为什么DynamoDB在这里大放异彩的原因之一。对于那些希望承担服务器管理的负担、痛苦和压力(相信我,这真的很痛苦,如果你是一名开发人员,那么从现在起,你最好将你的职位改为服务器管理员)的大型设置公司

考虑到自行设置,您需要:

  • 大量的EC实例(取决于数据和索引大小,但我想说可能接近30?)
  • 一名服务器管理员(可能是2名,可能是自由职业者?)
这两种方法每年都会让你损失100到数千英镑,我个人打赌,如果它符合你的需求和预算,那么我会选择管理方法。当您的需求超出托管Amazon DB所能提供的范围时,请转到您的基础架构

编辑 我要修正的是,成本效益是通过相当多的黑洞来实现的,例如:

  • 我不确定您拥有的数据量
  • 我不确定你的写作
这两个方面都有助于我提出一个场景:

  • 大量写作(与你的阅读量差不多)
  • 海量数据(lots)

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

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

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

如果查询归结为
SELECT*FROM table WHERE primary_key={CONSTANT}
-不要麻烦搞乱NoSQL-只需使用RDBMS并学习如何调整dang。如果您可以在自己的硬件上运行它,则这一点更加正确。如果连接计数较高,请使用读从属设备来平衡负载

事后很久编辑(5/7/2013): 我之前应该提到的一点是:EC2是一个非常糟糕的地方,用来衡量自我管理的数据库节点的性能。除非你付出了代价,否则你的I/O性能会很糟糕。您的选择是要么为配置的IOPS支付大笔资金,要么将一组EBS卷RAID在一起,要么在将WAL同步到S3或类似版本时依赖临时存储。所有这些选项都很昂贵且难以维护。所有这些选择