在EC2上扩展MongoDB,或者我应该直接切换到DynamoDB



我目前使用MongoDB在一台服务器上运行我的网站。在我的服务器上,我有两个组件(1)一个每小时运行一次的爬网程序,并将数据附加到我的MongoDB实例中;(2)一个从爬网程序索引中读取数据并写入用户个性化数据库的网站。我将转到AmazonEC2进行自动扩展,这样web服务器就可以自动扩展,所以我可以随着web流量的增加而增加服务器的数量。我的爬行器不需要自动缩放。这对我如何使用MongoDB提出了挑战。我想知道我最好的选择是在上优化什么

  • 对我的代码的最小更改(代码在perl中)
  • 能够无缝添加/删除web服务器,而无需担心数据库中的数据丢失
  • 低成本

在短期内,DB肯定能够容纳所有机器的内存,因为它将低于2GB。用户个性化数据库无法重建,因此拥有它更重要,而索引可以很容易地重建。当前的MongoDB爬网索引有大约10万个条目,它们被键控在大约15个不同的列上。这是为速度而建的,因为我正在一个在线约会网站上工作(可以在很多方面搜索)。

我能想出几个选择

  1. 使用SimpleDB作为用户个性化存储,使用MongoDB作为索引。让索引在所有机器上复制,但是,我对MongoDB复制不太了解
  2. 将所有内容移动到SimpleDB
  3. 将所有内容移动到DynamoDB

我对SimpleDB和/或DynamoDB了解不多。根据文章,DynamoDB似乎是一个自然的选择,但我不确定是否有良好的perl支持,我是否可以拥有所有的列、索引等。有人有经验或有任何建议吗?

您可以在EC2上的单个服务器上托管Mongo,web场中的每个盒子都连接到该服务器。然后,您可以轻松地启动另一个使用相同DB盒子的web实例。

我们目前有三个Mongo服务器,因为我们运行一个副本集,当我们需要使用Mongo进行水平扩展时,我们将启动一些新实例并分割更大的集合。

我目前使用MongoDB在一台服务器上运行我的网站。

首先,这是一面巨大的红旗。在生产环境中运行时,始终建议运行至少具有三个完整节点的复制副本集。

复制提供了自动冗余和故障切换。

能够无缝添加/删除web服务器,而无需担心数据库中的数据丢失

MongoDB支持一个名为sharding的概念。Sharding提供了一种通过自动对数据进行分区来横向扩展的方法。分区是通过一个shard键完成的。

如果您计划使用分片,请仔细阅读链接,并认识到其局限性。对于MongoDB分片,您必须选择正确的密钥,以允许查询在分片之间均匀分布。

当前的MongoDB爬网索引有大约10万个条目,它们被键控在大约15个不同的列上。

这将是分片的一个问题。Sharding只能缩放使用shard键的查询。对shard密钥的查询可以直接路由到一台机器。对辅助索引的查询将转到所有计算机。

您有15个不同的索引,所以基本上所有这些查询都将转到所有碎片。这根本不会很好地"自动缩放"。

请注意,目前EC2没有64位小实例,这可能会使复制成本高昂。因为MongoDB内存映射文件,所以不建议使用32位操作系统。

我对SimpleDB有过非常糟糕的体验,认为它有根本的缺陷,所以我会避免它。

三是关于如何在AmazonEC2上设置MongoDB的好白皮书:http://d36cz9buwru1tt.cloudfront.net/AWS_NoSQL_MongoDB.pdf

我怀疑在EC2上设置MongoDB是最快的解决方案,而不是为DynamoDB重写/迁移。

祝你好运!

相关内容

  • 没有找到相关文章

最新更新