sql >> Databasteknik >  >> RDS >> Mysql

Effektiv lagring av användaruppladdade bilder i filsystemet

Vi har ett sådant system i tung produktion med 30 000+ filer och 20+ GB hittills...

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

Filerna lagras bara i en enda katalog med heltal File_ID som namn på filen. Vi är över 30 000 utan problem. Jag har testat högre utan problem.

Detta använder RHEL 5 x86_64 med ext3 som filsystem.

Skulle jag göra så här igen? Nej. Låt mig dela med mig av ett par tankar om en omdesign.

  1. Databasen är fortfarande "huvudkällan" för information om filerna.

  2. Varje fil hashas sha1() och lagras i en filsystemshierarki baserat på denna hash:/FileData/ab/cd/abcd4548293827394723984723432987.jpg

  3. databasen är lite smartare när det gäller att lagra metainformation på varje fil. Det skulle vara ett trebordssystem:

    File :lagrar information som namn, datum, ip, ägare och en pekare till en Blob (sha1)
    File_Meta :lagrar nyckel/värdepar i filen, beroende på filtyp. Detta kan inkludera information som Image_Width, etc...
    Blob :lagrar en referens till sha1 tillsammans med dess storlek.

Detta system skulle deduplicera filinnehållet genom att lagra data som refereras av en hash (flera filer kan referera till samma fildata). Det skulle vara mycket enkelt att säkerhetskopiera synkronisera fildatabasen med rsync.

Dessutom skulle begränsningarna för en given katalog som innehåller många filer elimineras.

Filtillägget skulle lagras som en del av den unika filhash. Till exempel, om hashen för en tom fil var abcd8765 ... En tom .txt fil och töm .php fil skulle referera till samma hash. Snarare bör de referera till abcd8765.php och abcd8765.txt . Varför?

Apache, etc.. kan konfigureras för att automatiskt välja innehållstyp och cachningsregler baserat på filtillägget. Det är viktigt att lagra filerna med ett giltigt namn och filtillägget som återspeglar filens innehåll.

Du förstår, det här systemet kan verkligen öka prestandan genom att delegera filleveransen genom nginx. Se http://wiki.nginx.org/XSendfile .

Jag hoppas att detta hjälper på något sätt. Ta hand om dig.



  1. Konverteras en BLOB med nuvarande/standardteckenuppsättningen i MySQL?

  2. Importera Excel-data i mysql-databas

  3. Kan MySQL Nested Välj returlista med resultat

  4. Partitionering på en budget