我正在评估什么是最好的迁移选项。
目前,我在一个分片的mysql(水平分区)上,我的大部分数据存储在json blobs中。我没有任何复杂的SQL查询(自从我对数据库进行分区之后就已经迁移了)。
现在看来,MongoDB和Cassandra都是可能的选择。我的处境:
- 每一个查询中都有大量的读取,较少的常规写入
- 不担心"大规模"可扩展性
- 更关注简单的设置、维护和代码
- 最小化硬件/服务器成本
- 提供官方的绩效基准统计数据。Cassandra与MongoDB与HBase
- >在每个查询中都有大量的读取,较少的常规写入=>查找CQR(可能在没有事件源的情况下将读取与写入分开,但请检查是否可以更新读取模型async)。同步也可能工作。这取决于您的用例)
- 这实际上是个很好的问题。我想知道是否有它的更新版本?这个现在很旧了
每个查询中的读取次数多,常规写入次数少
两个数据库在热数据集适合内存的读取上都表现良好。两者都强调连接较少的数据模型(并鼓励非规范化),并且都在文档或行上提供索引,尽管MongoDB的索引目前更加灵活。
Cassandra的存储引擎提供恒定的时间写入,不管数据集增长多大。在MongoDB中,写入问题更大,部分原因是基于B树的存储引擎,但更多的原因是它的多粒度锁定。
对于分析,MongoDB提供定制的map/reduce实现;Cassandra提供本地Hadoop支持,包括Hive(基于Hadoop map/reduce构建的SQL数据仓库)和Pig(许多人认为Hadoop特定的分析语言比SQL更适合map/reduce工作负载)。卡桑德拉也支持使用火花。
不担心"大规模"可扩展性
如果您只看一台服务器,MongoDB可能更适合。对于那些更关心扩展的人来说,Cassandra的无单点故障架构将更容易设置,更可靠。(MongoDB的全局写锁也会变得更痛苦。)Cassandra还可以对复制的工作方式提供更多的控制,包括对多个数据中心的支持。
更关注简单的设置、维护和代码
这两种设置都很简单,对于单个服务器都有合理的开箱即用默认值。Cassandra在多服务器配置中设置更简单,因为没有需要担心的特殊角色节点。
如果您目前使用的是JSON blobs,那么mongodb非常适合您的用例,因为它使用bson来存储数据。您将能够拥有比当前数据库中更丰富、更可查询的数据。这将是蒙古人最重要的胜利。
- 你所说的"各自的域"是什么意思?你会把它们当作独立的类型吗?谢谢你的回复!
- 完全不同的是,评论不够大,但是…Cassandra是一款线性可扩展(摊余恒定时间读写)的Dynamo/Google Bigtable混合产品,具有快速写入功能,而不考虑数据大小。它的功能集是最低限度的,几乎不超过一个有序的键值存储。MongoDB是一个功能强大(且快速)的文档存储,以牺牲持久性和保证写入持久性(因为它们不会立即写入磁盘)。它们是不同的野兽,具有不同的哲学,MongoDB更接近于RDMS的替代品…
- 虽然Cassandra的级别较低,但允许Uber扩展(请参见twitter/digg/facebook),但由于不允许灵活的查询,因此您必须仔细考虑如何布局数据、构建二级索引等。
- Cassandra如果安装程序不使用集群中的多个节点,那么您将获得类似的读取性能,只有复制因子为3的3个节点将提供类似的性能,因为所有节点都具有所有数据。因此,性能因素无法与MongoDB(如Apple和Apple)进行比较
- 因为这里每个人都提到过Twitter与Cassandra的关系:他们没有使用Cassandra来持续推特,他们仍然使用MySQL(engineering.twitter.com/2010/07/cassandra at twitter today.‌&8203;html)。好吧,但我可以想象,他们仍然在卡桑德拉存储了大量用于其他目的的数据。
- 对于那些希望将JSON存储在blob中,但又想要cassandra的规模的人来说,usergrid项目(github.com/usergrid/stack)是一个在cassandra上分层的JSON存储。每个字段都是隐式索引的,就像在MongoDB中一样。全部开源。您可以自己托管;或者,Apigee提供免费增值托管服务。值得注意的是,Apigee发布了一个演示项目,允许MongoDB客户端将数据存储到UserGrid中,而不做任何更改。(线级协议仿真)
- 似乎在Mongo2.2中删除了全局写锁…
- 值得一提的是,在MongoDB中进行查询时,不能使用多个索引。还不确定卡桑德拉。
- @但在我看来,数据库级别的锁并没有好多少。我听不懂……只有很多情绪。
- 您对在RSS阅读器应用程序中使用MongoDB有何评论?
- MongoDB 2.2.x具有数据库级锁定。但是在2.6.x中,它们已经改变了体系结构,并且在接下来的版本中将支持收集级锁定。
- 甚至在我的项目上线之前,我就感觉到MongoDB的痛点。热备份是基本要求。要在Linux服务器中进行热备份,必须首先设置一个LVM分区(不太常见),并在每次备份会话之前拍摄快照。另一个简单的方法是使用MongoDB付费备份服务。但是,这项服务很昂贵(2.3美元/GB/月)。很快你就需要一个容错的复制集。对于开源版本,节点只能以明文形式交换数据。对于SSL,您必须使用Entprise版本。那是10000美元。再见,MongoDB。将代码重构为Cassandra。
- 现在MongoDB的wired tiger引擎中没有全局写锁。
- 由于MongoDB 3.2,有线老虎存储引擎是默认的,它使用文档级并发进行写入(mmapv2使用收集级并发)
我已经广泛使用MongoDB(在过去的6个月里),构建了一个分层的数据管理系统,并且我可以保证安装的容易(安装它,运行它,使用它!)和速度。只要你仔细考虑索引,它就可以毫无保留地快速前进。
我认为,Cassandra由于与Twitter等大型项目配合使用,具有更好的扩展功能,尽管MongoDB团队正在努力实现对等性。我应该指出,我没有使用卡桑德拉超过试运行阶段,所以我不能说的细节。
当我们评估NoSQL数据库时,我真正感到兴奋的是查询——Cassandra基本上只是一个巨大的键/值存储,而查询有点麻烦(至少与MongoDB相比),因此为了提高性能,您必须复制相当多的数据作为一种手动索引。另一方面,MongoDB使用"示例查询"模型。
例如,假设您有一个包含用户的集合(mongodb的意思是相当于RDMS表)。MongoDB将记录存储为文档,这些文档基本上是二进制JSON对象。例如:
1 2 3 4 5 6
| {
FirstName:"John",
LastName:"Smith",
Email:" [email protected]",
Groups: ["Admin","User","SuperUser"]
} |
如果您想找到所有拥有管理权限的用户Smith,您只需创建一个新文档(在管理控制台上使用javascript,或在生产中使用您选择的语言):
1 2 3 4
| {
LastName:"Smith",
Groups:"Admin"
} |
…然后运行查询。就是这样。有一些用于比较、regex过滤等的附加操作符,但它们都非常简单,基于wiki的文档也非常好。
- 更新(2011年8月8日):亚马逊的爱尔兰EC2数据中心昨晚发生了与闪电有关的事件,在整理我们的服务器恢复时,我发现了一个非常关键的点:如果您有一组由两台服务器组成的复制集(它们很容易设置),请确保您有一个仲裁器节点,因此如果其中一台发生故障,另一台不会惊慌,而且二级模式中的高!相信我,用一个大数据库来解决问题,这是背后的痛苦。
- 要添加@richard k所说的内容,当副本集中有偶数个节点(主节点+辅助节点)时,应该有仲裁节点。
- 此外,当需要对数据分析进行更多聚合时,考虑MongoDB。
为什么要在传统数据库和NoSQL数据存储之间进行选择?两者兼用!NoSQL解决方案的问题(超出了最初的学习曲线)是缺少事务——您对MySQL进行所有更新,并让MySQL填充一个NoSQL数据存储以供读取——然后您可以从每种技术的优势中获益。这确实增加了更多的复杂性,但是您已经有了MySQL端——只需将MongoDB、Cassandra等添加到组合中即可。
对于相同的规范,NoSQL数据存储通常比传统的数据库扩展得更好——这也是Facebook、Twitter、Google和大多数初创企业使用NoSQL解决方案的原因。不仅仅是极客们对新技术越来越感兴趣。
- 我完全同意。我正在将MongoDB+MySQL用于我正在构建的即将推出的产品之一。这是一个即将到来的金融产品云。在我们绝对需要事务功能的地方使用MySQL。MongoDB用于存储非计算复杂的数据结构,这些结构只需要在需要时被提取。到目前为止工作良好。:)
- 我在大多数项目中也使用了这种双重方法,在其他一些项目中,NFS装载的文件系统与PostgreSQL一起使用,在某些情况下,用于处理接近1 GB的地震数据块。路径是到键值数据库的一种查询。
- 下面是一个链接,指向我问的关于如何构建SQL和NoSQL数据库的问题:dba.stackexchange.com/questions/102053/…我可以利用您可能有的一些见解
- 他已经很好地摆脱了事务处理=>现在可以实现无限的可伸缩性。否则->不是:)
- 如果添加mysql,像cassandra那样线性地扩展是很麻烦的。在服务器发生故障后,您可能会遇到单点故障和恢复数据的笨拙方法。
- "您对MySQL进行所有更新,并让MySQL填充一个NoSQL数据存储以供读取"。NoSQL是否针对写入而不是读取而优化?从datastax上的cassandra:"cassandra针对高写吞吐量进行了优化,几乎所有的写操作都同样有效。如果您可以执行额外的写入以提高读取查询的效率,那么这几乎总是一个很好的折衷办法。阅读往往更昂贵,而且更难调整。"
- CQR确实适合这个。
- 如果数据是分布式的,这不是一个好的解决方案
- 从4.0版开始,MongoDB支持具有所有ACID属性的多文档事务。
我可能会成为一个奇怪的人,但我认为你需要留在MySQL。您还没有描述需要解决的实际问题,而且mysql/innodb是一个优秀的存储后端,即使对于blob/json数据也是如此。
在Web工程师中,有一个常见的诀窍,就是一旦意识到并没有使用RDBMS的所有特性,就尝试使用更多的NoSQL。这本身并不是一个很好的理由,因为大多数nosql数据库都有相当差的数据引擎(mysql称之为存储引擎)。
现在,如果您不是这样的人,那么请指定MySQL中缺少的内容,并在不同的数据库中查找(例如,自动切分、自动故障转移、多主机复制、集群中较弱的数据一致性保证,在较高的写吞吐量中获得回报等)。
- 他正在使用切分,这意味着他的数据是在服务器之间手动分区的。MongoDB可以自动化分片,这可能是一个好处。
- 他还在RDBMS中存储了大部分JSON blob,这使得关系设计(features)毫无用处。
- 数据模型和自动切分确实是不同的,但是在选择数据库时,首先需要查看存储引擎,然后查看其余的钟声和哨声。存储引擎在负载峰值下将如何工作?在数据流入峰值下,自动硬处理功能将如何执行?在您放弃对数据库的这些重要方面的控制之前,您最好确保它能够完成任务。
- 关系模型是一种经过深思熟虑、实施效率高、节约成本的数据模型。""将关系设计特性呈现为无用"可能与约束、触发器或引用完整性有关,但这些都是按使用付费的。
我没用过卡桑德拉,但我用过MongoDB,觉得它很棒。
如果您正在进行简单的设置,那么就是这样:您只需解开mongodb并运行mongod守护进程,就这样……它在运行。
显然,这只是一个开始,但要让你开始是很容易的。
- 对于卡桑德拉来说,这同样适用。untar,运行守护进程。测试集群已经设置好,可以投入生产了!
我昨天看了一个关于MongoDB的演示。我可以肯定地说,设置是"简单的",就像打开它并启动它一样简单。完成。
我相信MongoDB和Cassandra几乎可以在任何普通的Linux硬件上运行,所以您不应该在这方面发现太多障碍。
我认为在这种情况下,在一天结束的时候,它将归结为您个人觉得哪个更舒服,哪个有您喜欢的工具集。至于MongoDB的演示,演示者指出MongoDB的工具集很轻,并且有很多(他们说是真的)类似于MySQL的工具。这当然是他们的经验,所以YMMV。我喜欢MongoDB的一点是,它似乎有很多语言支持(Python和.NET是我主要使用的两种语言)。
使用MongoDB的网站列表非常令人印象深刻,我知道Twitter刚刚转向使用Cassandra。
- 一天结束时,苹果和橙子的比较。两个数据库都有各自的优势。这里有一些需要考虑的东西-对象模型、二级索引、写可伸缩性、高可用性等。有一篇博客文章解释了MongoDB和Cassandra之间的高级战略差异-scalegrid.io/blog/cassandra-vs-mongodb