あなたが行っているように、ファイルをシャーディングすることは、1 つのディレクトリに多くのファイルがある場合のパフォーマンスの問題を回避するための優れた方法です。この方法では、特定のディレクトリにいくつかのエントリ (ディレクトリまたはファイル) のみが存在するようにします。必要に応じて、複数のボリュームに分割することも簡単です。高レベルのディレクトリのいくつかを別の場所にマウントするだけです。
ただし、いくつかのことを考慮する必要があります。
身元
これらの画像を基本的に永続的に保存する場合は、ID に基づいて分割することをお勧めします。これは、DB 側から処理する方が少し簡単です (DB 設計で任意の主キーを使用するのと同じ理由で)。
@Veger が示唆するように: imageid123456
は になり/12/1234/123456.jpg
ます。
安全
ただし、日付、ユーザー ID、または自動インクリメント番号を使用すると、比較的推測しやすく、誰かがすべての画像を簡単に取得できるという点で、セキュリティ リスクが生じる可能性があります。
さらに、ユーザーがアップロード日を知る理由がない場合、URL に日付が含まれていると、情報が漏洩する可能性があります。
非常に推測しにくいキーを使用している場合は、ハーベスティングと情報漏えいの両方に対してある程度のセキュリティが提供されます。たとえば、GUID を使用できます。イメージ ID6f33395e-eda8-4486-8b8e-51ea0f91751b
は として保存され/6/6f33/6f33395e/6f33395e-eda8-4486-8b8e-51ea0f91751b.jpg
ます。
非常に多くの GUID (128 ビット) があるため、誰かがすべてを収集するには数百万年かかる可能性があります (1 時間あたりの IP ごとの接続を制限するなどの追加の手順を実行しなくても)。
揮発性画像
イメージが揮発性である場合 (つまり、一定の時間が経過すると有効期限が切れる場合) は、実際には日付構造に基づいて分割するのが最善かもしれません。たとえば/2012/12/14/2012-12-14-hhmmss-userid.jpg
、これを GUID と組み合わせて/2012/12/14/6f/6f33395e-eda8-4486-8b8e-51ea0f91751b.jpg
.
2011 年のファイルをすべて削除する場合は、rm -rf 2011
. これを使用する良い例は、ログ ファイルです。
データベースでクエリを実行して日付に基づいて古い画像を検索し、それらを 1 つずつ削除することができるため、これは非常に多数の画像に対してのみ意味があることを覚えておく必要があります。
シャードの粒度
最終的に保存する予定のイメージを増やすには、より高い粒度のシャードを使用してください。
目標は、ディレクトリごとのエントリ数をファイルシステムが処理できる数に保つことです。経験則としては、最大で約 10,000 のようです。サイトが今後しばらく獲得するトラフィックを予測する必要があります。ただし、ある時点で 1 日に何百万ものユーザーがいるかもしれないと考えて、夢中にならないでください。再シャードすることは不可能ではありませんが、それは苦痛です。今後数年間の成長を予測し、それに対処してください。より速く成長し、結果として再シャードする必要がある場合は、解決するのが良い問題です. ディレクトリ エントリがイメージよりも多くのスペースを占めているためにディスク容量が不足している場合、それは対処するのがばかげた問題です。