10

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

到目前为止,我们一直在考虑为此使用 DynamoDB,因为它非常容易上手。

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

所以……每月 5424 美元

我会考虑其他选择,但我担心维护问题、成本等。我以前从未使用过此类设置,因此您的建议将非常有价值。

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

4

3 回答 3

17

根据您上面的描述,我假设您每秒 5,000 次查询完全是读取操作。这本质上就是我们所说的数据仓库用例。您的可用性要求是什么?它必须托管在 AWS 和朋友上,还是您可以购买自己的硬件在内部运行?你的数据是什么样的?使用这些数据的逻辑是什么样的?

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

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

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

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

我在最近的一个项目中发现了这一点,所以我切换到了 Rackspace。那里的性能得到了极大的提升,但我注意到当我真的只需要快速 I/O 时,我为 CPU 和 RAM 资源付出了很多。现在我在 Digital Ocean 主持。DO的所有存储都是SSD。与其他产品相比,它们的 CPU 性能有点糟糕,但我非常受 I/O 限制,所以我不在乎。在将 Postgres'random_page_cost降到 2 之后,我的表现非常好。

故事的寓意:简介,曲调,重复。问自己假设问题并不断验证您的假设。

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

于 2012-08-26T21:09:02.477 回答
2

“负载”是指每秒约 5,000 个查询。

啊,那不是那么多,即使是SQL也可以处理。因此,您已经很容易在大多数现代数据库可以处理的范围内。但是,他们只能通过以下权利处理此问题:

  • 索引
  • 查询
  • 服务器硬件
  • 大数据的拆分(您可能需要大量的分片,每个分片的数据相对较低,取决于这里,所以我说“可能”)

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

现在这更像是一个高负载场景。您必须以如此支离破碎的方式阅读这些内容吗?如果是这样(如我所说),您可能需要考虑将负载分散到复制的分片中。

存储不是我担心的事情,因为这些物体非常小。

Mongo 在磁盘分配方面非常激进,因此即使是小对象,它仍然会预先分配大量空间,这是需要牢记的。

所以……每月 5424 美元。

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

我会考虑其他选择,但我担心维护问题、成本等。我以前从未使用过此类设置,因此您的建议将非常有价值。

现在你碰到了这一切的障碍。您可以设置自己的集群,但最终可能会为服务器、人员、管理员和您自己的维护时间支付那么多的金钱和时间(或更多)。这就是 DynamoDB 真正在这里大放异彩的原因之一。对于希望承担服务器管理的负载、痛苦和压力的大型设置(相信我,这真的很痛苦,如果你是开发人员,你不妨从现在开始将你的职位改为服务器管理员)离开公司。

考虑自己设置,您需要:

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

两者都可能使您每年损失 100 万英镑,如果它符合您的需求和预算,我个人会打赌管理方法。当您的需求超出托管 Amazon DB 所能提供的范围时,您就可以迁移到您的基础设施。

编辑

我应该修正一下,成本效益是通过相当多的黑洞完成的,例如:

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

这两个都有助于我放置一个场景:

  • 大量写入(大约与您的阅读量一样多)
  • 海量数据(手)
于 2012-08-26T20:24:09.470 回答
0

这是我按顺序推荐的。

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

  2. 尝试在 RAM 中缓存您的查询(通过提供足够的 RAM)。

  3. 如果您在 RAM 上遇到瓶颈,那么您可以尝试利用临时 SSD 的 SSD 缓存解决方案。如果您的工作负载对缓存友好,则此方法有效。您可以节省大量资金,因为云提供商通常不会向临时 SSD 收费。

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

于 2014-12-29T08:45:06.837 回答