質問

SO には、大規模プロジェクト内のファイル管理と保存に関する非常に良い質問がいくつかあります。

DB への画像の保存 – はい、それともいいえ?
バイナリ データをデータベースまたはファイル システムに保存しますか?

最初のものはいくつかの素晴らしい洞察を持っており、私のプロジェクトではDBルートではなくファイルルートに進むことにしました。

ファイルシステムの使用に対する主な点はバックアップです。しかし、私たちのシステムには優れたバックアップスキームがあるので、そのことについては心配していません。

次のパスは実際のファイルを保存する方法です。そして、ファイルの場所を常に静的にし、データベース側に仮想ディレクトリ システムを作成することを考えました。したがって、ファイルへのリンクは変更されません。

私が構築しているシステムには 1 つのグローバル ファイル管理があるため、すべてのユーザーがすべてのファイルにアクセスできます。しかし、ファイルルートを選択した人の多くは、物理ディレクトリのサイズについて話します (たとえば、すべてのファイルが 1 つのディレクトリ内にある場合)

そこで私の質問は、これらの静的ファイル用のフォルダーを作成する際のヒントやベストプラクティス方法は何ですか、それとも仮想ディレクトリルートをまったく使用すべきではないのかということです。

(プロジェクトが LAMP スタック (PHP) 上にあることが少しでも役立つ場合)

役に立ちましたか?

解決

一つの方法は、各ファイルに固有の番号を割り当て、実際のファイルの場所を調べるためにそれを使用することです。次に、あなたが使用その数は、ファイルシステム内の別のディレクトリにファイルを配布します。たとえば、あなたは、このスキームのようなものを使用することができます:

/images/{0}/{1}/{2}

  

{0}: file_number % 100
  {1}: (file_number / 100) % 100
  {2}: file_number

他のヒント

私はしばらく前に、大量のファイルをホストしていた Web サイトでこの問題に遭遇しました。私たちがやったのは、GUID (ファイルの主キーフィールドでもあります) を取得することでした (例:BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) を作成し、次のようなファイルを保存します。/B/C/C/BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301/ファイル名.ext

これには次のような利点があります。

  • ファイル サーバーを複数のサーバーにスケール アウトできます (各サーバーに特定のディレクトリを割り当てます)。
  • ファイルの名前を変更する必要はありません
  • ディレクトリは一意であることが保証されます

お役に立てれば!

1 つのディレクトリに過剰な数のエントリが作成されるのを避けるために、ファイル名の一部に基づいてディレクトリを作成することをお勧めします。たとえば、d7f5ae9​​b7c5a.png という名前のファイルがある場合、それを media/d7/f5/d7f5ae9​​b7c5a.png に保存するとよいでしょう。ファイル名がすべて 16 進数の場合、単一ディレクトリ内のエントリ数は最終レベルまで 256 に制限されます。

  1. 1 つのユーザー画像は約 100kb なので、データベースに 10,000 人のユーザーがいるとします。各ユーザーは平均 5 つの画像を持つことになるため、5 テラバイトの DB があり、各画像出力は DB 経由で実行され、この追加の DB トラフィックにより、一般的な DB サーバーのパフォーマンス。...これを回避するには DB クラスターを使用することもできますが、コストがかかると想定してください

  2. ライブデータベースでのエラーに関するユーザーレポート(テストではすべて正しく動作します)、開発者のマシンでダンプを作成して解凍するにはどうすればよいでしょうか?どのくらい時間がかかりますか?

  3. ある瞬間に画像を CDN に配置することを決定できますが、ソース コードにはどのような変更が加えられるでしょうか?

私は通常、このアプローチを取るます:

あなたがアップロードされたファイルを保存するフォルダを指すアプリケーションのグローバル設定変数を持っています。データベースストアで(何の設定変数のポイントへの相対)ファイルへの相対パスます。

ファイルは/www/uploads/image.jpgに配置されているのであれば、あなたの設定varibleポイント/ WWWへ/データベース行がimage.jpgを持ってアップロードします。これは、アプリケーションからあなたのシステムのディレクトリ構造を分離柔軟な方法である。

さらに、あなたは、これらがどのように関係データベースのテーブルに基づいて、ディレクトリ内のファイルストレージを断片化することができます。あなたは、テーブルuser_reportsとテーブルuser_photosを持っていると言います。あなたは/ www /のアップロード/ user_reportsでuser_reportsに関連するファイルを格納します。あなたは、ユーザーがアップロードの数が多い場合は、さらにfragmentaionを実装することができます。ユーザーがファイルをreport.pdfと呼ばれ、2009年3月20日にファイルをアップロードするので、あなたは/www/uploads/user_reports/2009/03/20/report.pdfでそれを格納言ってます。

私は、ファイルを管理する方法ApacheとPHPについて多くを語ることはできませんが、私はext3ファイルシステムについて何かを言うことができます。 ext3が同じディレクトリに多数のファイルに問題があるように思えません。私は、最大百万のファイルでそれをテストしてみました。 dir_indexオプションがディレクトリを作成する前に、ファイルシステム上で有効になっていることを確認します。あなたはdump2fsを実行することにより確認し、のtune2fsを実行することにより、このオプションを変更することができます。コマンドラインツールは、まだディレクトリの内容を一覧表示に問題がある可能性があるため、サブディレクトリのツリーにファイルをハッシュするまだ便利です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top