Cassandra と MongoDB の違いは何ですか?
Apache Cassandra と MongoDB は、非表形式でデータを保存する 2 つの NoSQL データベースです。Cassandra は初期の NoSQL データベースで、表形式ストアと key-Value ストアのハイブリッド設計になっています。高速の読み取りと書き込みパフォーマンスを必要とするアプリケーションのデータを格納するために設計されています。対照的に、MongoDB は汎用目的で構築されたドキュメントデータベースです。柔軟なデータモデルを備えているため、バイナリ型 JSON (BSON) と呼ばれる最適化された JSON 形式で非構造化データを保存できます。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 一般公衆利用許諾契約書の下で利用できます。
データモデルの違い: Cassandra とMongoDB
MongoDB と Apache Cassandra はどちらも NoSQL データベースですが、データの保存と管理方法は異なります。
Cassandra
Cassandra はデータを key-value ストアとして保存します。行と列でテーブルを定義することはできますが、実際のストレージでは表形式構造は使用されません。代わりに、広い列指向のデータベースモデルを使用するため、テーブルの各行が異なる列の組を持つことができます。
データタイプや用途に基づいて列ファミリーに列をグループ化できます。各行にはプライマリキーがあり、これを使用して Cassandra からデータをすばやく読み取ることができます。
Apache Cassandra のテーブル構造は、次の例で可視化できます。
お客様 ID 1 | 列 - 名前 |
列 - 国 |
|
値 - John Doe |
値 - 米国 |
||
お客様 ID 2 | 列 - 名前 |
列 - 年齢 |
列 - E メール |
値 - Jane Doe |
値 - 35 |
MongoDB
これに対して、MongoDB は、最適化されたバイナリ JSON (BSON) 形式を使用して、スキーマなしでデータを保存します。JSON オブジェクトと同様に、1 つのドキュメントに複数のデータタイプを保存し、BSON でシリアル化できます。
MongoDB は、ドキュメントをコレクションに整理し、異なる構造を持つデータを含むことができます。そのデータモデルは柔軟性があり、大量の非構造化データを処理できます。
MongoDB の顧客データの例を以下に示します。
お客様:[ { customer_id:「1」、 名前:「John Doe」、 国:「米国」 }, { customer_id:「2」、 年齢:「35」 E メール:「[email protected]」 }] |
アーキテクチャの違い: Cassandra とMongoDB
Cassandra と MongoDB はデータモデルが異なるため、いくつかのデータベース機能の実装方法が異なります。
ストレージの基本単位
Cassandra では、ストレージの基本単位はソートされた文字列テーブル (SSTable) であり、データをディスク上に永続化するために使用されます。SSTable は、特定の列ファミリー (テーブル) とパーティションの key-Value のペアのソートされたセットを含むファイルです。SSTable は不変です。つまり、いったん書き込まれたら変更することはできません。
MongoDB では、ストレージの基本単位はドキュメントです。ドキュメントは key-Value ペアのセットで、キーは文字列で、値にはさまざまなタイプがあります。たとえば、値には他のドキュメント、配列、文字列、数値、日付、ブール値などがあります。ドキュメントはコレクションに保存されます。
クエリー言語
クエリ言語は、データベースからデータを挿入したり取得したりするために使用するステートメントです。
カサンドラクエリ言語 (CQL) は、カサンドラで使用するクエリ言語です。構文と構造は SQL と似ていますが、Apache は列ファミリーのデータモデルで動作するように CQL を開発しました。
一方、MongoDB は MongoDB クエリ言語 (MQL) を使用しており、これには Node.js と同様のコマンドがあります。MQL は、作成、読み取り、更新、削除 (CRUD) オペレーションをサポートしています。MQL コマンドは MongoDB シェルで記述できます。
インデックス作成
インデックス作成は、データ検索操作の速度と効率を向上させるためにデータベースで使用される手法です。これには、データベーステーブルの 1 つ以上の列の値をディスク上の対応するデータの物理的な場所にマップするデータ構造を作成することが含まれます。
Cassandra は次の 2 種類のインデックスをサポートしています。
- 個々の列のセカンダリインデックス
- 複数列の SSTable 接続 セカンダリインデックス (SASI) インデックス
SASI インデックスは、インデックスデータを SSTable に直接格納します。一意の値が多数ある列での範囲、プレフィックス、全文検索などの複雑なクエリをサポートしています。
これに対して、MongoDB はコレクションレベルとフィールドレベルでのインデックス作成をサポートしています。単一フィールド、コンパウンド、マルチキーなど、複数のインデックスタイプが提供されています。また、次のインデックスも提供しています。
- 地理的に分散したデータに特化した地理空間インデックス
- 大量のテキストデータのテキスト検索インデックス
- 数値データ用のハッシュインデックスとクラスター化インデックス
同時実行
データベースにおける並行性とは、複数のユーザーまたはプロセスが互いに干渉することなく同時にデータベーストランザクションにアクセスして実行できることを指します。
Cassandra は、ターンテーブルの一貫性と行レベルのアトミック性によって並行性を実現しています。一度に 1 つの行を操作できるのは 1 人のユーザーだけです。
ターンテーブルの整合性を保つため、各レプリカノードはベクトルクロックを保持します。ベクトルクロックとは、関連データのバージョン履歴を追跡するデータ構造です。書き込み操作を実行すると、ベクトルクロックが更新されて新しいバージョンが反映されます。読み取り操作を実行すると、Cassandra はすべてのレプリカでタイムスタンプが最も長いバージョンを返します。これにより、常に最新バージョンのデータが返されます。
これに対して、MongoDB はマルチバージョン同時実行制御 (MVCC) のメカニズムをサポートしています。MVCC では、同じデータドキュメントの複数のバージョンを同時に存在させることができます。各ドキュメントには一意のリビジョン ID が割り当てられ、更新のたびに番号が増加します。ドキュメントレベルのロックと MVCC は、より強固な同時実行戦略を提供します。
可用性
可用性とは、サーバーが停止しているときでもデータのダウンタイムがないことを意味します。Cassandra と MongoDB はどちらも、複数のサーバーノードにデータを複製することで可用性を確保します。
Apache Cassandra では、クラスター内の各ノードが他のノードのデータレプリカを保持します。各ノードは、正しいノードへの読み取りを調整してデータを書き込んだり取り込んだりします。同時に、ノード間で一貫性がなくなったデータも修復します。これは大規模なパフォーマンスに影響を与える可能性があります。
これに対して、MongoDB は単一のプライマリノードレプリケーションを使用して高いデータ可用性を実現します。MongoDB はデータをレプリカセットに複製します。1 つのプライマリノードのみに書き込まれ、他のノードはプライマリノードからデータを複製するだけです。ただし、プライマリノードでは単一障害点が発生します。
スケーラビリティ
Cassandra と MongoDB はどちらも、クラスター内の複数のノードにデータを水平に分割する技術であるシャーディングが可能です。たとえば、数千の顧客がいる場合、データを分割して、各ノードに数百の顧客の情報しか格納しないようにします。そうすることにより、ボトルネックを引き起こすことなくデータベースをスケーリングできます。
Cassandra では、コンシステントハッシュと呼ばれる分散ハッシュアルゴリズムを使用して、どのノードが特定のデータ値を担当しているかを判断します。Cassandra では仮想ノード (vnode) もサポートしています。これにより、1 つの物理ノードに複数のデータ範囲を持たせることができます。
これに対して、MongoDB はシャーディングキーを使用してデータ値の格納先を特定します。データベース管理者は、データを分割するためのシャーディングキーを定義できます。地理的位置、アルファベット順、またはデータセットにとって最も効率的なその他のシステムなどの要素に基づいてデータを分割できます。
使用タイミング、Cassandra とMongoDB
Cassandra は高い稼働率と分散アーキテクチャを備えているため、高可用性要件に適しています。MongoDB は非構造化データをドキュメント指向のアプローチで処理できるため、データが絶えず変化しているシステムに役立ちます。
2 つのいずれかを選択するにあたって考慮すべき要素を以下に紹介します。
データ形式
Apache Cassandra は、MongoDB よりも構造化されたデータストレージシステムを備えています。扱うデータが固定形式であれば、Cassandra の方が適しています。
データがより動的で、構造が一貫していない場合には、MongoDB の方が適しています。
可用性
MongoDB にはプライマリノードと一連のレプリカがあります。プライマリノードがダウンした場合、MongoDB は代替するレプリカノードの選択に数分を費やします。これにより、わずかなダウンタイムが発生する可能性があります。
Cassandra は、多数のマスターノードを備えた分散ノードシステムを使用しているため、100% の稼働率を実現しています。
スケーラビリティ
MongoDB では、スケールに応じてより細かく制御できます。要件に応じてノード間のデータ分割方法を決定し、大規模な分散データベースを自在に管理することができます。
Cassandra のパフォーマンスは、データ値によってはスケール時にわずかに低下することがあります。
クエリー言語
Cassandra クエリ言語 (CQL) と MongoDB クエリ言語 (MQL) はどちらも非常に有効なクエリ言語です。ただし、CQL の方が SQL と非常に似ているため、すでに SQL に習熟している方であれば CQL を簡単に使用することができます。
MQL は実装や構文が異なるため、習得に時間がかかる場合があります。
プログラミング言語のサポート
MongoDB は、以下の 12 のプログラミング言語をサポートしています: 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 をサポートし、1 つまたは複数の列でインデックスを作成します。 |
MongoDB はコレクションレベルとフィールドレベルでインデックスを作成し、複数のインデックスオプションを提供します。 |
クエリー言語 |
Cassandra は CQL を使用しています。 |
MongoDB は MQL を使用しています。 |
同時実行 |
Cassandra は、行レベルのアトミック性とターンテーブルの一貫性を備えた同時実行性を実現しています。 |
MongoDB は MVCC とドキュメントレベルのロックを使用して同時実行性を確保しています。 |
可用性 |
Cassandra には複数のマスターノード、ノードパーティショニング、キーレプリケーションがあり、高い可用性を実現しています。 |
MongoDB は、1 つのプライマリノードと複数のレプリカノードを使用します。シャーディングと組み合わせることで、MongoDB は高い可用性とスケーラビリティを実現します。 |
パーティション |
コンシステントハッシュアルゴリズムで、ユーザーによる制御を軽減します。 |
ユーザーはシャーディングキーを定義し、パーティショニングをより細かく制御できます。 |
AWS は Cassandra と MongoDB の要件をどのようにサポートできますか?
Amazon Web Services (AWS) は、Apache Cassandra と MongoDB の一般的な要件をサポートする 2 つのサービスを提供しています。
Amazon Keyspaces (Apache Cassandra 向け) は、Cassandra ワークロードをクラウドに移行できる可用性の高いマネージドデータベースです。Amazon Keyspaces はサーバーレスであるため、使用するリソースのみに支払いが発生し、サービスはアプリケーショントラフィックに応じてテーブルを自動的にスケールアップおよびスケールダウンできます。事実上無制限のスループットとストレージで毎秒数千のリクエストに対応するアプリケーションを構築できます。
Amazon DocumentDB (MongoDB 互換) はフルマネージド型のネイティブ JSON ドキュメントデータベースです。その使用により、インフラストラクチャを管理しなくても、実質的にどのような規模でも重要なドキュメントワークロードを簡単かつ費用対効果の高い方法で運用できます。Amazon DocumentDB では、組み込みのセキュリティに関するベストプラクティス、継続的なバックアップ、および他の AWS サービスとのネイティブ統合を利用でき、アーキテクチャーを簡素化できます。
今すぐ AWS アカウントを作成して、AWS で Managed Apache Cassandra および MongoDB データベースサービスの使用を開始しましょう。