sfondo
Un database locale contiene quasi 1,3 miliardi di righe univoche. Ogni riga è indirettamente associata a una specifica latitudine e longitudine (posizione). Ogni riga ha un timbro data.
Caso d'uso
Il problema è il seguente:
- L'utente imposta una data di inizio / fine e un intervallo di valori (ad esempio, da 100 a 105).
- Il sistema raccoglie tutte le righe corrispondenti alla data specificata, raggruppate per posizione.
- Il sistema esegue determina le posizioni che, durante tali date, hanno una probabilità statistica di cadere nell'intervallo di valori indicato.
- Il sistema visualizza tutte le posizioni corrispondenti all'utente.
Questo è un problema di velocità e scala.
Domanda
Qual è l'architettura della soluzione meno costosa che puoi immaginare che consentirebbe a un tale sistema di recuperare risultati per gli utenti in meno di cinque secondi?
Sistema corrente
L'ambiente è attualmente:
- PostgreSQL 8.4 (l'aggiornamento è possibile; la commutazione dei database non è un'opzione)
- R e PL / R
- XFS
- WD VelociRaptor
- 8 GB di RAM (Corsair G.Skill; 1.3 GHz)
- Quad core GenuineIntel 7 (2,8 GHz)
- Ubuntu 10.10
Gli aggiornamenti hardware sono accettabili.
Aggiornamento - Struttura del database
I miliardi di righe sono in una tabella simile a:
id | taken | location_id | category | value1 | value2 | value3
- id: chiave primaria
- presa: data assegnata alla riga
- location_id - Riferimento alla latitudine / longitudine
- categoria - Una descrizione dei dati
- value1 .. 3 - Gli altri valori su cui l'utente può interrogare
La taken
colonna è in genere date consecutive per location_id
, a volte ogni posizione ha dati dal 1800 al 2010 (circa 77.000 date, molte delle quali duplicate poiché ogni posizione ha dati nello stesso intervallo di date).
Esistono sette categorie e le tabelle sono già suddivise per categoria (utilizzando le tabelle figlio). Ogni categoria contiene ~ 190 milioni di righe. Nel prossimo futuro, il numero di righe per categoria supererà il miliardo.
Ci sono circa 20.000 località e 70.000 città. Le posizioni sono correlate alla città per latitudine e longitudine. Assegnare ogni posizione a una particolare città significa trovare i confini della città, il che non è un compito banale.
idee
Alcune idee che ho includono:
- Trova un servizio cloud per ospitare il database.
- Crea una striscia raid SSD (ottimo video).
- Crea una tabella che riunisce tutte le posizioni per città (pre-calcolo).
Grazie!