Domanda

Attualmente, ho immagini (max. 6 MB) archiviate come BLOB in una tabella InnoDB. Con l'aumentare della dimensione dei dati, il backup notturno sta diventando sempre più lento, ostacolando le normali prestazioni.

Quindi, i dati binari devono andare nel file system. (i puntatori ai file verranno mantenuti nel DB.)

I dati hanno un albero come relazione:

- main site
  - user_0
    - album_0
    - album_1
    - album_n
  - user_1
  - user_n
etc...

Ora voglio che i dati vengano distribuiti uniformemente attraverso la struttura delle directory. Come dovrei farlo?

Suppongo di poter provare MD5 ('userId, albumId, imageId'); e tagliare la stringa risultante per ottenere il mio percorso di directory:

  /var/imageStorage/f/347e/013b/c042/51cf/985f7ad0daa987d.jpeg

Ciò mi consentirebbe di mappare il primo carattere su un server e distribuire uniformemente la struttura della directory su più server.

Ciò tuttavia non manterrebbe le immagini organizzate per utente, probabilmente diffondendo le immagini per 1 album su più server.

La mia domanda è:
Qual è il modo migliore per archiviare i dati di immagine nel file system in modo equilibrato, mantenendo insieme i dati utente / album?

Sto pensando nella giusta direzione? o è questo il modo sbagliato di fare le cose del tutto?

Aggiornamento:
Proverò la stringa md5 (user_id) per la suddivisione al massimo livello. E quindi inserisci tutti i dati dell'utente nello stesso bucket. Ciò garantirà una distribuzione uniforme dei dati mantenendo allo stesso tempo vicini i dati dell'utente archiviati.

  /var
   - imageStorage
     - f/347e/013b
       - f347e013bc04251cf985f7ad0daa987d
         - 0
           - album1_10
             - picture_1.jpeg
         - 1
           - album1_1
             - picture_2.jpeg
             - picture_3.jpeg
           - album1_11
             - picture_n.jpeg
         - n
           - album1_n

Penso che userò albumId diviso da dietro (mi piace quell'idea!) per ridurre il numero di album per directory (anche se non sarà necessario per la maggior parte degli utenti).

Grazie!

È stato utile?

Soluzione

Basta dividere il tuo userid da dietro. per es.

UserID = 6435624 
Path = /images/24/56/6435624

Per quanto riguarda il backup, è possibile utilizzare MySQL Replication e eseguire il backup dello slave database per evitare problemi (ad es. blocchi) durante il backup.

Altri suggerimenti

una cosa sulla distribuzione dei nomi dei file in diverse directory, se si considera di dividere i nomi dei file md5 in diverse sottodirectory (che è generalmente una buona idea), suggerirei di mantenere l'hash completo come nome file e duplicare i primi caratteri come nomi di directory . In questo modo renderai più semplice l'identificazione dei file, ad es. quando devi spostare le directory.

per es.

abcdefgh.jpg - > un / ab / abc / abcdefgh.jpg

se i nomi dei file non sono distribuiti uniformemente (non un hash), prova a scegliere un metodo di divisione che ottenga una distribuzione uniforme, ad es. gli ultimi caratteri se si tratta di un ID utente incrementale

Sto usando questa strategia dato un ID immagine unico

  • inverti la stringa
  • riempilo con zero iniziale se c'è un numero dispari di cifre
  • taglia la stringa in sottostringhe a due cifre
  • crea il percorso come di seguito

    17 >> 71 >> /71.jpg
    163 >> 0361 >> /03/61.jpg
    6978 >> 8796 >> /87/96.jpg    
    1687941 >> 01497861 >> /01/49/78/61.jpg
    

Questo metodo garantisce che ogni cartella contenga fino a 100 immagini e 100 sottocartelle e che il carico sia distribuito uniformemente tra le cartelle più a sinistra.

Inoltre, è sufficiente l'ID dell'immagine per raggiungere il file, non è necessario leggere la tabella delle immagini contenente altri metadati. I dati dell'utente non vengono archiviati molto vicini tra loro e la relazione ID-Path è prevedibile, dipende dalle tue esigenze.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top