7

多数のホストから計装データを収集して保存します。私たちのストレージは MongoDB です - レプリカを持ついくつかのシャード。すべてが 1 つの大きなコレクションに格納されます。挿入する各ドキュメントは、いくつかの属性 (測定値) を持つ時間ベースの観察です。すべてのクエリは少なくとも時間に基づいているため、タイム スタンプは最も重要な属性です。ドキュメントは決して更新されないため、純粋な書き込みルックアップ モデルです。現在、数十億のドキュメントで十分に機能しています。

今、

少し大きくして、最大 12 か月のデータを保持したいと考えています。これは、1 兆件以上の恐ろしい観察結果 (ドキュメント) になる可能性があります。すべてを単一の巨大なコレクションにダンプすることが最善の選択なのか、それとももっと賢明な方法があるのか​​ 、私はさまよっていました。よりインテリジェントとは、高速な挿入と (重要なことに) 高速なクエリを提供しながら、より少ないハードウェアを使用することを意味します。そこで、インデックス、挿入、およびクエリの速度でメモリを獲得することを期待して、大きなコレクションを小さな断片に分割することを考えました。

私はシャードを調べましたが、タイムスタンプによるシャーディングは悪い考えのように思えます。なぜなら、すべての書き込みが 1 つのノードに送られ、シャーディングの利点が失われるからです。挿入率は非常に高いため、ここで適切に機能するにはシャーディングが必要です。また、毎月新しいコレクションを作成し、ユーザー クエリに関連するコレクションをピックアップすることも考えました。12 か月より前のコレクションは削除されるか、アーカイブされます。毎月まったく新しいデータベースを作成し、同様のローテーションを行うオプションもあります。その他のオプション?それとも、1 つの大規模なコレクションが、本当に大きく成長するためのオプションなのでしょうか?

同様のアプリでの経験と考慮事項を共有してください。

4

3 に答える 3

2

毎月の収集はブーストアップに役立つと思いますが、タイムスタンプの時間フィールドをシャーディングに使用できないのはなぜだろうと思っていました。タイム スタンプの HOUR 部分を保持する列を追加できます。それに対してシャードすると、毎日 1 時間繰り返されるため、適切に共有されます。私はそれをテストしていませんが、それがあなたを助けるかもしれないと思いました

于 2013-04-05T03:24:28.557 に答える
2

それは、クエリのユースケースに大きく依存します。

集約できるものである場合は、スケジュールされた map/reduce 関数を使用してこれを行い、より小さいデータ サイズを別のコレクションに格納します。

すべてが同じコレクションにあり、必要な結果を生成するためにすべてのデータを同時にクエリする必要がある場合は、シャーディングを使用する必要があります。次に、クエリのデータ サイズに応じて、メモリ内のマップ/リデュースを使用するか、アプリケーション レイヤーで実行することもできます。

あなたが指摘したように、時間に基づくシャーディングは非常に悪い考えです。すべての書き込みが 1 つのシャードに行われるため、シャード キーを定義します。MongoDB Docsには、これに関する非常に良い説明があります。

クエリの特定のニーズについて詳しく説明できる場合は、何かを提案するのが簡単になります。

それが役に立てば幸い。

于 2013-04-04T18:53:19.250 に答える
0

@Devesh の時間ベースのシャードで示唆されているように、単一のコレクションを使用することをお勧めします。パフォーマンスを向上させるために、クエリ中に新しい ' hour Key ' を処理する必要があります。

于 2018-01-24T12:37:32.810 に答える