以前の質問 (大規模な分析サーバーをすばやく構築する方法は? ) に関して、分析データを MongoDB にフィードしています。すべてのイベント (メタデータの束) は、ビュー コレクションで独自のドキュメントを取得します。
しかし、ここで次の障害にぶつかりました。挿入が完了し、分析データが流れているので、そのデータに対して実行するための抵抗が最も少ないパスは何でしょうか? そのデータがシャーディングされると、特定のビューが mapReduces を実行するという考え方です (たとえば、1 か月前の特定の ID を持つすべてのイベント)。
だから、私の質問は次のとおりです。私はMongoDBにまったく慣れていないので、これらのmapReducesをできるだけ速く取得するために必要な手順は何ですか? 生データを別の方法で構造化する必要がありますか、それともイベントごとに 1 つのドキュメントが正しいですか? 1 日に何百万もの挿入を取得するデータセットに対して実行するときに、物事の流れを速くするためにできる Mongo 固有のトリックはありますか?
テクノロジー スタックをできるだけシンプルに保ちたいので (Node.js + MongoDB)、追加のテクノロジー (Hadoop など) を導入せずに処理できるようにしたいと考えています。
イベントの文書例:
{
id: 'abc',
ip: '1.1.1.1',
type: 'event1',
timestamp: 1234,
metadata: {
client: 'client1'
}
}
すべての主要な集計は ID 中心であり、前述の ID のイベントを分析します。最も使用されるのは、先月の前述の ID を持つすべてのイベントを取得することです。マイナーな集計では、メタデータ (client1 と client2 の使用率など) を使用して物事をグループ化します。すべての集計はシステムで定義されるため、少なくとも現時点では、ユーザーが自分で集計を設定することはできません。したがって、私が理解している限り、アグリゲーションの大部分は ID 中心になるため、シャーディングは ID を介して行う必要がありますか? また、これは、Mongo が最新のものをメモリに保持し、オーバーフローをディスクにダンプするだけであるため、特定の ID の最新のイベントが常にメモリにあることを意味するはずです。
また、リアルタイムである必要はありません。ただし、それはいいことです。:P
編集:サンプルデータを追加
編集:タイトルは「...ページごと」ではなく「...日ごと」である必要がありました+集計セットに関する詳細仕様