提到NoSQL数据库,MongoDB和Cassandra都是各自领域里面的佼佼者,同时又但不适用于交易数据(即记账系统)。
在本文中我们将花些时间对二者进行对比,然后基于我们的业务需求,看如何选择
db-engines ranking排名
可以看到二者热度非常高,都是比较优秀的产品,Mongodb专注于文档领域,cassandra专注于宽表领域
谁使用这些数据库?
Cassandra和MongoDB两者都有强大的追随者,其中都不乏一些大牌用户
- Cassandra: Cassandra,于2008年发布,已被许多组织使用,包括Apple, AppScale,Constant Contact,Digg,Facebook,IBM,Instagram,Spotify,Netflix和Reddit。
- MongoDB: 2009年发布的MongoDB已被许多组织使用,包括。Google,UPS,Facebook,思科,eBay,BOSH,Adobe,SAP,福布斯等等。您可以在此处查看完整列表:https://www.mongodb.com/who-uses-mongodb。、
数据库背后的公司
Cassandra: Avinash Lakshman和Prashant Malik在Facebook开发了Cassandra,用于Facebook收件箱搜索功能。Facebook于2008年7月发布了Cassandra作为开源项目。最初的开发人员从特洛伊神话先知Cassandra那里得到了该项目的名称。Apache Software Foundation目前维护该项目。
MongoDB: MongoDB于2007年由10gen创建,它创建了基于“humongous”一词的产品。2009年发布,10gen后来改名为MongoDB.Inc,提供软件开发并销售其企业解决方案。
如何选取
上文可看出cassandra,mongodb都是非常不错的产品,有大量商业公司在用,并且在数百款数据库产品里面名列前茅,那我们接下来看下对二者该如何进行选择。
- cassandra专注于解决宽表领域大数据存储需求
- mongodb专注于解决文档领域大数据存储需求
我们先看看二者差异
差异
我们从接口层面能更直观看出它们的区别
接口差异
- 从客户表中选择记录:
cassandra: ‘SELECT * FROM customer;’
MongoDB: ‘db.customer.find()’
- 将记录插入到customer表中:
cassandra: ‘INSERT INTO customer (custid, branch, status) VALUES('appl01', 'main', 'A');’
MongoDB: ‘db.customer.insert({ cust_id: 'appl01', branch: 'main', status: 'A' })’
- 更新customer表中的记录:
cassandra: ‘UPDATE Customer SET branch = ‘main' WHERE custage > 2;’
MongoDB: ‘db.customer.update( { custage: { $gt: 2 } }, { $set: { branch: 'main' } }, { multi: true } )’
可以看出:c*提供类sql语言cql,mongodb提供文档语法,但由于sql的流行,cassandra的cql还是学习成本更低一些的
强模式 vs 无模式
- cassandra是强模式的,需要预定义好schema,不能直接写入数据。当然需要指出来,cassandra有宽表的灵活性,可以动态修改列名,列类型,这在关系型数据库里面是做不到的。
- mongoDB是schema-free的,无需预定义schema,可直接写入文档,作为文档数据库有更大的灵活性,这是cassandra比不了的,所以非常适合尝试新事物,快速迭代。
查询能力及索引比较
- Cassandra:在Cassandra中,不完全支持多个二级索引; 二级索引先查找主键,再拿到行数据,效率稍差,建议使用主键进行查询。
- MongoDB:MongoDB中首选索引,直接索引文档数据位置。索引能力更强,其强大的查询系统使您可以很好地利用基于位置的数据,内置的空间功能允许您从特定位置提取数据,投入使用。
群集副本复制比较
- Cassandra: Cassandra开箱即用。您只需要告诉它写几副本,它负责做剩下的事。
Cassandra允许在挂掉某个节点情况下,多个剩余副本仍然允许你继续写群集。这表示拥有更好的容错性,而MongoDB则需要10到40秒的停机时间。
- MongoDB:MongoDB具有内置的副本复制,带有自动选举功能。这需要你设置可在主数据库不可用时自动接管备用数据库。但是,MongoDB需要一些设置来达到复制。MongoDB具有副本集,其中一个成员是主,而所有其他副本是从副本。读写首先提交到主副本,然后复制到从副本。
MongoDB有一个集中式主,当选举发生时,它可能需要花费10到40秒才能结束,这种情况时,您无法写入集群。
差异点总结
cassandra
- Cassandra甚至可以处理最庞大的数据集。Instagram每天平均处理8000万张照片,而Spotify则在其数据库中存储超过2000万首歌曲
- Cassandra有这令人惊讶的可靠性,Cassandra使用点对点容错技术,无主/从设置,故障转移或领导者选举。这意味着可以委派群集中的任何节点,以便在发生故障时执行查询。
- 最终的一致性产生高可用。cassandra倾向于降低一致性。它是“最终一致的 ”,用于设置数据库一致性模型。最终的一致性可以实现高可用性,而不是保持强一致性,从而实现更低的延时,更高的可用性,而不是立即向所有服务器上同步数据。
- 扩容时最小化管理任务
mongoDB
- 文档型数据库,提供令人叹为观止的灵活性
- 高性能,高可用,自动扩容
- Cassandra相对简约,mongoDB功能更加强大,强大的查询能力
- 因为模型扩展性好,能更快尝试新东西
如何选择?哪个数据库更适合您的业务?
- Cassandra: Cassandra最大的优势之一是它在保持可用性的同时具有扩展能力。在多个服务器的情况下部署Cassandra,无需额外的工作。部分原因是因为Cassandra使用最少的配置,因此非常容易配置。
如果您需要一个易于设置和维护的数据库,无论您的数据库增长多少,Cassandra都是一个不错的选择。如果您需要快速扩容,Cassandra可以比MongoDB更好的快速工作。
- MongoDB:如果您需要实时分析的能力,强大的查询能力,MongoDB是一个很好的选择; 但是它不是为交易数据而构建的。MongoDB经常用于移动应用程序,内容管理,实时分析以及涉及物联网的应用程序。如果您的数据是无结构的,没有明确的模式定义(schema definition),MongoDB是一个不错的选择。
如果您正在对数据库模式进行反规范化,则可以使用MongoDB文档来存储非结构化数据,这种方式更易于更新。在写入负载很高的情况下,MongoDB表现不错,提供很高的插入效率。
总结
最后以下表中的对比,结束本文。
微信群和钉钉群交流
为了营造一个开放的 Cassandra 技术交流,我们建立了微信群和钉钉群,为广大用户提供专业的技术分享及问答,定期在国内开展线下技术沙龙,专家技术直播,欢迎大家加入。
钉钉群入群链接:https://c.tb.cn/F3.ZRTY0o