Suggerimenti per la creazione di un database molto grande di hash
-
24-10-2019 - |
Domanda
La domanda: Quale soluzione o suggerimenti si dovrebbe avere a che fare con un database molto grande (multi-terabyte) indicizzati su forti hash ad elevata ridondanza?
Una specie di stoccaggio invertita?
C'è qualcosa che potrebbe essere fatto con Postgres?
Sono pronto a rotolare il mio stoccaggio, se necessario.
(Suggerimento: Deve essere open source, senza Java, deve essere eseguito su Linux, deve essere basato su disco, C / C ++ / Python preferito)
I dettagli:
ho bisogno di creare un database molto grande in cui ogni record è:
- alcuni meta-dati arbitrari (una parte di testo campi) tra cui alcuni della chiave primaria
- una hash (128 bit hash MD5, come forte)
Il volume di record è quello che vorrei qualificarsi come abbastanza grande: diversi da 10 a 100 miliardi di). C'è una ridondanza significativa di hash attraverso le righe (oltre il 40% dei record hanno il loro hash condiviso con almeno un altro record, alcuni esistono hash in 100K record)
L'utilizzo primario è di ricercare da cancelletto, quindi recuperare i metadati. L'utilizzo secondario è di ricercare per chiave primaria, quindi recuperare i metadati.
Si tratta di una base di dati di analisi di tipo, in modo che il carico complessivo è di media, per lo più leggere, poche scrive, scrive lo più batch.
L'approccio attuale è quello di utilizzare Postgres, con un indice sulla chiave primaria e di un indice sulla colonna di hash. La tabella viene caricata in batch con l'indice nella hash spenta.
Tutti gli indici sono Usa Btree. L'indice sulla colonna di hash è in crescita enorme, come grandi o più grande della tabella stessa. Su un tavolo da 120 GB ci vuole circa un giorno per ricreare l'indice. Le prestazioni di query sono abbastanza buona.
Il problema è che la dimensione pianificata per il database di destinazione sarà oltre 4 TB per esami con un insieme di dati più piccolo di 400 GB che rappresenta circa il 10% del totale bersaglio. Una volta caricata in Postgres, più del 50% della memoria viene purtroppo utilizzata dall'indice SQL sulla colonna hash.
Questo è troppo grande. E sento che la ridondanza di hash è un'opportunità per la memorizzazione di meno.
Si noti inoltre che mentre questo descrive il problema, ci sono alcune di queste tabelle che deve essere creato.
Soluzione
Si potrebbe creare una tabella con solo id e Hash, e il vostro altri dati con l'indice, metadati, e Hashid. In questo modo, è possibile impedire a scrivere lo stesso hash fino a 100k volte nella tabella.