我正在评估什么是最好的迁移选项.
目前,我正在使用分片MySQL(水平分区),我的大部分数据都存储在JSON blob中.我没有任何复杂的SQL查询(自从我对数据库进行分区后已经迁移过了).
现在,似乎MongoDB和Cassandra都可能成为选择.我的情况:
每次查询都有大量读取,而不是常规写入
不担心"大规模"的可扩展性
更关注简单的设置,维护和代码
最大限度地降低硬件/服务器成本
Michael.. 576
每次查询都有大量读取,常规写入次数较少
两个数据库在热数据集适合内存的读取中表现良好.两者都强调无连接数据模型(并鼓励非规范化),并且都提供文档或行的索引,尽管MongoDB的索引目前更灵活.
无论您的数据集有多大,Cassandra的存储引擎都能提供恒定时间写入.在MongoDB中写入更有问题,部分原因是基于b树的存储引擎,但更多是因为它具有多粒度锁定.
对于分析,MongoDB提供自定义map/reduce实现; Cassandra提供本机Hadoop支持,包括Hive(基于Hadoop map/reduce构建的SQL数据仓库)和Pig(许多人认为特定于Hadoop的分析语言比SQL更适合映射/减少工作负载).Cassandra还支持使用Spark.
不担心"大规模"的可扩展性
如果您正在查看单个服务器,MongoDB可能更适合.对于那些更关心扩展的人来说,Cassandra的无单点故障架构将更容易设置和更可靠.(MongoDB的全局写锁定也会变得更加痛苦.)Cassandra还可以更好地控制复制的工作方式,包括支持多个数据中心.
更关注简单的设置,维护和代码
两者都很容易设置,单个服务器具有合理的开箱即用默认值.由于不需要担心特殊角色节点,因此在多服务器配置中设置Cassandra更加简单.
如果您目前正在使用JSON blob,那么MongoDB对于您的用例非常适合,因为它使用BSON来存储数据.与现有数据库相比,您将能够获得更丰富,更易查询的数据.这将是Mongo最重要的胜利.
每次查询都有大量读取,常规写入次数较少
两个数据库在热数据集适合内存的读取中表现良好.两者都强调无连接数据模型(并鼓励非规范化),并且都提供文档或行的索引,尽管MongoDB的索引目前更灵活.
无论您的数据集有多大,Cassandra的存储引擎都能提供恒定时间写入.在MongoDB中写入更有问题,部分原因是基于b树的存储引擎,但更多是因为它具有多粒度锁定.
对于分析,MongoDB提供自定义map/reduce实现; Cassandra提供本机Hadoop支持,包括Hive(基于Hadoop map/reduce构建的SQL数据仓库)和Pig(许多人认为特定于Hadoop的分析语言比SQL更适合映射/减少工作负载).Cassandra还支持使用Spark.
不担心"大规模"的可扩展性
如果您正在查看单个服务器,MongoDB可能更适合.对于那些更关心扩展的人来说,Cassandra的无单点故障架构将更容易设置和更可靠.(MongoDB的全局写锁定也会变得更加痛苦.)Cassandra还可以更好地控制复制的工作方式,包括支持多个数据中心.
更关注简单的设置,维护和代码
两者都很容易设置,单个服务器具有合理的开箱即用默认值.由于不需要担心特殊角色节点,因此在多服务器配置中设置Cassandra更加简单.
如果您目前正在使用JSON blob,那么MongoDB对于您的用例非常适合,因为它使用BSON来存储数据.与现有数据库相比,您将能够获得更丰富,更易查询的数据.这将是Mongo最重要的胜利.
我已经广泛使用了MongoDB(过去6个月),构建了一个分层数据管理系统,我可以保证设置的简易性(安装,运行,使用它!)和速度.只要你仔细考虑索引,它就可以绝对地尖叫,速度方面.
我认为Cassandra由于其在Twitter等大型项目中的使用,具有更好的扩展功能,尽管MongoDB团队正在努力实现平价.我应该指出,我没有在试运行阶段之外使用Cassandra,所以我不能说明细节.
当我们评估NoSQL数据库时,真正的摇摆人是查询 - Cassandra基本上只是一个巨大的键/值存储,查询有点繁琐(至少与MongoDB相比),所以对于性能你必须将很多数据复制为一种手动索引.另一方面,MongoDB使用"按示例查询"模型.
例如,假设您有一个包含Users的Collection(MongoDB用于等效于RDMS表的用语).MongoDB将记录存储为Documents,它们基本上是二进制JSON对象.例如:
{ FirstName: "John", LastName: "Smith", Email: "john@smith.com", Groups: ["Admin", "User", "SuperUser"] }
如果您想要找到所有名为Smith的用户拥有管理员权限,您只需创建一个新文档(使用Javascript在管理控制台上,或使用您选择的语言在生产中):
{ LastName: "Smith", Groups: "Admin" }
...然后运行查询.而已.有用于比较增加运营商,正则表达式过滤等,但是这一切都非常简单,基于wiki的文档是相当不错的.
为什么要在传统数据库和NoSQL数据存储之间进行选择?同时使用!NoSQL解决方案的问题(超出最初的学习曲线)是缺少事务 - 您对MySQL进行了所有更新,并让MySQL填充NoSQL数据存储区进行读取 - 然后您将从每项技术的优势中受益.这确实增加了更多的复杂性,但你已经拥有MySQL方面 - 只需添加MongoDB,Cassandra等.
对于相同的规范,NoSQL数据存储通常比传统数据库更好地扩展 - 有一个原因,Facebook,Twitter,谷歌和大多数初创公司都在使用NoSQL解决方案.这不只是极客们对新技术的高度重视.
我可能会成为一个奇怪的人,但我认为你需要留在MySQL.您还没有描述需要解决的实际问题,即使对于blob/json数据,MySQL/InnoDB也是一个出色的存储后端.
Web实现中有一个常见的伎俩,即一旦实现并未使用RDBMS的所有功能,就会尝试使用更多的NoSQL.仅此一点并不是一个好理由,因为大多数情况下NoSQL数据库的数据引擎相当差(MySQL称之为存储引擎).
现在,如果您不是那种类型,那么请指明MySQL中缺少的内容并且您正在寻找不同的数据库(例如,自动分片,自动故障转移,多主复制,以及较弱的数据一致性保证)群集在更高的写入吞吐量等方面得到了回报.
我没有使用过Cassandra,但是我使用过MongoDB并认为它很棒.
如果您正在进行简单的设置,那么就是这样:您只需解压MongoDB并运行mongod守护程序就可以了......它正在运行.
显然这只是一个首发,但为了让你开始它很容易.
我昨天在mongodb上看过一个演讲.我可以肯定地说,设置是"简单的",就像打开包装并将其启动一样简单.完成.
我相信mongodb和cassandra几乎可以在任何常规的Linux硬件上运行,所以你不应该在那个领域找到很多障碍.
我想在这种情况下,在一天结束的时候,你会发现自己感觉更舒服,哪个有你喜欢的工具集.至于关于mongodb的演示,主持人表示mongodb的工具集很轻,并且没有很多(他们说的任何真正的)工具类似于可用于MySQL的工具.这当然是他们的体验,所以YMMV.我对mongodb所做的一件事就是它似乎有很多语言支持(Python和.NET是我主要使用的两种语言).
使用mongodb的网站列表非常令人印象深刻,我知道twitter刚刚切换到使用cassandra.