41

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

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

ありがとうございました

4

9 に答える 9

31

このような収穫ソリューションについては、多段階アプローチをお勧めします。Redis はリアルタイム通信が得意です。Redis はメモリ内のキー/値ストアとして設計されており、メモリ データベースであることの非常に優れた利点を継承しています: O(1) リスト操作です。サーバーで使用する RAM がある限り、Redis はリストの最後までプッシュする速度を低下させません。これは、極端な速度でアイテムを挿入する必要がある場合に適しています。残念ながら、Redis は、使用している RAM の量よりも大きなデータ セットで動作することはできず (ディスクへの書き込みのみであり、読み取りはサーバーの再起動またはシステム クラッシュの場合にのみ行われます)、スケーリングはユーザーとアプリケーションで行う必要があります。. (一般的な方法は、いくつかの Redis ドライバー、特に Ruby on Rails 用のドライバーによって実装されている、多数のサーバーにキーを分散させることです。) 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) は、さまざまなデータ セットに対して結合や複雑なクエリを実行できません。

于 2012-01-16T23:20:50.733 に答える
22

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

私は個人的に Mongo のファンですが、率直に言って、Redis と Cassandra のパフォーマンスが良くも悪くもなりそうにありません。つまり、あなたがしているのは、メモリに何かを投げてから、バックグラウンドでディスクにフラッシュすることだけです (Mongo と Redis の両方がこれを行います)。

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

于 2010-06-10T06:10:34.193 に答える
12

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

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

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

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

Cassandra はキー値ストアです。プライマリ インデックスとして機能する静的な列または一連の列を最初に定義します。Cassandra に対して実行されるすべてのクエリは、このインデックスに合わせて調整する必要があります。あなたはそれにセカンダリを置くことができますが、それはそれが行く限りです. もちろん、MapReduce を使用してストアをスキャンしてキー以外の属性を調べることもできますが、それはストア全体のシリアル スキャンにすぎません。Cassandra には、サーバー ノードでの "like" または正規表現操作の概念もありません。名が「Alex」で始まるすべての顧客を見つけたい場合は、コレクション全体をスキャンし、各エントリの名を取り出して、クライアント側の正規表現で実行する必要があります。

私は Redis について知的に語れるほど、Redis に精通していません。ごめん。

非リレーショナル プラットフォームを評価している場合は、CouchDB と Riak も検討することをお勧めします。

お役に立てれば。

于 2011-03-26T08:56:54.590 に答える
9

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

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

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

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

于 2010-09-12T21:34:45.143 に答える
3

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

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

于 2010-06-10T06:31:37.080 に答える
3

シンプルな $350 の Dell で、MongoDB を使用して約 30,000 の挿入/秒を取得できます。1 秒あたり約 2,000 の挿入だけが必要な場合は、MongoDB を使い続け、スケーラビリティのためにそれを分割します。たぶん、Node.js で何かをするか、物事をより非同期にするために何かをすることも検討してください。

于 2011-09-08T23:43:59.457 に答える
2

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

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

SQLite は、適切なパフォーマンスを提供する可能性のある先行書き込みログをサポートするようになりました。

于 2011-02-28T23:49:52.563 に答える
-8

私はmongodb、couchdb、cassandraを実際に体験しています。多くのファイルをbase64文字列に変換し、これらの文字列をnosqlに挿入しました。
mongodbが最速です。カサンドラは最も遅いです。couchdbも遅いです。

mysqlはそれらすべてよりもはるかに高速だと思いますが、テストケースではまだmysqlを試していません。

于 2011-07-06T12:22:05.367 に答える