sql >> Databáze >  >> RDS >> Mysql

Efektivní ukládání obrázků nahraných uživatelem do systému souborů

Máme takový systém v těžké produkci s 30 000+ soubory a 20+ GB k dnešnímu dni...

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

Soubory jsou pouze uloženy v jediném adresáři s celým číslem File_ID jako názvem souboru. Je nás přes 30 000 bez problémů. Testoval jsem vyšší úroveň bez problémů.

Toto používá RHEL 5 x86_64 s ext3 jako souborovým systémem.

Udělal bych to znovu takto? Ne. Dovolte mi podělit se o pár myšlenek na redesign.

  1. Databáze je stále „hlavním zdrojem“ informací o souborech.

  2. Každý soubor je hašován sha1() a uložen v hierarchii souborového systému založené na tomto hash:/FileData/ab/cd/abcd4548293827394723984723432987.jpg

  3. databáze je o něco chytřejší, pokud jde o ukládání metainformací o každém souboru. Byl by to systém tří tabulek:

    File :ukládá informace, jako je jméno, datum, ip, vlastník a ukazatel na objekt Blob (sha1)
    File_Meta :ukládá do souboru páry klíč/hodnota v závislosti na typu souboru. To může zahrnovat informace jako Image_Width atd...
    Blob :ukládá odkaz na sha1 spolu s jeho velikostí.

Tento systém by deduplikoval obsah souboru uložením dat, na která odkazuje hash (více souborů by mohlo odkazovat na stejná data souboru). Bylo by velmi snadné zálohovat synchronizaci databáze souborů pomocí rsync.

Také by byla odstraněna omezení daného adresáře obsahujícího mnoho souborů.

Přípona souboru by byla uložena jako součást jedinečného hash souboru. Pokud by například hash pro prázdný soubor byl abcd8765 ... Prázdný .txt soubor a prázdný .php soubor by odkazoval na stejný hash. Spíše by měly odkazovat na abcd8765.php a abcd8765.txt . Proč?

Apache atd. lze nakonfigurovat tak, aby automaticky vybral typ obsahu a pravidla pro ukládání do mezipaměti na základě přípony souboru. Je důležité ukládat soubory s platným názvem a příponou, která odráží obsah souboru.

Vidíte, tento systém by mohl skutečně zvýšit výkon delegováním doručování souborů přes nginx. Viz http://wiki.nginx.org/XSendfile .

Doufám, že to nějakým způsobem pomůže. Opatruj se.



  1. Import SSIS Excel Vynucení nesprávného typu sloupce

  2. PHP převést datum a čas na sekundy

  3. JPA:Vztah mnoho k mnoha - JsonMappingException:Nekonečná rekurze

  4. Postgres nepoužívá index, když je mnohem lepší volba index scan