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

目前,我使用的是一个分片MySQL(水平分区),我的大部分数据存储在JSON blobs中。我没有任何复杂的SQL查询(已经迁移了,因为我分区了我的db)。

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

在每个查询中都有大量的读取,较少的常规写入 不担心“大规模”的可伸缩性 更关心简单的设置、维护和代码 最小化硬件/服务器成本


当前回答

每个查询都有大量的读操作,很少有常规的写操作

当热数据集适合内存时,这两个数据库在读取时都表现良好。两者都强调无连接数据模型(鼓励非规格化),都提供文档或行索引,不过MongoDB的索引目前更加灵活。

Cassandra的存储引擎提供恒定时间的写入,无论您的数据集增长有多大。在MongoDB中写的问题更大,部分原因是基于b-树的存储引擎,但更多的原因是它所做的多粒度锁定。

对于分析,MongoDB提供了一个自定义的map/reduce实现;Cassandra提供原生Hadoop支持,包括Hive(一种基于Hadoop map/reduce构建的SQL数据仓库)和Pig(一种Hadoop特定的分析语言,许多人认为它比SQL更适合map/reduce工作负载)。Cassandra也支持Spark的使用。

不担心“大规模”的可伸缩性

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

更关心简单的设置、维护和代码

两者的设置都很简单,对于单个服务器都有合理的开箱即用的默认值。Cassandra在多服务器配置中更容易设置,因为不需要担心特殊角色的节点。

如果您目前正在使用JSON blobs, MongoDB非常适合您的用例,因为它使用BSON存储数据。您将能够拥有比当前数据库更丰富、更可查询的数据。这将是Mongo最重要的胜利。

其他回答

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

在相同规格的情况下,NoSQL数据存储通常比传统数据库的扩展性更好——这就是为什么Facebook、Twitter、谷歌和大多数初创企业都在使用NoSQL解决方案的原因。不仅仅是极客们在新科技上兴奋。

我广泛地使用MongoDB(在过去的6个月里),构建了一个分层的数据管理系统,我可以保证安装的简易性(安装、运行、使用!)和速度。只要您仔细考虑索引,它绝对可以在速度方面快速运行。

我收集到Cassandra,由于它被用于像Twitter这样的大型项目,有更好的扩展功能,尽管MongoDB团队正在那里进行对等工作。我应该指出的是,我在试运行阶段之后就没有使用过Cassandra,所以我不能透露细节。

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

例如,假设您有一个包含Users的Collection (MongoDB中相当于RDMS表的说法)。MongoDB将记录存储为文档,基本上是二进制JSON对象。例句:

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

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

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

...然后运行查询。就是这样。还添加了用于比较、RegEx过滤等操作符,但都非常简单,基于wiki的文档也非常好。

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

在Web工程师中有一个常见的技巧,即在意识到RDBMS并没有使用所有特性时尝试使用更多的NoSQL。这本身并不是一个好的理由,因为大多数情况下NoSQL数据库的数据引擎(MySQL称之为存储引擎)相当差。

现在,如果你不是这样的人,那么请说明MySQL中缺少什么,你正在寻找一个不同的数据库(比如,自动分片,自动故障转移,多主复制,集群中较弱的数据一致性保证,以更高的写吞吐量,等等)。

我没有用过Cassandra,但是我用过MongoDB,我觉得它很棒。

如果你想要简单的设置,这就是它:你只需untar MongoDB并运行mongod守护进程,这就是它…它是运行。

显然,这只是一个开始,但要让你开始很容易。

每个查询都有大量的读操作,很少有常规的写操作

当热数据集适合内存时,这两个数据库在读取时都表现良好。两者都强调无连接数据模型(鼓励非规格化),都提供文档或行索引,不过MongoDB的索引目前更加灵活。

Cassandra的存储引擎提供恒定时间的写入,无论您的数据集增长有多大。在MongoDB中写的问题更大,部分原因是基于b-树的存储引擎,但更多的原因是它所做的多粒度锁定。

对于分析,MongoDB提供了一个自定义的map/reduce实现;Cassandra提供原生Hadoop支持,包括Hive(一种基于Hadoop map/reduce构建的SQL数据仓库)和Pig(一种Hadoop特定的分析语言,许多人认为它比SQL更适合map/reduce工作负载)。Cassandra也支持Spark的使用。

不担心“大规模”的可伸缩性

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

更关心简单的设置、维护和代码

两者的设置都很简单,对于单个服务器都有合理的开箱即用的默认值。Cassandra在多服务器配置中更容易设置,因为不需要担心特殊角色的节点。

如果您目前正在使用JSON blobs, MongoDB非常适合您的用例,因为它使用BSON存储数据。您将能够拥有比当前数据库更丰富、更可查询的数据。这将是Mongo最重要的胜利。