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

Archiviazione binaria MySQL con file system BLOB VS OS:file di grandi dimensioni, grandi quantità, grandi problemi

Lavoro su un grande sistema software che ha fatto entrambi i meccanismi per la memorizzazione di allegati e altri contenuti. La prima iterazione del sistema ha memorizzato tutti i dati nei BLOB nel DB. L'ho maledetto in quel momento. Come programmatore, potevo scrivere script laterali per operare immediatamente sui dati e cambiarli ogni volta che volevo.

Anticipo di circa 10 anni e gestisco ancora lo stesso software ma l'architettura è cambiata ed è stato scritto con puntatori al filesystem. Lo maledico ora e vorrei che fosse di nuovo nel DB. Ho il vantaggio aggiuntivo di diversi anni e avendo lavorato a questa applicazione in una capacità molto maggiore in molte più e molte situazioni più grandi, sento che la mia opinione ora è più istruita. La promozione o la migrazione del sistema dell'applicazione richiede script estesi e la copia di milioni di file. In un'occasione abbiamo cambiato il sistema operativo e tutti i puntatori di file avevano il separatore di directory sbagliato, oppure il nome del server cambia dove si trovava il file e abbiamo dovuto scrivere e pianificare semplici istruzioni di aggiornamento SQL con il DBA nel fine settimana per risolverlo. Un altro è che il filesystem e i record DB non sono sincronizzati, perché è incerto ma dopo migliaia di giorni di funzionamento, a volte i sistemi non transazionali (filesystem e DB non condividono contesti transazionali) semplicemente non sono sincronizzati. A volte i file scompaiono misteriosamente.

Quando tutto questo era nel DB, la migrazione o la promozione dell'ambiente era una questione di dump e importazione del DB. Le modifiche alle righe possono essere controllate correttamente, tutto è sincronizzato e i registri possono essere riprodotti a un punto nel tempo, se necessario. Sicuramente il DB diventa grande, ma è il 2011 e questa roba semplicemente non è una sfida per i database.

Per quel che vale abbiamo avuto problemi simili con buffer di dati di grandi dimensioni durante lo streaming di alcuni dati, ma A) potevamo pompare i dati in buffer di byte con Input|OutputStreams in JDBC e B) quando utilizzavamo altri strumenti, abbiamo scritto una procedura memorizzata ciò spezzerebbe il BLOB in una tabella temporanea e servirebbe in modo iterativo i blocchi dalla tabella temporanea. Funziona alla grande.

Non mi interessa quale sia il motivo tecnico per non mettere queste cose nel DB, ma è molto più semplice per gestire in una location consolidata potrei raddoppiare e triplicare l'hardware o grigliare il DB per il tempo sprecato da consulenti e clienti proprio in un breve lasso di tempo a gestire i file disparati.

Aggiornamento:vai piano con i commentatori, stanno solo dando la loro opinione in merito.