sql >> Database teknologi >  >> RDS >> Mysql

Effektiv lagring af brugeruploadede billeder på filsystemet

Vi har sådan et system i tung produktion med 30.000+ filer og 20+ GB til dato...

   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")

Filerne er blot gemt i en enkelt mappe med heltal File_ID som navnet på filen. Vi er over 30.000 uden problemer. Jeg har testet højere uden problemer.

Dette bruger RHEL 5 x86_64 med ext3 som filsystem.

Ville jeg gøre det på denne måde igen? Nej. Lad mig dele et par tanker om et redesign.

  1. Databasen er stadig "masterkilden" til information om filerne.

  2. Hver fil er sha1() hashed og gemt i et filsystemhierarki baseret på denne hash:/FileData/ab/cd/abcd4548293827394723984723432987.jpg

  3. databasen er en smule smartere til at gemme metainformation på hver fil. Det ville være et system med tre borde:

    File :gemmer oplysninger såsom navn, dato, ip, ejer og en pegepind til en Blob (sha1)
    File_Meta :gemmer nøgle/værdi-par på filen, afhængigt af filtypen. Dette kan omfatte oplysninger såsom Image_Width osv...
    Blob :gemmer en reference til sha1 sammen med dens størrelse.

Dette system ville de-duplikere filindholdet ved at gemme de data, der refereres til af en hash (flere filer kunne referere til de samme fildata). Det ville være meget nemt at sikkerhedskopiere synkronisering af fildatabasen ved hjælp af rsync.

Desuden ville begrænsningerne for en given mappe, der indeholder en masse filer, blive elimineret.

Filtypenavnet vil blive gemt som en del af den unikke fil-hash. For eksempel, hvis hashen for en tom fil var abcd8765 ... En tom .txt fil og tøm .php fil vil referere til den samme hash. I stedet bør de henvise til abcd8765.php og abcd8765.txt . Hvorfor?

Apache osv.. kan konfigureres til automatisk at vælge indholdstype og cacheregler baseret på filtypenavnet. Det er vigtigt at gemme filerne med et gyldigt navn og filtypenavnet, som afspejler indholdet af filen.

Ser du, dette system kunne virkelig øge ydeevnen ved at uddelegere filleveringen gennem nginx. Se http://wiki.nginx.org/XSendfile .

Jeg håber, at dette hjælper på en eller anden måde. Pas på.



  1. Caching i PostgreSQL

  2. Entity Framework med mysql, Table Capitalization-problem mellem linux og windows

  3. Sådan fungerer COMPRESS() i MariaDB

  4. MySQL:Vælg alle datoer i et interval, selvom der ikke er nogen registreringer til stede