現在、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 を使用すると思います (ただし、ほとんどのユーザーには必要ありません)。
ありがとう!