提到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表現不錯,提供很高的插入效率。
總結
最後以下表中的對比,結束本文。
摘自:
https://www.upwork.com/hiring/development/mongodb-vs-cassandra/微信群和釘釘群交流
為了營造一個開放的 Cassandra 技術交流,我們建立了微信群和釘釘群,為廣大使用者提供專業的技術分享及問答,定期在國内開展線下技術沙龍,專家技術直播,歡迎大家加入。
釘釘群入群連結:
https://c.tb.cn/F3.ZRTY0o