什么情况更有意义 - 安装了几个安装了MongoDB的EC2实例,或者更确切地说使用Amazon SimpleDB Web服务?
当有几个使用MongoDB的EC2实例时,我遇到了自己设置实例的问题.
使用SimpleDB时,我遇到了将我锁定到Amazons数据结构的问题吗?
发展方面有什么不同?我不应该只是切换服务层的DAO,写入MongoDB或AWS SimpleDB吗?
SimpleDB具有一些可伸缩性限制.您只能通过分片进行扩展,并且它具有比mongodb或cassandra更高的延迟,它具有吞吐量限制,并且其定价高于其他选项.可伸缩性是手动的(您必须进行分片).
如果您需要更宽的查询选项并且您具有高读取率并且您没有那么多数据,那么mongodb会更好.但是对于持久性,您需要使用至少2个mongodb服务器实例作为主/从.否则,您可能会丢失数据的最后一分钟.可伸缩性是手动的.它比simpledb快得多.Autosharding在1.6版本中实现.
Cassandra具有较弱的查询选项,但与postgresql一样耐用.它与mongo一样快,在更高的数据大小上更快.写操作比cassandra上的读操作更快.它可以通过触发ec2实例自动扩展,但你必须稍微修改配置文件(如果我没记错的话).如果你有太字节数据cassandra是你最好的选择.无需对数据进行分片,它是从第1天开始分发的.您可以为所有数据创建任意数量的副本,如果某些服务器已经死亡,它将自动从实时服务器返回结果并将死服务器的数据分发给其他服务器.它具有高度的容错能力.您可以包含任意数量的实例,它比其他选项更容易扩展.它具有强大的.net和Java客户端选项.他们有连接池,负载平衡,
另一个选择是大数据的hadoop,但它不像其他人那样实时,你可以使用hadoop进行数据仓库.cassandra或mongo都没有交易,所以如果你需要交易,postgresql更合适.另一个选择是亚马逊RDS,但它的性能很差,价格也很高.如果要使用数据库或simpledb,则可能还需要数据缓存(例如:memcached).
对于网络应用程序,如果您的数据很小,我建议mongo,如果它是大cassandra更好.你不需要使用mongo或cassandra的缓存层,它们已经很快了.我不推荐simpledb,它也像你说的那样将你锁定在亚马逊上.
如果您正在使用c#,java或scala,您可以编写一个接口并为mongo,mysql,cassandra或其他任何数据访问层实现它.它在动态语言中更简单(例如rub,python,php).如果需要,您可以为其中两个编写提供程序,并且可以在运行时通过仅更改配置来更改存储,它们都是可能的.使用mongo,cassandra和simpledb进行开发比数据库更容易,并且它们没有架构,它还取决于您正在使用的客户端库/连接器.最简单的是mongo.cassandra中每个表只有一个索引,所以你要自己管理其他索引,但是如我所知,使用0.7版本的cassandra二级索引是可行的.如果必须,您也可以从其中任何一个开始并在将来替换它.
我想你既有时间又有速度的问题.
MongoDB/Cassandra会更快,但你必须投资$$$来让他们继续前进.这意味着您需要为所有这些实例运行/设置服务器实例,并弄清楚它们是如何工作的.
另一方面,您不必直接按"每笔交易"成本,只需为硬件付费,这对于大型服务可能更有效.
在Cassandra/MongoDB的战斗中你会发现(根据过去几天我亲自参与的测试).
卡桑德拉:
扩展/冗余是非常核心的
配置可能非常激烈
要进行报告,您需要map-reduce,因为您需要运行hadoop层.这是一个痛苦的配置和更大的痛苦,以获得高效.
MongoDB的:
配置相对简单(即使是本周的新分片)
冗余仍在"到达那里"
Map-reduce是内置的,很容易获取数据.
老实说,考虑到我们的10s GB数据所需的配置时间,我们最终选择了MongoDB.我可以想象使用SimpleDB"必须得到这些运行"的情况.但是配置一个节点来运行MongoDB是如此简单,以至于跳过"SimpleDB"路由可能是值得的.
就DAO而言,Mongo已有大量的图书馆.Cassandra的Thrift框架得到了很好的支持.您可以编写一些简单的逻辑来抽象出连接.但是,抽象比简单CRUD更复杂的东西将更难.