1

私は、mongo db で (カスタマイズされた認証の) スケーラブルなセッション テーブルのスキーマ設計に取り組んでいます。Mongo DB のスケーラビリティは設計から継承されており、要件もあることがわかっています。私のユーザーケースはシンプルで、

  1. ユーザーがログインすると、ランダムなトークンが生成され、ユーザーに付与されます。次に、シャード可能な主キーとしてトークンを使用してセッション テーブルにレコードを挿入します。古いトークン レコードが存在する場合は削除されます。
  2. トークンを使用したユーザー アクセス サービス

私の質問は、システムが期限切れのセッション キーを削除し続ける場合、セッション コレクションのサイズ (トークン フィールドにパーティションが必要なシャード化された状況を考慮して) が非常に大きくなり、期限切れのセッションの多くの「ギャップ」が含まれる可能性があるということです。この問題 (またはより良い設計) を適切に処理するにはどうすればよいですか?

前もって感謝します。

編集: 私の質問は、ストレージ レベルについてです。レコードが頻繁に削除および挿入される場合、mongodb はどのようにディスク領域を管理しますか? そこには一種の(自動)縮小メカニズムがあるはずです。コレクションへの読み取りをブロックしないことを願っています。

4

4 に答える 4

0

セッションを達成するには、いくつかの方法があります。

  1. この使用例で示されているように、キャップされたコレクション。
  2. expireAfterSeconds をensureIndexに追加して、インデックスへのTTL を使用してデータを期限切れにします。
  3. TTL を使用してプログラム側のセッションをクリーニングし、削除します。

同じ問題に直面して、私はそれが提供する柔軟性のために解決策 3 を使用しました。

この回答で、削除とディスクの最適化の概要を確認できます。

于 2012-12-27T09:09:15.060 に答える
0

TTLは良好ですが、修理はすべてではありません。--repairデータベースで定期的に実行するようには設計されていません。実際には、3か月に1回程度です。頻繁に実行すると、サーバーのパフォーマンスに深刻なダメージを与える多くの内部処理を実行します。

このような環境でのディスク容量の再利用について。レコードを削除すると、その「ブロック」が解放されます。別のドキュメントがその「ブロック」に収まる場合、そのスペースが再利用されます。そうでない場合、実際には新しいエクステントが作成されます。つまり、新しい「ブロック」、つまりより多くのスペースが作成されます。

したがって、ここでディスク容量を節約したい場合は、ドキュメントが互いに超えないようにする必要があります。幸いなことに、ここには比較的静的なスキーマがあります:

{
    _id: {},
    token: {},
    user_id: {},
    device: {},
    user_agent: ""
}

これは、うまくいけば、ドキュメントがそのスペースを再利用することを意味するはずです。

そうでない場合、ここで注意が必要です。MongoDB は、コレクションごとに自動的に空き領域を返還しません (ただし、ファイルを削除するのと同じため、データベースごとに返されます)。そのため、実際に領域を取得するには--repair、データベースまたはコレクションで実行する必要があります。compact()

そうは言っても、あなたのドキュメントは互いに相対的なサイズになると思いますので、ここで問題が発生するかどうかはわかりませんが、試してみることもできます: http://www.mongodb.org/display/DOCS/Padding+Factor #PaddingFactor-usePowerOf2Sizesは、挿入と削除が頻繁に行われるコレクションの場合、その面でのパフォーマンスを向上させるはずです。

于 2012-12-27T09:09:56.510 に答える
0

私は@Steven Farleyに同意します。インデックスを作成しているときに、ttlを設定できます.pymongoドライバーによるpythonでは、このようにすることができます

http://api.mongodb.org/python/1.3/api/pymongo/collection.html#pymongo.collection.Collection.create_index

于 2012-12-27T08:17:55.693 に答える