31

現在、InnoDB テーブルに BLOB として保存されている画像 (最大 6MB) があります。データのサイズが大きくなるにつれて、毎晩のバックアップはますます遅くなり、通常のパフォーマンスが妨げられます。

そのため、バイナリ データはファイル システムに移動する必要があります。(ファイルへのポインタは DB に保持されます。)

データにはツリーのような関係があります。

- main site
  - user_0
    - album_0
    - album_1
    - album_n
  - user_1
  - user_n
etc...

ここで、データをディレクトリ構造全体に均等に分散させたいと考えています。どうすればこれを達成できますか?

MD5('userId, albumId, imageId');結果の文字列をスライスして、ディレクトリ パスを取得できると思います。

  /var/imageStorage/f/347e/013b/c042/51cf/985f7ad0daa987d.jpeg

これにより、最初の文字をサーバーにマップし、ディレクトリ構造を複数のサーバーに均等に分散できます。

ただし、これでは画像がユーザーごとに整理された状態に保たれず、1 つのアルバムの画像が複数のサーバーに分散される可能性があります。

私の質問は次のとおりです:
ユーザー/アルバム データを一緒に保ちながら、バランスの取れた方法で画像データをファイル システムに格納する最良の方法は何ですか?

私は正しい方向に考えていますか?それとも、これは物事を完全に行う間違った方法ですか?

更新:最高レベルで分割するため
の文字列スライスを行います。md5(user_id)そして、すべてのユーザー データを同じバケットに入れます。これにより、ユーザー データを近くに保存しながら、データを均等に分散できます。

  /var
   - 画像ストレージ
     - f/347e/013b
       - f347e013bc04251cf985f7ad0daa987d
         - 0
           - アルバム1_10
             - 画像_1.jpeg
         - 1
           - アルバム1_1
             - 画像_2.jpeg
             - 画像_3.jpeg
           - アルバム1_11
             - 画像_n.jpeg
         -n
           - アルバム1_n

ディレクトリごとのアルバムの数を少なくするために、後ろから分割された albumId を使用すると思います (ただし、ほとんどのユーザーには必要ありません)。

ありがとう!

4

3 に答える 3

23

ユーザーIDを後ろから分割するだけです。例えば

UserID = 6435624 
Path = /images/24/56/6435624

バックアップに関しては、MySQL レプリケーションを使用してスレーブ データベースをバックアップし、バックアップ中の問題 (ロックなど) を回避できます。

于 2008-10-10T15:26:29.690 に答える
7

ファイル名を異なるディレクトリに分散することについての 1 つのことは、md5 ファイル名を異なるサブディレクトリに分割することを検討している場合 (これは一般的には良い考えです)、完全なハッシュをファイル名として保持し、最初の数文字をディレクトリ名として複製することをお勧めします。これにより、ディレクトリを移動する必要がある場合などに、ファイルを簡単に識別できるようになります。

例えば

abcdefgh.jpg -> a/ab/abc/abcdefgh.jpg

ファイル名が均等に分散されていない (ハッシュではない) 場合は、均等に分散される分割方法を選択してみてください。

于 2008-10-11T15:31:23.627 に答える
3

一意の画像IDを指定してこの戦略を使用しています

  • 文字列を逆にする
  • 桁数が奇数の場合は、先行ゼロで埋めます
  • 文字列を 2 桁の部分文字列にチャンクします
  • 以下のようにパスを構築します

    17 >> 71 >> /71.jpg
    163 >> 0361 >> /03/61.jpg
    6978 >> 8796 >> /87/96.jpg    
    1687941 >> 01497861 >> /01/49/78/61.jpg
    

この方法では、各フォルダーに最大 100 個の画像と 100 個のサブフォルダーが含まれ、左端のフォルダー間で負荷が均等に分散されます。

さらに、ファイルに到達するために画像の ID が必要なだけで、他のメタデータを含む画像テーブルを読み取る必要はありません。ユーザーデータは実際には近くに保存されておらず、ID-パスの関係は予測可能であり、ニーズによって異なります。

于 2014-02-17T13:10:23.300 に答える