Kami memiliki sistem seperti itu dalam produksi berat dengan 30.000+ file dan 20+ GB hingga saat ini...
Column | Type | Modifiers
-------------+-----------------------------+----------------------------------------------------------
File_ID | integer | not null default nextval('"ACRM"."File_pseq"'::regclass)
CreateDate | timestamp(6) with time zone | not null default now()
FileName | character varying(255) | not null default NULL::character varying
ContentType | character varying(128) | not null default NULL::character varying
Size | integer | not null
Hash | character varying(40) | not null
Indexes:
"File_pkey" PRIMARY KEY, btree ("File_ID")
File hanya disimpan dalam satu direktori dengan File_ID integer sebagai nama file. Kami lebih dari 30.000 tanpa masalah. Saya telah menguji lebih tinggi tanpa masalah.
Ini menggunakan RHEL 5 x86_64 dengan ext3 sebagai sistem file.
Apakah saya akan melakukannya dengan cara ini lagi? Tidak. Izinkan saya berbagi beberapa pemikiran tentang desain ulang.
-
Basis data masih merupakan "sumber utama" informasi tentang file.
-
Setiap file sha1() di-hash dan disimpan dalam hierarki sistem file berdasarkan hash tersebut:
/FileData/ab/cd/abcd4548293827394723984723432987.jpg
-
database sedikit lebih pintar tentang menyimpan meta-informasi pada setiap file. Ini akan menjadi sistem tiga tabel:
File
:menyimpan info seperti nama, tanggal, ip, pemilik, dan penunjuk ke Blob (sha1)File_Meta
:menyimpan pasangan kunci/nilai pada file, tergantung pada jenis file. Ini mungkin termasuk informasi seperti Image_Width, dll...Blob
:menyimpan referensi ke sha1 beserta ukurannya.
Sistem ini akan menghapus duplikat konten file dengan menyimpan data yang direferensikan oleh hash (beberapa file dapat mereferensikan data file yang sama). Akan sangat mudah untuk melakukan backup sync database file menggunakan rsync.
Selain itu, batasan direktori tertentu yang berisi banyak file akan dihilangkan.
Ekstensi file akan disimpan sebagai bagian dari hash file unik. Misalnya, jika hash untuk file kosong adalah abcd8765
... Sebuah .txt
yang kosong file dan kosongkan .php
file akan merujuk ke hash yang sama. Sebaliknya, mereka harus merujuk ke abcd8765.php
dan abcd8765.txt
. Mengapa?
Apache, dll. dapat dikonfigurasi untuk secara otomatis memilih jenis konten dan aturan caching berdasarkan ekstensi file. Penting untuk menyimpan file dengan nama yang valid dan ekstensi yang mencerminkan konten file.
Soalnya, sistem ini benar-benar dapat meningkatkan kinerja dengan mendelegasikan pengiriman file melalui nginx. Lihat http://wiki.nginx.org/XSendfile .
Saya harap ini membantu dalam beberapa cara. Hati-hati.