Sfondo
Un database locale contiene circa 1,3 miliardi di righe univoche. Ogni riga è indirettamente associata a una specifica latitudine e longitudine (posizione). Ogni riga ha un timbro data.
Usa caso
Il problema è il seguente:
- L'utente imposta una data di inizio / fine e un intervallo di valori (ad es. da 100 a 105).
- Il sistema raccoglie tutte le righe che corrispondono alla data specificata, raggruppate per posizione.
- Il sistema esegue determina le posizioni che, durante tali date, hanno una probabilità statistica di rientrare nell'intervallo di valori specificato.
- Il sistema visualizza tutte le posizioni corrispondenti all'utente.
Questo è un problema di velocità e scala.
Domanda
Qual è l'architettura di soluzione meno costosa che si possa immaginare per consentire a un sistema di questo tipo di recuperare i risultati per gli utenti in meno di cinque secondi?
Sistema corrente
L'ambiente è attualmente:
- PostgreSQL 8.4 (l'aggiornamento è possibile, il cambio di 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 si trovano in una tabella simile a:
id | taken | location_id | category | value1 | value2 | value3
- id - Chiave primaria
- preso - Data assegnata alla riga
- location_id - Riferimento alla latitudine / longitudine
- categoria - Una descrizione dei dati
- value1 .. 3 - Gli altri valori che l'utente può interrogare
La colonna taken
è in genere date consecutive per location_id
, a volte ogni posizione contiene dati dal 1800 al 2010 (circa 77.000 date, molte delle quali duplicate in quanto ogni posizione contiene dati nello stesso intervallo di date).
Esistono sette categorie e le tabelle sono già divise per categoria (utilizzando tabelle secondarie). 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 città specifica significa trovare i confini della città, che non è un compito banale.
Idee
Alcune idee che ho incluso:
- Trova un servizio cloud per ospitare il database.
- Crea una striscia raid SSD (ottimo video).
- Crea una tabella che amalgami tutte le località per città (pre-calcolo).
Grazie!