MongoDB対Cassandra [終了]


738

最適な移行オプションは何かを評価しています。

現在、私は分割されたMySQL(水平パーティション)を使用しており、ほとんどのデータはJSONブロブに格納されています。複雑なSQLクエリはありません(dbをパーティション分割してから既に移行されています)。

現時点では、MongoDBとCassandraの両方がオプションのようです。私の状況:

  • すべてのクエリで大量の読み取りを行い、通常の書き込みを減らす
  • 「大規模な」スケーラビリティについて心配していません
  • 簡単なセットアップ、メンテナンス、コードについてもっと心配
  • ハードウェア/サーバーのコストを最小限に抑える

4
公式のパフォーマンスベンチマーク統計が利用可能です。Cassandra対MongoDB対HBase
Ravi

1
>すべてのクエリでの読み取りが多く、定期的な書き込みが少ない=> CQRSを探す(おそらくイベントソースを使用せずに読み取りと書き込みを分離しますが、読み取りモデルを非同期で更新できるかどうかを確認してください..同期も機能する可能性があります.. -cases)
ボドリン

2
これは実に素晴らしい質問です。更新されたバージョンがあるかしら?これは非常に古いものです
slashdottir 2018

回答:


584

すべてのクエリで大量の読み取り、通常の書き込みが少ない

どちらのデータベースも、ホットデータセットがメモリに収まる読み取りでうまく機能します。どちらも、結合のないデータモデルを強調し(代わりに非正規化を推奨)、両方ともドキュメントまたは行にインデックスを提供しますが、MongoDBのインデックスは現在より柔軟です。

Cassandraのストレージエンジンは、データセットがどれほど大きくなっても、一定時間の書き込みを提供します。MongoDBでの書き込みは、Bツリーベースのストレージエンジンが原因の場合もあるが、それが行う複数の粒度のロックが原因で、さらに問題が多い。

分析のために、MongoDBはカスタムのmap / reduce実装を提供します。Cassandraは、Hive(Hadoop map / reduce上に構築されたSQLデータウェアハウス)およびPig(多くの人がSQLよりもmap / reduceワークロードに適していると考えるHadoop固有の分析言語)を含む、ネイティブHadoopサポートを提供します。CassandraはSparkの使用もサポートしています。

「大規模な」スケーラビリティについて心配していません

単一のサーバーを表示している場合は、MongoDBが適しています。スケーリングについてもっと心配する人にとって、Cassandraの単一障害点のないアーキテクチャは、セットアップが簡単で信頼性が高くなります。(MongoDBのグローバルな書き込みロックもより困難になる傾向があります。)また、Cassandraは、複数のデータセンターのサポートを含め、レプリケーションの動作をより詳細に制御できます。

簡単なセットアップ、メンテナンス、コードについてもっと心配

どちらも簡単にセットアップでき、単一サーバーのデフォルトの妥当なデフォルトが設定されています。気にする特別な役割のノードがないため、Cassandraはマルチサーバー構成でのセットアップが簡単です。

現在JSONブロブを使用している場合、MongoDBはBSONを使用してデータを格納することを考えると、ユースケースに非常に適しています。現在のデータベースよりも豊富でクエリ可能なデータを使用できます。これはモンゴにとって最も重要な勝利でしょう。


86
まったく異なる、コメントは十分な大きさではありませんが、... Cassandraは線形にスケーラブル(一定時間の読み取りと書き込みを償却)のdynamo / google bigtableハイブリッドであり、データサイズに関係なく高速な書き込みを特徴とします。その機能セットは最小限であり、順序付けられたキー値ストアの機能セットを少し超えています。MongoDBは、機能性が高く(かつ高速)なドキュメントストアであり、耐久性を犠牲にして、書き込みが永続化されることを保証します(書き込みはすぐにはディスクに書き込まれないため)。彼らは異なる哲学を持つ異なる獣であり、MongoDBはRDMSの代替に近い...
Michael

28
Cassandraはより低いレベルですが、超スケーリングを可能にしますが(Twitter / Digg / Facebookを参照)、柔軟なクエリが許可されていないため、データのレイアウト、セカンダリインデックスの構築などについて慎重に行う必要があります。
マイケル、

11
誰もがここでCassandraに関してTwitterについて言及しているため、ツイートを永続化するためにCassandraを使用していないため、ここではMySQLを引き続き使用しています(engineering.twitter.com/2010/07/cassandra-at-twitter-today.html)。わかりましたが、Cassandraには他の目的のために多くのデータがまだ保存されていると想像できます。
H6。

7
Mongo 2.2でグローバル書き込みロックが削除されたようです...
Matt Farmer、

16
プロジェクトが稼働する前でも、Mongodbの問題点を感じています。ホットバックアップは基本的な要件です。Linuxサーバーでホットバックアップを行うには、最初にLVMパーティション(それほど一般的ではない)をセットアップし、すべてのバックアップセッションの前にスナップショットを作成する必要があります。別の簡単な方法は、Mongodb有料バックアップサービスを使用することです。しかし、そのサービスは高価です(2.3 $ / GB /月)。すぐに、フォールトトレランスのためのレプリカセットが必要になります。オープンソースバージョンでは、ノードはクリアテキストとしてのみデータを交換できます。SSLの場合は、Entpriseエディションを使用する必要があります。そして、それは10,000ドルです。さようならMongodb。コードをCassandraにリファクタリングします。
Karthik Sankar、2014年

146

私は(過去6か月間)MongoDBを広範囲に使用して、階層的なデータ管理システムを構築しており、セットアップの容易さ(インストール、実行、使用!)と速度の両方を保証できます。インデックスについて注意深く考える限り、速度的には絶叫することができます。

Cassandraは、Twitterのような大規模プロジェクトで使用されているため、より優れたスケーリング機能を備えていますが、MongoDBチームはそこで同等に取り組んでいます。私は試用段階を超えてCassandraを使用しなかったことを指摘しなければならないので、詳細について話すことはできません。

私がNoSQLデータベースを評価しているときの本当のスウィンガーはクエリでした-Cassandraは基本的に巨大なキー/値ストアであり、クエリは少し面倒です(少なくともMongoDBと比較して)ので、パフォーマンスのために大量のデータを一種の手動インデックスとして複製します。一方、MongoDBは「例によるクエリ」モデルを使用します。

たとえば、ユーザーを含むコレクション(RDMSテーブルに相当するMongoDBの用語)があるとします。MongoDBは、レコードをドキュメントとして保存します。ドキュメントは、基本的にバイナリJSONオブジェクトです。例えば:

{
   FirstName: "John",
   LastName: "Smith",
   Email: "john@smith.com",
   Groups: ["Admin", "User", "SuperUser"]
}

管理者権限を持つSmithと呼ばれるすべてのユーザーを検索する場合は、新しいドキュメントを(JavaScriptを使用して管理コンソールで、または選択した言語を使用して本番環境で)作成するだけです。

{
   LastName: "Smith",
   Groups: "Admin"
}

...そしてクエリを実行します。それでおしまい。比較、RegExフィルタリングなどの演算子が追加されていますが、すべて非常に単純で、Wikiベースのドキュメントは非常に優れています。


54
更新(2011年8月8日):昨夜、AmazonのアイルランドEC2データセンターで雷関連のインシデントがあり、サーバーの復旧を整理する際に、2つのサーバーのレプリケーションセット(および'セットアップは簡単です)、アービターノードがあることを確認してください。1つがダウンしても、もう1つはパニックにならず、セカンダリモードで停止しません。信じてください、大きなデータベースで整理するのは、それが後ろの苦痛です。
Richard K.

8
@Richard Kが言ったことを追加するには、レプリカセットに偶数のノード(プライマリ+セカンダリ)がある場合、アービターノードが必要です。
アマレスワール2013

データ分析でさらに集計を行う場合は、mongodbを考慮してください。
user1503117 2015年

As long as you think about indexes carefully, it can absolutely scream along, speed-wise.物理メモリがいっぱいになり、OSがページ
違反を

117

従来のデータベースとNoSQLデータストアのどちらを選択するのですか?両方を使う!NoSQLソリューションの問題(初期の学習曲線を超えて)は、トランザクションの欠如です-MySQLへのすべての更新を行い、MySQLに読み取り用のNoSQLデータストアを入力させると、各テクノロジーの強みを活用できます。これにより複雑さが増しますが、すでにMySQLの側面があります。MongoDB、Cassandraなどを追加するだけです。

NoSQLデータストアは、通常、従来のDBよりも同じように他の仕様でスケーリングが優れています。Facebook、Twitter、Google、およびほとんどの新興企業がNoSQLソリューションを使用しているのには理由があります。これは、オタクが新しいテクノロジーを高く評価するだけではありません。


8
全くもって同じ意見です。私が設計している次期製品の1つでmongodb + mysqlを使用しています。これは、今後の金融商品クラウドです。mysqlは、トランザクション機能が絶対に必要な場合に使用されます。mongodbは、非コンピューティングの複雑なデータ構造を格納するために使用され、必要なときにプルアップする必要があるだけです。これまでのところうまくいきます。:)
Ram on Rails-n-React 2013

私はまた、ほとんどのプロジェクトでこのようなデュアルアプローチを使用しました。また、一部のプロジェクトでは、NFSマウントファイルシステムをPostgreSQLと一緒に使用して、1 GBに近い地震ブロブを作成しました。パスは、キー値データベースへのクエリの一種です。
Audrius Meskauskas 2014

1
これは、sqlデータベースとnosqlデータベースの両方を構築する方法について私が尋ねた質問へのリンクです:dba.stackexchange.com/questions/102053/…私はあなたが持っているかもしれないいくつかの洞察を使うことができます
jは

彼はすでにトランザクションからうまく逃げてきました=>今では無限のスケーラビリティが可能かもしれません..それ以外の場合->ない:)
bodrin

1
データが分散されている場合、これは適切なソリューションではありません
Esteban Verbel '25 / 10/25

60

私はおそらく奇妙な人になるでしょうが、MySQLにとどまる必要があると思います。解決する必要のある実際の問題については説明していません。MySQL/ InnoDBは、blob / jsonデータに対しても優れたストレージバックエンドです。

RDBMSのすべての機能が使用されているわけではないことに気づいたらすぐに、より多くのNoSQLを使用しようとするWebエンジニアの間で共通のトリックがあります。ほとんどの場合、NoSQLデータベースにはかなり貧弱なデータエンジン(MySQLがストレージエンジンと呼ぶもの)があるため、これだけでは十分ではありません。

さて、その種類でない場合は、MySQLで欠落しているものを指定して、別のデータベース(自動シャーディング、自動フェイルオーバー、マルチマスターレプリケーションなど)を探してください。クラスターはより高い書き込みスループットなどで成果を上げます)。


13
彼はシャーディングを使用しています。つまり、彼のデータはサーバー間で手動で分割されています。Mongodbは、シャーディングを自動化できます。
fabspro 2013

18
彼はまた、主にJSONブロブをRDBMSに格納しています-リレーショナルデザイン(機能)を役に立たなくしています。
Damir Sudarevic 2013年

4
データモデルと自動シャーディングは確かに異なりますが、データベースを選択するときは、最初にストレージエンジンを確認し、次に残りの部分を確認する必要があります。負荷スパイク下でストレージエンジンはどのように機能しますか?自動シャーディング機能は、データ流入スパイクの下でどのように実行されますか?これらの重要な側面についてデータベースへの制御を放棄する前に、データベースがタスクを実行できることを確認することをお勧めします。
Kostja 2013

7
リレーショナルモデルは、最もよく考えられ、実装が効率的であり、質素なデータモデルがそこにあります。「役に立たないリレーショナルデザイン機能のレンダリング」は、制約、トリガー、または参照整合性に関連する場合がありますが、これらはすべて従量制です。
Kostja 2013

20

私はCassandraを使用していませんが、MongoDBを使用していて、すばらしいと思います。

簡単なセットアップをしているのなら、これは次のとおりです。MongoDBをuntarして、mongodデーモンを実行すれば、それだけです...実行されます。

明らかにそれはスターターにすぎませんが、始めるのは簡単です。


22
私の知る限り、同じことがカサンドラにも当てはまります。Untar、デーモンを実行します。テストクラスタがセットアップされ、本番環境で使用できるようになりました。
asgs

13

昨日、mongodbに関するプレゼンテーションを見ました。セットアップは「シンプル」で、開梱して起動するのと同じくらい簡単でした。できました。

mongodbとcassandraはどちらも、事実上すべての通常のLinuxハードウェアで実行できると私は信じています。

この場合、結局のところ、個人的にどちらがより快適で、どれがあなたの好みのツールセットであるかが問題になると思います。mongodbに関するプレゼンテーションに関する限り、発表者は、mongodbのツールセットはかなり軽量であり、MySQLで利用できるものに似た(実際に言った)ツールは多くないことを示しました。これはもちろん彼らの経験なのでYMMVです。mongodbについて私が気に入ったことの1つは、多くの言語サポートがあるように見えることでした(Pythonと.NETは主に使用する2つです)。

mongodbを使用しているサイトのリストは非常に印象的で、Twitterがcassandraを使用するようになったことを知っています。


4
結局のところ、リンゴとオレンジの比較です。どちらのデータベースにも独自の長所があります。オブジェクトモデル、セカンダリインデックス、書き込みスケーラビリティ、高可用性などの考慮すべき点を以下に示します。mongodbとcassandraの高レベルの戦略的な違いについては、こちらのブログ投稿をご覧ください-scalegrid.io/blog/cassandra-vs-mongodb
Dharshan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.