我目前使用MongoDB在一台服务器上运行我的网站。在我的服务器上,我有两个组件(1)一个每小时运行一次的爬网程序,并将数据附加到我的MongoDB实例中;(2)一个从爬网程序索引中读取数据并写入用户个性化数据库的网站。我将转到AmazonEC2进行自动扩展,这样web服务器就可以自动扩展,所以我可以随着web流量的增加而增加服务器的数量。我的爬行器不需要自动缩放。这对我如何使用MongoDB提出了挑战。我想知道我最好的选择是在上优化什么
- 对我的代码的最小更改(代码在perl中)
- 能够无缝添加/删除web服务器,而无需担心数据库中的数据丢失
- 低成本
在短期内,DB肯定能够容纳所有机器的内存,因为它将低于2GB。用户个性化数据库无法重建,因此拥有它更重要,而索引可以很容易地重建。当前的MongoDB爬网索引有大约10万个条目,它们被键控在大约15个不同的列上。这是为速度而建的,因为我正在一个在线约会网站上工作(可以在很多方面搜索)。
我能想出几个选择
- 使用SimpleDB作为用户个性化存储,使用MongoDB作为索引。让索引在所有机器上复制,但是,我对MongoDB复制不太了解
- 将所有内容移动到SimpleDB
- 将所有内容移动到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重写/迁移。
祝你好运!