Cassandra 和 MongoDB 有何區別?
Apache Cassandra 和 MongoDB 是兩個以非資料表格式儲存資料的 NoSQL 資料庫。Cassandra 是一種早期的 NoSQL 資料庫,採用資料表和鍵/值儲存之間的混合設計。此資料庫專為需要快速讀寫效能的應用程式儲存資料而設計。相比之下,MongoDB 是專為一般用途建置的文件資料庫。該資料庫具有靈活的資料模型,允許您以優化 JSON 格式 (稱為二進位 JSON 或 BSON) 來儲存非結構化資料。MongoDB 資料庫提供完整的索引支援,並使用豐富且直覺化的 API 進行複寫。
Cassandra 和 MongoDB 之間有什麼相似之處?
Apache Cassandra 和 MongoDB 都屬於 NoSQL 資料庫群組。NoSQL 資料庫可以存放沒有資料庫結構描述的結構化、非結構化和半結構化資料。
與傳統的關聯式資料庫管理系統不同,NoSQL 資料庫中的資料儲存不受資料表格式和資料表之間的關係限制。您可以跨多個節點對資料進行自由分區和複寫,以有效進行擴展。
此外,Cassandra 和早期版本的 MongoDB 均為開放原始碼。這意味著您可以下載這些 NoSQL 資料庫的原始程式碼,並根據需要進行設定。
Facebook 開發 Cassandra,然後將其作為開放原始碼專案與 Apache 一同發行。MongoDB 是由 MongoDB, Inc. 的一小群開發人員開發的。在 2018 年 10 月 16 日之前發行的所有 MongoDB 版本都可以根據 GNU Affero General Public License 提供。
資料模型差異:Cassandra 與MongoDB
雖然 MongoDB 和 Apache Cassandra 都是 NoSQL 資料庫,但兩者會以不同方式存放和管理資料。
Cassandra
Cassandra 將資料儲存為鍵值存放區。其可讓您定義含資料列和資料欄的資料表,但實際儲存中不會使用表格式結構。反之,其使用的是寬欄位式資料庫模型,因此資料表中的每一列都可以有不同的資料欄集。
您可以根據其資料類型或用量將資料欄分組為資料欄系列。每一個資料列都有一個主索引鍵,您可以用其來從 Cassandra 快速讀取資料。
Apache Cassandra 資料表結構可在下面的範例中視覺化。
客戶 id 1 | 資料欄 – 名稱 |
資料欄 – 國家/地區 |
|
值 – John Doe |
值 – 美國 |
||
客戶 id 2 | 資料欄 – 名稱 |
資料欄 – 年齡 |
資料欄 – 電子郵件 |
值 – Jane Doe |
值 – 35 |
MongoDB
相比之下,MongoDB 會使用優化的二進位 JSON (BSON) 格式來存放資料,而不使用結構描述。其可以在單個文件中存放多種類型 (類似於 JSON 物件),然後使用 BSON 對其進行序列化。
MongoDB 將文件整理至可包含具有不同結構之資料的集合中。其資料模型非常靈活,可以處理大量的非結構化資料。
以下是 MongoDB 中的客戶資料範例。
customers:[ { customer_id: "1", name: “John Doe”, country: "United States" }, { customer_id: "2", age: “35” email: "[email protected]" }] |
架構差異:Cassandra 與MongoDB
由於在他們的資料模型存在差異,Cassandra 和 MongoDB 以不同方式實作了多個資料庫功能。
儲存的基本單元
在 Cassandra 中,排序的字串資料表 (SSTables) 是將資料儲存磁碟上的基本單元。SSTable 是包含針對特定資料欄系列 (資料表) 和資料分區的已排序鍵值對集的檔案。SSTables 是不可變的,這意味著只要將其寫入,則無法進行修改。
在 MongoDB 中,儲存的基本單元是文件。文件是一組鍵值對,其中鍵是字串,而值可以是各種類型。例如,值可以是其他文件、陣列、字串、數字、日期和布林值。文件以集合形式進行存放。
查詢語言
查詢語言是您用來從資料庫中插入和擷取資料的陳述式。
Cassandra Query Language (CQL) 是您在 Cassandra 使用的查詢語言。雖然它有與 SQL 類似的語法和結構,但 Apache 開發了 CQL 來處理資料欄列系列資料模型。
在另一方面,MongoDB 使用具有與 Node.js 類似命令的 MongoDB Query Language (MQL)。MQL 支援建立、讀取、更新和刪除 (CRUD) 操作。您可以在 MongoDB Shell 上撰寫 MQL 命令。
索引
索引是在資料庫中使用的技術,可提高資料檢索操作的速度和效率。它涉及建立資料結構,該結構可將資料庫表中的一個或多個資料欄的值映射到磁碟上相應資料的實體位置。
Cassandra 支援兩種索引類型:
- 個別資料欄的次要索引
- 多個資料欄上的 SSTable 連接次要索引 (SASI) 索引
SASI 索引會直接將索引資料存放在 SSTable 中。其支援複雜的查詢,例如範圍、字首和對具有大量唯一值的資料欄進行全文搜尋。
相比之下,MongoDB 支援集合層級和欄位層級的索引。它提供了多種索引類型,如單一欄位、化合物和多鍵。它還提供了以下索引:
- 分散於不同地理位置之資料的專用空間索引
- 大量文字資料的文字搜尋索引
- 數值資料的雜湊和叢集索引
並行
在資料庫中,並行是指多個使用者或程序可以同時存取和執行資料庫交易,而不會互相干擾。
Cassandra 可透過轉盤一致性和資料列層級不可部分完成性實現並行。一次只有一個使用者可以對單一資料列進行操作。
在轉盤一致性中,每個複本節點維護一個向量時脈,這是一種資料結構,可用於追蹤關聯資料的版本歷史記錄。執行寫入操作時,向量時脈會更新以反映新版本。當執行讀取操作時,Cassandra 會傳回所有複本中具有最高時間戳記的版本,這樣一來,可確保始終傳回資料的最新版本。
相比之下,MongoDB 支援多版本並行控制 (MVCC) 的機制。MVCC 允許同時存在相同資料文件的多個版本。每個文件都有一個唯一的修訂版本 ID,該 ID 會在每次更新時遞增。文件層級鎖定和 MVCC 可提供更強大的並行策略。
可用性
可用性表示您可確保即使發生伺服器故障,也不會出現資料停機。Cassandra 和 MongoDB 可跨多個伺服器節點複寫資料,進而確保可用性。
在 Apache Cassandra 中,叢集中的每個節點保留有其他節點的資料複本。每個節點坐標讀取到正確的節點,以寫入或擷取資料。同時,它還可以修復節點之間不一致的資料。這可能會影響大規模效能。
相比之下,MongoDB 使用單一主節點複寫來提供高資料可用性。MongoDB 可將資料複寫至複本集中。只有一個主節點接收寫入,而其他節點只是從主節點複寫資料。但是,主節點會建立單一故障點。
可擴展性
Cassandra 和 MongoDB 允許執行碎片化,這是一種可在叢集中跨多個節點對資料進行水平分區的技術。例如,如果您有成千上萬的客戶,您可以對資料進行分區,以便每個節點只有幾百位客戶的資訊。這樣您就可以擴展資料庫而不會造成瓶頸。
Cassandra 使用稱為一致雜湊的分散式雜湊演算法,以確定由哪個節點負責特定資料值。Cassandra 還可支援虛擬節點 (vnodes),其允許單一實體節點擁有多個資料範圍。
相比之下,MongoDB 使用碎片鍵來識別資料值的去處。資料庫管理員可以定義碎片化鍵,以對資料進行分區。您可以根據地理位置、字母順序或任何其他對資料集最有效的系統等因素來拆分資料。
何時使用 Cassandra 與MongoDB
Cassandra 具有高正常運作時間和分散式架構,因此成為高可用性需求的理想選擇。MongoDB 能夠使用文件導向方法來處理非結構化資料,因此其對資料不斷變化的系統非常有用。
當您在這兩者之間進行選擇時,需要考慮下列幾個因素。
資料格式
Apache Cassandra 擁有比 MongoDB 更加結構化的資料儲存系統。如果您正在使用的資料是固定格式,則 Cassandra 更為適合。
如果資料更動態並且沒有一致的結構,則 MongoDB 效果更好。
可用性
MongoDB 有一個主節點,然後是一系列的複本。如果主節點發生故障,則 MongoDB 需要幾分鐘時間來選擇替代的複本節點。這可能會導致少量的停機時間。
Cassandra 使用具有許多主節點的分散式節點系統,可實現 100% 的正常運作時間可用性。
可擴展性
MongoDB 讓您可以更好地控制您的擴展。您可以根據自己的需求決定如何跨節點對資料進行分區,以及大規模管理規模化的分散式資料庫。
Cassandra 的效能可能會按比例略有降低,具體視資料值而定。
查詢語言
Cassandra Query Language (CQL) 和 MongoDB Query Language (MQL) 是極其高效的查詢語言。但是,CQL 更類似於 SQL,如果您已經精通 SQL,則您可輕鬆使用 CQL。
MQL 具有不同的實作和語法,並且可能能夠更快速地學習掌握。
支援程式設計語言
MongoDB 可支援十二種程式設計語言:C、C++、C#、Go、Java、Node.js、PHP、Python、Ruby、Rust、Scala 和 Swift。
Cassandra 可支援的語言較少,例如 Java、JavaScript、Perl、Ruby、Scala、C#、Erlang、PHP、Python 等等。
差異摘要:Cassandra 與MongoDB
Apache Cassandra |
MongoDB |
|
資料模型 |
Cassandra 使用與關聯式資料庫更密切相關的寬欄型資料模型。 |
MongoDB 可將資料作為文件存放,進而可以完全擺脫關聯式模型。 |
基本儲存單元 |
排序的字串資料表。 |
序列化的 JSON 文件。 |
索引 |
Cassandra 支援次要索引和 SASI 依欄索引。 |
MongoDB 可在集合層級和欄位層級執行索引,並提供多個索引選項。 |
查詢語言 |
Cassandra 使用 CQL。 |
MongoDB 使用 MQL。 |
並行 |
Cassandra 藉助資料列層級不可部分完成性和轉盤一致性實現並行。 |
MongoDB 使用 MVCC 和文件層級鎖定,以確保並行。 |
可用性 |
Cassandra 具有多個主節點、節點分區和鍵複寫,可提供高可用性。 |
MongoDB 使用一個單一主節點和多個複本節點。與碎片化相結合,MongoDB 可提供高可用性和可擴展性。 |
資料分割 |
一致雜湊演算法,可減少對使用者的控制。 |
使用者定義碎片化鍵並可更好地控制分區。 |
AWS 如何支援您的 Cassandra 和 MongoDB 需求?
Amazon Web Services (AWS) 提供兩種服務,可支援常見的 Apache Cassandra 和 MongoDB 需求。
Amazon Keyspaces (適用於 Apache Cassandra) 是一種高可用性的受管資料庫,可讓您將 Cassandra 工作負載移至雲端。Amazon Keyspaces 是無伺服器服務,因此,您只需對所用的資源付費,該服務可自動根據應用程式流量擴展和縮減資料表。您可以建置每秒服務數千個請求的應用程式,輸送量和儲存幾乎無限制。
Amazon DocumentDB (with MongoDB compatibility) 是全受管原生 JSON 文件資料庫。其可讓您輕鬆且經濟實惠地以幾乎任何規模操作關鍵文件工作負載,而無需管理基礎架構。Amazon DocumentDB 提供內建的安全最佳實務、持續備份以及與其他 AWS 服務的原生整合,藉此簡化架構。
立即建立 AWS 帳戶,開始在 AWS 上使用受管 Apache Cassandra 和 MongoDB 資料庫服務。