web-dev-qa-db-ja.com

MongoDB vs. Redis vs. Cassandra高速書き込み、一時行ストレージソリューション用

広告のインプレッションとクリックを追跡および検証するシステムを構築しています。これは、多数の挿入コマンド(平均で約90 /秒、ピークは250)といくつかの読み取り操作があることを意味しますが、焦点はパフォーマンスと高速化にあります。

システムは現在MongoDBにありますが、それ以来CassandraとRedisを紹介しました。MongoDBにとどまるのではなく、これら2つのソリューションのいずれかに行くことをお勧めしますか?なぜですか?

ありがとうございました

39
Mark Bao

このような収穫ソリューションには、多段階のアプローチをお勧めします。 Redisはリアルタイム通信が得意です。 Redisはメモリ内のキー/値ストアとして設計されており、メモリデータベースであるという非常に素晴らしい利点を継承しています:O(1)リスト操作。サーバーで使用するRAMがある限り、Redisはリストの最後までプッシュを遅くしません。これは、このような極端なレートでアイテムを挿入する必要がある場合に適しています。残念ながら、RedisはRAMの量よりも大きいデータセットでは動作できません(ディスクへの書き込み、読み取りサーバーを再起動するため、またはシステムがクラッシュした場合)、スケーリングはyouおよびyourアプリケーション。 (一般的な方法は、特にRuby on Rails用のいくつかのRedisドライバーによって実装される多数のサーバーにキーを分散させることです。Redisは、簡単なパブリッシュ/サブスクライブメッセンジャーもサポートしています。同様に。

このシナリオでは、Redisは「ステージ1」です。イベントの特定のタイプごとに、Redisに一意の名前のリストを作成します。たとえば、「ページ表示」と「リンクがクリックされました」があります。簡単にするために、各リストのデータが同じ構造であることを確認します。クリックされたリンクにはユーザートークン、リンク名、URLが含まれる場合がありますが、表示されるページにはユーザートークンとURLのみが含まれる場合があります。あなたの最初の懸念は、それが起こったという事実をただ取得することであり、必要な絶対に必要なデータがプッシュされます。

次に、リストの最後からアイテムを取り出して引き渡すように要求することで、Redisの手からこの必死に挿入された情報を取り出す単純な処理ワーカーがいます。ワーカーは、データを適切にファイルし、より永続的なストレージサイトに引き渡すために必要な調整/重複排除/ IDルックアップを行うことができます。 Redisのメモリ負荷に耐えられるようにするために、必要なだけこれらのワーカーを起動します。 Redisドライバー(ほとんどのWeb言語は現在)と希望のストレージ(SQL、Mongoなど)を備えている限り、希望する任意のワーカー(Node.js、C#、Javaなど)で記述できます。 )

MongoDBはドキュメントストレージが得意です。 Redisとは異なり、RAMよりも大きなデータベースを処理でき、シャーディング/レプリケーションを独自にサポートします。 SQLベースのオプションに対するMongoDBの利点は、あらかじめ決められたスキーマを持つ必要がないことです。いつでも好きなようにデータを保存する方法を自由に変更できます。

ただし、処理のためにデータを保持する「ステップ1」フェーズにRedisまたはMongoを提案し、従来のSQLセットアップ(おそらくPostgresまたはMSSQL)を使用して後処理データを保存します。クライアントの行動を追跡することは、「このページを閲覧したすべての人を表示」または「この日にこの人が閲覧したページ数」または「合計で最も多くの閲覧者がいた日」に行きたいので、リレーショナルデータのように思えます。 「。分析目的のさらに複雑な結合またはクエリが考えられる場合がありますが、成熟したSQLソリューションはこのフィルタリングの多くを実行できます。 NoSQL(具体的にはMongoまたはRedis)は、さまざまなデータセット間で結合や複雑なクエリを実行できません。

28
Skrylar

私は現在、非常に大規模な広告ネットワークで働いており、フラットファイルに書き込みます:)

私は個人的にはMongoのファンですが、率直に言って、RedisとCassandraのパフォーマンスは良くも悪くもなりそうにありません。バックグラウンドで(MongoとRedisの両方がこれを行います)。

非常に速い速度を探している場合、他のオプションはローカルメモリにいくつかのインプレッションを保持し、1分ごとにディスクをフラッシュすることです。もちろん、これは基本的にMongoとRedisがあなたのために行うことです。移動する本当の説得力のある理由ではありません。

21
Gates VP

3つのソリューション(フラットファイルを数える場合は4つ)はすべて、高速書き込みを実現します。非リレーショナル(nosql)ソリューションは、災害復旧の目的にも調整可能なフォールトトレランスを提供します。

規模の面では、MongoDBノードが3つしかないテスト環境では、1秒あたり2〜3kの混合トランザクションを処理できます。 8ノードでは、1秒あたり12k〜15kの混合トランザクションを処理できます。 Cassandraはさらに拡張できます。250の読み取りは問題ありません(またはそうあるべきです)。

さらに重要な質問は、このデータで何をしたいのですか?運用レポート?時系列分析?アドホックパターン分析?リアルタイムレポート?

MongoDBは、コレクション内の複数の属性に基づいてアドホック分析を実行したい場合に適したオプションです。コレクションには最大40個のインデックスを配置できますが、インデックスはメモリに保存されるため、サイズに注意してください。しかし、結果は柔軟な分析ソリューションです。

Cassandraはキーバリューストアです。すぐにプライマリインデックスとして機能する静的列または列のセットを定義します。 Cassandraに対して実行されるすべてのクエリは、このインデックスに調整する必要があります。セカンダリに置くことができますが、それはそれに関する限りです。キー以外の属性の場合、ストア全体のシリアルスキャンCassandraには、サーバーノードでの「いいね」または正規表現操作の概念もありません。名が「Alex」で始まるすべての顧客を検索する場合は、コレクション全体をスキャンし、各エントリの名を引き出して、クライアント側の正規表現を実行する必要があります。

私はRedisについて十分に精通していないので、Redisについて賢く話すことができません。ごめんなさい。

非リレーショナルプラットフォームを評価する場合は、CouchDBとRiakも検討する必要があります。

お役に立てれば。

12
Data Monk

ちょうどこれを見つけました: http://blog.axant.it/archives/236

最も興味深い部分を引用:

この2番目のグラフは、Redis RPUSH対Mongo $ Push対Mongo insertに関するもので、このグラフは非常に興味深いものです。最大5000エントリのmongodb $ Pushは、Redis RPUSHと比較しても高速ですが、信じられないほど遅くなりました。おそらくmongodb配列型は挿入時間が線形であるため、遅くなります。 mongodbは、一定時間の挿入リストタイプを公開することでパフォーマンスを少し向上させる可能性がありますが、線形時間配列タイプ(一定時間のルックアップを保証できる)でも、小さなデータセットのアプリケーションがあります。

すべては少なくともデータ型とボリュームに依存すると思います。最善のアドバイスは、典型的なデータセットのベンチマークを行い、自分自身を確認することです。

9
drdaeman

ベンチマーク上位NoSQLデータベースによると( ここからダウンロード )Cassandraをお勧めします。 enter image description here

6
Phat H. VU

選択肢がある場合(そして、フラットフィーズから離れる必要がある場合)、Redisを使用します。非常に高速で、話している負荷を快適に処理しますが、さらに重要なことは、フラッシュ/ IOコードを管理する必要がないことです。私はそれが非常に簡単であることを理解していますが、管理するコードが少ないほうが優れています。

Redisでは、ファイルベースのキャッシングでは得られない水平スケーリングオプションも利用できます。

3
Ben Hughes

データベースへの挿入の問題は、通常、挿入ごとにディスク上のランダムブロックに書き込む必要があることです。必要なのは、10回の挿入ごとに、理想的には順次ブロックにディスクに書き込むものだけです。

フラットファイルは良いです。要約統計(ページあたりの合計ヒット数など)は、マージソートマップ削減型アルゴリズムを使用して、スケーラブルな方法でフラットファイルから取得できます。自分でロールバックするのはそれほど難しくありません。

SQLiteは、Write Ahead Loggingをサポートするようになりました。これは、十分なパフォーマンスを提供する場合もあります。

2
Paul Harrison

単純な350ドルのDellでMongoDBを使用すると、毎秒3万件の挿入を取得できます。 1秒あたり約2kの挿入だけが必要な場合は、MongoDBを使い続けてスケーラビリティを確保します。また、Node.jsなどを使用して何かを非同期にするための処理を検討することもあります。

2
EhevuTov