提问



我正在评估什么是最好的迁移选项。


目前,我使用分片MySQL(水平分区),我的大部分数据存储在JSON blob中。我没有任何复杂的SQL查询(自从我对数据库进行分区后已经迁移过了)。


现在,似乎MongoDB和Cassandra都可能是选择。我的情况:



  • 每次查询都有大量读取,不那么经常写入

  • 不担心大规模可扩展性

  • 更关注简单的设置,维护和代码

  • 最大限度地降低硬件/服务器成本


最佳参考


每次查询都有大量读取,常规写入次数较少


两个数据库在热数据集适合内存的读取中表现良好。两者都强调无连接数据模型(并鼓励非规范化),并且都提供文档或行的索引,尽管MongoDB的索引目前更灵活。[3] [4]


无论你的数据集有多大,Cassandra的存储引擎都能提供恒定时间写入.MongoDB中的写入问题更多,部分原因在于基于b树的存储引擎,但更多因为它具有多粒度锁定。[[[5]


对于分析,MongoDB提供自定义map/reduce实现; Cassandra提供本机Hadoop支持,包括Hive(基于Hadoop map/reduce构建的SQL数据仓库)和Pig(Hadoop特定的分析语言,许多人认为这种语言比SQL更适合映射/减少工作负载)。 Cassandra还支持使用Spark。[6] [7] [8]


不担心大规模可扩展性


如果您正在查看单个服务器,MongoDB可能更适合。对于那些更关心扩展的人来说,Cassandra的非单点故障架构将更容易设置并且更可靠。 (MongoDB的全局写锁也会变得更加痛苦。)Cassandra还可以更好地控制复制的工作方式,包括支持多个数据中心。


更关注简单的设置,维护和代码


两者都很容易设置,单个服务器具有合理的开箱即用默认值。 Cassandra在多服务器配置中设置起来比较简单,因为不需要担心特殊角色节点;这是一个截屏视频,展示了在两分钟内建立一个4节点的Cassandra集群。[9]


如果你现在正在使用JSON blob,那么MongoDB对于你的用例是一个非常好的匹配,因为它使用BSON来存储数据。你将能够拥有比你现在的数据库更丰富,更可查询的数据。这将是Mongo最重要的胜利。

其它参考1


我已经广泛使用了MongoDB(过去6个月),构建了一个分层数据管理系统,我可以保证设置的简易性(安装,运行,使用它!)和速度。只要你仔细考虑指数,它绝对可以在速度方面尖叫。


我认为Cassandra由于其在Twitter等大型项目中的使用,具有更好的扩展功能,尽管MongoDB团队正在努力实现平价。我应该指出,我没有在试运行阶段之前使用Cassandra,所以我不能说出细节。


当我们评估NoSQL数据库时,真正的摇摆人是查询 - Cassandra基本上只是一个巨大的键/值存储,查询有点繁琐(至少与MongoDB相比),所以对于性能你必须将很多数据复制为一种手动索引。另一方面,MongoDB使用按示例查询模型。


例如,假设您有一个包含Users的集合(MongoDB用于相当于RDMS表的说法).MongoDB将记录存储为Documents,它们基本上是二进制JSON对象。例如:


{
   FirstName: "John",
   LastName: "Smith",
   Email: "john@smith.com",
   Groups: ["Admin", "User", "SuperUser"]
}


如果您想找到所有名为Smith的用户,他们拥有管理员权限,您只需创建一个新文档(使用Javascript在管理控制台上,或使用您选择的语言在生产中):


{
   LastName: "Smith",
   Groups: "Admin"
}


...然后运行查询。这就是它。增加了比较运算符,RegEx过滤等,但这一切都非常简单,基于Wiki的文档非常好。

其它参考2


为什么要在传统数据库和NoSQL数据存储之间进行选择?同时使用! NoSQL解决方案的问题(超出最初的学习曲线)是缺少事务 - 你对MySQL进行了所有更新,并让MySQL为读取填充NoSQL数据存储 - 然后你可以从每项技术的优势中受益。这确实增加了更复杂,但你已经有了MySQL方面 - 只需添加MongoDB,Cassandra等。


对于相同的规范,NoSQL数据存储通常比传统数据库更好地扩展 - 有一个原因,Facebook,Twitter,谷歌和大多数初创公司都在使用NoSQL解决方案。这不只是极客们对新技术的高度重视。

其它参考3


我可能会成为一个奇怪的人,但我认为你需要继续使用MySQL。你还没有描述你需要解决的真正问题,MySQL/InnoDB即使对于blob来说也是一个出色的存储后端/json数据。


Web工程师有一个常见的伎俩,即一旦实现并未使用RDBMS的所有功能,就会尝试使用更多的NoSQL。仅此一点并不是一个好理由,因为大多数情况下NoSQL数据库的数据引擎相当差(MySQL称之为存储引擎)。


现在,如果您不是那种类型,那么请指定MySQL中缺少的内容,并且您需要在不同的数据库中查找(例如,自动分片,自动故障转移,多主复制) ,较高的写入吞吐量等在集群中获得较低的数据一致性保证。

其它参考4


我没有使用过Cassandra,但是我使用过MongoDB并认为它太棒了。


如果你的简单设置,这就是它。你只需解压MongoDB并运行mongod守护进程即可。它正在运行。


显然,这只是一个首发,但为了让你开始它很容易。

其它参考5


我昨天在mongodb上看过一个演讲。我可以肯定地说,设置是简单的,就像打开包装并将其启动一样简单。完成。


我相信mongodb和cassandra几乎可以在任何常规的Linux硬件上运行,所以你不应该在那个领域找到很多障碍。


我认为在这种情况下,在一天结束时,它将归结为您个人感觉更舒服,哪个有您喜欢的工具集。至于关于mongodb的演示文稿,主持人表示mongodb的工具集很轻,并且没有很多(他们说任何真正的)工具类似于可用于MySQL的工具。这当然是他们的体验,所以YMMV。我对mongodb所做的一件事就是它似乎有很多语言支持(Python和.NET是我主要使用的两种语言)。


使用mongodb的网站列表非常令人印象深刻,我知道Twitter刚刚切换到使用cassandra。[10]