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